新規投稿はできません。

初心者のための R および RjpWiki に関する質問コーナー

過去の記事のアーカイブ



緯度経度から距離の換算

きむ? (2011-01-07 (金) 18:12:19)

いつも参考にさせていただいています。
現在、緯度経度で座標が指定されている地域標準メッシュ(3次メッシュ)の座標をある地点を基準としたx,y座標に換算しようとしています。
そこで、RjpWikiの、「RでGPS」を参考にlibrary(sp)のspDistsN1という関数を用いて距離を出そうとしているですがうまくいきません。

library(sp)
ll <- matrix(c(34, 34, 138, 139), ncol=2)
km <- spDistsN1(ll, ll[1,], longlat=T)
sum(zapsmall(km))

とすると110.96kmとなりますが正確には92.38kmが正?また、

library(sp)
ll <- matrix(c(34, 35, 139, 139), ncol=2)
km <- spDistsN1(ll, ll[1,], longlat=T)
sum(zapsmall(km))

とすると結果が0になってしまいます。使用方法に誤りがあるのだと思いますがhelp等でも良くわかりません。すみませんが使用方法をご指導ください。
また、今のところ上記関数を用いて基準点からの距離で各メッシュの座標を設定しようとしていますが、直接緯度経度をx,y座標(平面直角座標系)に変換できる関数等がありましたら教えていただけると助かります。基本的な質問で恐縮ですがよろしくお願いいたします。

  • 「結果が0になる」という部分のみにコメント。
    0 には,なりませんけど?
    > library(sp)
    > ll <- matrix(c(34, 35, 139, 139), ncol=2)
    > km <- spDistsN1(ll, ll[1,], longlat=T)
    > sum(zapsmall(km))
    [1] 84.13467
    > ll
         [,1] [,2]
    [1,]   34  139
    [2,]   35  139
    > km
    [1]  0.00000 84.13467
    > zapsmall(km)
    [1]  0.00000 84.13467
    > sum(zapsmall(km))
    [1] 84.13467
    どうなっているんでしょうね。 -- 河童の屁は,河童にあらず,屁である。? 2011-01-07 (金) 19:04:12
  • 「緯度 経度 距離 計算」でググって,「地球上の2地点間の距離-高精度計算サイト」(カシオ)を発見しましたよ。それを使うと最初の2地点間の距離は 92.287647km になりました。下の方に2地点の経度と緯度のデータから距離を求める計算式が書かれていますねえ。どの程度高精度かは私にはわかりませんが,このサイトは色々なところで有名ですよね。
    国土地理院の計算式には,「緯度経度から平面直角座標x,yおよび子午線収差を求める計算」などという,素人にはよくわからない計算の計算式が示されていますね。 -- 河童の屁は,河童にあらず,屁である。? 2011-01-07 (金) 19:44:15
  • spパッケージでは、WGS84を使っていますね。測地系と楕円体をどう考えているのでしょうか。それと高度まで考えるとどうかということですね。そのあたりを理解してからRやソフトを利用した方が宜しいのではないかと思うのですが、これもPCやRが普及した弊害なのでしょうか。 -- ooki? 2011-01-08 (土) 11:53:58
  • 河童の屁は,河童にあらず,屁である様、ooki様コメントありがとうございます。河童様、ご指摘のとおり家の環境(ver2.9.2)では84.13467になりました。ただし教えていただいたサイトによると92.299kmとなり値に差があります。。使用方法に誤りがあるのでしょうか。。 -- きむ? 2011-01-10 (月) 00:28:46
  • 「緯度経度をx,y座標(平面直角座標系)に変換できる関数」はspTransform関数です。SpatialPoints?クラスを作成してから変換するとよいでしょう。いろいろ誤解をされているので、Webで断片的な情報を集めるのではなく、Rogerの本など成書をあたられた方がよいと思います。 -- 谷村 2011-01-10 (月) 05:48:18
  • 谷村先生、コメントありがとうございました。値が異なるのはspがWGS84で日本の世界測地系がGSR80だから?でもこんなに差がでる?? いずれにしても現時点ではGIS初心者のためRの利用は難しそうです。空間解析をばりばりしたいということではなく単にhttp://vldb.gsi.go.jp/sokuchi/surveycalc/bl2stf.htmlをRで計算したかっただけなのですが、、、 先生の本「地理空間データ分析 (Rで学ぶデータサイエンス 7) 」を見てまた勉強します。ありがとうござました。 -- きむ? 2011-01-10 (月) 13:49:40
  • 取り急ぎ、1点だけ反応します。東経139度、北緯34-35度の距離を地球上の2地点間の距離-高精度計算サイトで計算すると111.319491kmになりました。また、測量計算(距離と方位角の計算)で計算すると110,931.460(m)(GRS80)になりました。spDists()で計算すると110.8055kmになりました。84kmは経度と緯度を逆にしたときの結果だと思います。92kmがどこから出てきた数値なのか理解しかねます。もう一度確認されたらいかがでしょうか。 -- 谷村 2011-01-11 (火) 11:17:23
  • 谷村先生、コメントありがとうございます。ご指摘のとおり4つ目の黒ポチの92.299kmは誤りのようです。すみません。ややこしくなったので整理します。
    東経139度、北緯34-35度の距離を出す場合(当初質問の2番目のケース)、測量計算で110.93kmとなるのに対して、spDists()で110.85kmになりました。ただし、ご指摘のとおりRjpWikiの、「RでGPS」の入力順と逆に入力しました(経度-緯度)。
    > library(sp)
    > ll <- matrix(c(139, 139, 34, 35), ncol=2)
    > km <- spDistsN1(ll, ll[1,], longlat=T)
    > sum(zapsmall(km))
    [1] 110.8055
    なおRのバージョンは2.10.1であり、これを緯度-経度で入力すると結果が0になります。(ver2.9.2では河童様の結果のように84.13km)
    > library(sp)
    > ll <- matrix(c(34, 35, 139, 139), ncol=2)
    > km <- spDistsN1(ll, ll[1,], longlat=T)
    > sum(zapsmall(km))
    [1] 0
    次に東経138-139度、北緯34度の距離を出す場合(当初質問の1番目のケース)、測量計算で92.38kmとなるのに対して、経度-緯度で入力すると値が0となります。(逆に緯度-経度で入力すると110.96km)。
    > library(sp)
    > ll <- matrix(c(138, 139, 34, 34), ncol=2)
    > km <- spDistsN1(ll, ll[1,], longlat=T)
    > sum(zapsmall(km))
    [1] 0
  • きむ? 2011-01-11 (火) 16:32:27
  • こちらはR version 2.12.1です。上記の結果が0になるとおっしゃる現象はこちらで再現できないのでご容赦ください。また、東経138-139度、北緯34度はspDistsN1()またはspDists()で92.38443kmとなっています。きむさんの環境でなぜうまくいかないのか、私には分からないので、これ以上助言することはできません。しかし、まず、なぜzapsmall()を使うのか、なぜsumを使うのか、あたりから再考されてはいかがでしょうか。また、経度緯度のメッシュをxy座標に落とすことは、(1)経度緯度の座標行列を作る、(2)coordinates()でSpatialPoints?クラスに変換、(3)spTransform()でxy座標に変換、(4)coordinates() で座標を行列として取り出す、の手順を踏むことになります。4行程度の話です。 -- 谷村 2011-01-11 (火) 18:32:58
  • 谷村先生、丁寧な回答ありがとうございます。いろいろやった結果verの問題のようですみません。最新verで試してみます。zapsmall()やsumは見本としたコマンドをそのまま使用したのみで、、こだわりはありません。 また、座標変換の方法についてもイメージできました。お忙しいところありがとうございました! -- きむ? 2011-01-11 (火) 19:09:11
  • お知らせ>RでGPSでspDistsN1()の引数が逆になっている件は、確認次第訂正いたします。ご迷惑をおかけしました。 -- okinawa 2011-01-12 (水) 08:49:11
  • R version 2.10.1 (2009-12-14)winで実行しみましたが、結果が0とはなりませんでした。(138, 139, 34, 34)で、92.38443になり、(34, 35, 139, 139)で 84.13467となりました。Rのバージョンの問題でもないようです。経度緯度もめちゃくちゃに使っていますね。海上を使ったりしていますから、基本を理解しているのでしょうか。 -- 2011-01-13 (木) 16:43:44
  • 名無し様、当方のverでチェックいただきありがとうございました。いろいろ試して見た結果、パッケージspをCRANより再インストールしたところ各々92.38km、110.81kmと計算することができました(経度緯度が正のようです)。なお、ご指摘のとおり例は再現例ということで適当な値となっていました。基本ができておらずご迷惑をおかけしました。 -- きむ? 2011-01-14 (金) 19:56:13
  • spDists()やspDistsN1()のヘルプであるspDistsN1.Rdに、引数における経度緯度の順番を加えて欲しいとRoger Bivand教授にお願いしてみたところ、即応していただきました。CSV版のspDistsN1.Rdを参照してください。これで今回のような混乱はなくなると思います。 -- 谷村 2011-01-17 (月) 10:15:08
  • 谷村先生、重ねてご配慮いただき大変ありがとうございました。もちろん、当方でも入力順を入れ替えて値のチェックはしていたのですが、たまたま?パッケージの不具合によりわけがわからなくなってしまいました。でもこれで確実ですね。今回、基本ができてないと指摘されて少々へこみましたが、、これにこりずにRを使っていきたいと思います。ありがとうございました! -- きむ? 2011-01-18 (火) 10:50:06

出力の一部をクリップボードにコピーして利用したい。

yamada? (2011-01-07 (金) 13:46:05)

表のような結果をsink(),print()でテキストファイルに出力しています。実際にクリップボードに格納したいのは、一列目の行ラベルを除いた、jp,hk,usの列だけですが、テキストファイルで範囲選択をすると、行ラベルを含んでしまいます。現在は、エクセルでスペース区切りを指定して開いていますが、スペース区切り等開くまでの操作が手間です。そこで、行ラベルを出力しないか、あるいは、行ラベル付きのデータで行ラベル除いて出力する方法はないでしょうか。

               jp            uk            us
1    -3.030863e-02 -2.523841e-02 -4.387615e-03
2    -1.594305e-02 -1.853893e-02 -1.499784e-02
3     9.720749e-03  8.167201e-03  1.648989e-02
4    -1.138466e-02  5.133008e-03  1.188763e-03
  • 話は簡単なのです。あなたがデータフレームを使っているなら,print(データフレーム, row.names=FALSE) のようにするだけ。
    もし行列の場合にも同じようなことをやりたければ,print(data.frame(行列), row.names=FALSE) とする。
    基本は,「オンラインヘルプを読みましょう」ということです。 -- 河童の屁は,河童にあらず,屁である。? 2011-01-07 (金) 16:02:25
  • ありがとうございました。Rをインストールした後、ヘルプの項目をクリックすると、 「コンソール」から始まって「Rについて」までありますが、オンラインヘルプはどの項目でしょうか。 また、上のようなことを調べたいときにどのような質問を入力すればよいのでしょうか。 宜しくお願いします。 -- yamada? 2011-01-12 (水) 14:29:51
  • オンラインヘルプという用語が通じなかったかも知れませんが,関数のヘルプを見るには,普通は,help(print) や,その省略形である ? print のようにして見ることのできる「ヘルプページ」のことを指したつもりです(R の本などには,最初の方に,オンラインヘルプを参照するにはどうするかについてかならず書いてあると思いますけど)。
    ファイルメニューのヘルプをクリックした場合には,そのウインドウに検索フィールドがあるかと思いますので(Windows にもあったと思うけど),そこに調べたい関数名を入力すると,その関数のオンラインヘルプが表示されると思うのでしょうが,どうでしょうか?
    なお,R では例えば,単に print という関数でも,関数の引数がどのようなものであるかによって実際に適用される関数が異なります。実際にどの関数が適用されるかは methods(print) のようにしてどの関数が適用されるかを特定(推定)して,例えば,? print.ts とか ? print.data.frame とかを調べる必要もあります。デフォルトの ? print によって,関連する print.* へのリンクが示されることもあるでしょうけど(print のヘルプでは print.default しか言及がありませんけどね)。
    「そんなこと,今まで読んだどの資料にも書いてなかった」ということでもあるでしょうが,世の中ってそういうものです。
    ところで,あなたが本当にやりたいことはどういうことなんでしょうか。
    > sink(),print()でテキストファイルに出力しています
    ということからみれば,write.table(データフレーム, ファイル名, row.names=FALSE) の方がよいでしょう(これは,別のコメンテーターが既に提起した解決策ですよ。ああだ,こうだやっているうちに,コメンテーター自ら削除されてしまったので今は残っていないのだけど)。
    「実際にクリップボードに格納したいのは」ということは,コンソールに表示したものをクリップボードにコピーする事だろうということだろうと解釈したので,print(データフレーム, row.names=false) によって,コンソールに表示して,それをコピーしてどこかにペーストするというようなことだろうということで提案したのであってですね。
    > このページに掲載されている情報に関する責任はすべてページ作成者あるいは投稿者にあり、Wiki管理者とは一切関係ありません。
    ということで。 -- 河童の屁は,河童にあらず,屁である。? 2011-01-14 (金) 21:37:33

read.csv で読み込んだデータの積集合をとりたい

tadashi? (2011-01-05 (水) 15:08:35)

やりたいことは、1列しかないCSVファイルを2つ読み込んで、共通部分を出力したいのです。できるだけ簡単に行う方法はあるでしょうか?
read.cvs で読み込むと下記のようにうまくいきません。
CSVから、データの作り方がうまくないのだと思いますが、どのコマンドを使えばいいのかがわかりません。

> a <- read.csv('temp.1', header=FALSE)
> b <- read.csv('temp.2', header=FALSE)
> a
  V1
1  1
2  2
3  3
> b
  V1
1  3
2  4
3  5
> intersect(a, b)
data frame with 0 columns and 0 rows
  • intersect の引数が何であるべきか調べましょう。つまり,この場合は intersect(a$V1, b$V1) または intersect(a[,1], b[,1]) とすべきなのです。
    scan で入力するとすれば,もっと簡単になる。intersect(scan("temp.1"), scan("temp.2")) とか。 -- 河童の屁は,河童にあらず,屁である。? 2011-01-05 (水) 15:16:01
  • データ形式の指定がベクトルという意味がよくわかっていませんでした。ありがとうございます。 -- tadashi? 2011-01-05 (水) 16:14:33

パッケージVARの関数restrictの計算精度

松代? (2010-12-31 (金) 14:08:35)

グレンジャー因果性の検定量をrestrictで制約した残差と制約無し残差を使って計算すると、教科書の計算結果(Eview)やエクセルの計算結果と大幅な違いが出ました。原因は制約付残差の違いでした。restrictの計算精度は悪いのでしょうか。

  • > 教科書の計算結果(Eview)やエクセルの計算結果と大幅な違いが出ました。原因は制約付残差の違いでした。restrictの計算精度は悪いのでしょうか。
    Eview や Excel の結果の方が正しいのならば,restrict の計算精度が悪いのは明らかでしょう。
    restrict での計算結果が思わしくないのが,関数の使い方が不適切なためかどうかということならば,あなたが使ったプログラムとデータ,および,Eview や Excel での結果を共に提示しないと,何ともコメントできないです。 -- 河童の屁は,河童にあらず,屁である。? 2010-12-31 (金) 15:50:34
  • 私の説明不足でした。パッケージVARの利用経験者の感想を聞きたかったのです。追加の質問です。自分でコードを書くのは大変なので既存のパケージを使いたいが、その正確さの保証は無い。このジレンマの解決方法はあるのでしょうか。当面はパッケージVARが私にとって課題です。例えばパケージごとにユーザーのフォーラムがあってそこで評判をみることができるでしょうか。EveiwやSプラスなど有料ソフトを使えばこの悩みは解決しますが資金がないもので…。 -- 松代? 2010-12-31 (金) 18:57:44
  • > パッケージVARの利用経験者の感想を聞きたかったのです
    感想なんか不要でしょう。
    必要なのは,得られる結果が正確なのかどうなのかではないですか。
    あなたは,R の restrict の結果が不適切(不正確)だと判定したわけで,それはそれなりの根拠(他の結果と比べて精度が低い)で判定したわけですから,精度が低いのでしょう。
    もし,問われるとすれば,あなたの判定の根拠が正しいかどうかであって,そのためにはもう少し詳しい状況説明が必要ではないでしょうかということです。
    そのような状況説明も不要なほど R の resctrict がだめだというなら,それまでのことでしょう。はいはい,おっしゃるとおり,R はだめですね,と。
    > EveiwやSプラスなど有料ソフトを使えばこの悩みは解決しますが
    というのは,どうなんでしょうか。
    お金を払えば正確無蜷なものが得られるというのは幻想かも知れませんよね。いや,幻想に過ぎません。
    お金を払わねばならないソフトが間違えていて,そうではないソフトはそうではない(当然,逆もあるわけですが) ということは,枚挙にいとまがないわけですわ。
    意思決定にああだこうだはないと思いますけどね。有償ソフトは信頼できるけど,無償ソフトは信頼できないとはなから思われてしまうことは,残念なことです。
    もっとも,あなたの今の環境は R 以外の「信頼できる」ソフトを使えるようなので,あえて R の結果を引用する必要なんかはないでしょうと言うことに過ぎるのではないでしょうか。
    > 例えばパケージごとにユーザーのフォーラムがあってそこで評判をみることができるでしょうか そういうのがあるかどうかは私は知りませんが,おそらくはないでしょう。あなた自身そういうフォーラムなりページなりを作るとほかの人の役に立つことこの上なしということでしょう。
    要するに,話を明確にするためには,
    このようなデータを R と その他のソフトで解析した結果はこのようになって,R で解析した結果は他のソフトで解析した結果と比べて,明らかにおかしいと思うのですが,どうでしょうか?という問いかけをすることなんですよね。
    漠然と問いかけされても,答えようがありませんよね。
    議論は,事実に基づいてなされるべきですよね。
    R が信頼できないなあという状況で,R を採用するのは避けた方が良いですね(信頼したいからその根拠を求めているということではあるでしょうが,その段階は弱い。他から攻撃されたら,防御できない。防御できたとしても弱い。防御しきれない。ならば,R を捨てる方が最良の戦略) -- 河童の屁は,河童にあらず,屁である。? 2010-12-31 (金) 20:12:01
  • パッケージ経験者の評価サイトがありました。http://crantastic.org/ -- 松代? 2011-01-01 (土) 09:05:31

初級Q&A アーカイブ(6)クラスター図を横向きの応用方法

hashi? (2010-12-30 (木) 17:22:31)

いつもお世話になっております。
デンドログラムの回転方法ですが、青木先生著「Rによる統計解析」P230、図6.26を「初級Q&A アーカイブ(6)クラスター図を横向きで描画したい」の方法、horiz = T を前項のスクリプトのどの場所に挿入すれば回転したデンドログラムが表現できるのでしょうか。以下前項のスクリプトです。

set.seed(123)
x <- round(matrix(rnorm(100), ncol=5), 3)
d <- dist(x)
ans <- hclust(d^2, method="ward")
pdf("cluster.pdf", height=375/72, width=500/72)
plot(ans, hang=-1)
dev.off()

hang=-1の後ろに書き加え計算すると、

"horiz"はグラフィックスパラメータではありません

とメッセージが出ます。

  • さてはて。例題があるのだから,それぞれの関数が何を意味しているかをよくよく考察する必要があるように思われる。
    > hc <- hclust(dist(USArrests)^2, "cen")
    > par(mar = c(4,1,1,7))
    > plot(as.dendrogram(hc), horiz = T)
    は,ちゃんと動くのだから,
    set.seed(123)
    x <- round(matrix(rnorm(100), ncol=5), 3)
    d <- dist(x)
    ans <- hclust(d^2, method="ward")
    pdf("cluster.pdf", height=375/72, width=500/72)
    plot(as.dendrogram(ans), horiz=TRUE) # @@@ ここをこのように変更する
    dev.off()
    ということでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2010-12-30 (木) 17:35:14
  • 河童の屁は,河童にあらず,屁である。さん、ありがとうございました。なるほど共通するところに目を向けていくわけですね。 -- hashi? 2010-12-30 (木) 18:17:36

mvpartパッケージで情報量エントロピーを使いたい

akira? (2010-12-30 (木) 14:20:04)

いつもありがとうございます.
mvpartパッケージのrpart関数について質問です.
ヘルプを見ると、分岐指標に"gini"と"information"を選べるような記載がありますが、引数"parms"を変更しても結果が変わらないように思います.
同志社大の金先生のHPには、引数"split"とありますが、rpart関数、rpart.control関数は引数"split"を持たないようです.
一方、rpartのコード(40〜63行目ぐらいと思っていますが…)ではparmsが規定しているように見えます.
ご存知の方、いらっしゃいませんか?

  • For classification splitting, the list can contain any of: the vector of prior probabilities (component prior), the loss matrix (component loss) or the splitting index (component split). ということです。parms は list で,その要素に prior, loss, split の 3 要素をもつので,parms=list(prior=c(.65,.35), split='information') のように指定することになり,それを,金先生は 「分岐基準エントロピーの指定は、引数split="information"を用いる。」と書いたのでしょう。 実際にやってみると,ちゃんと違いがあるようですけど? -- 河童の屁は,河童にあらず,屁である。? 2010-12-30 (木) 15:46:51
    > library(rpart)
    # @@@ information を使用
    > fit <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosis,
    +  parms=list(split='information'))
    > fit2 <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosis,
    +  parms=list(split='gini'))
    > 
    > library(rpart)
    > fit <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosis,
    +  parms=list(split='information'))
    > fit
    n= 81 
    
    node), split, n, loss, yval, (yprob)
          * denotes terminal node
    
     1) root 81 17 absent (0.79012346 0.20987654)  
       2) Start>=12.5 46  2 absent (0.95652174 0.04347826) *
       3) Start< 12.5 35 15 absent (0.57142857 0.42857143)  
         6) Age< 34.5 10  1 absent (0.90000000 0.10000000) *
         7) Age>=34.5 25 11 present (0.44000000 0.56000000)  
          14) Number< 4.5 12  5 absent (0.58333333 0.41666667) *
          15) Number>=4.5 13  4 present (0.30769231 0.69230769) *
    # @@@ gini を使用(デフォルト)
    > fit2 <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosis,
    +  parms=list(split='gini'))
    > fit2
    n= 81 
    
    node), split, n, loss, yval, (yprob)
          * denotes terminal node
    
     1) root 81 17 absent (0.7901235 0.2098765)  
       2) Start>=8.5 62  6 absent (0.9032258 0.0967742)  
         4) Start>=14.5 29  0 absent (1.0000000 0.0000000) *
         5) Start< 14.5 33  6 absent (0.8181818 0.1818182)  
          10) Age< 55 12  0 absent (1.0000000 0.0000000) *
          11) Age>=55 21  6 absent (0.7142857 0.2857143)  
            22) Age>=111 14  2 absent (0.8571429 0.1428571) *
            23) Age< 111 7  3 present (0.4285714 0.5714286) *
       3) Start< 8.5 19  8 present (0.4210526 0.5789474) *
  • なるほど、ありがとうございます。 -- akira? 2010-12-30 (木) 16:12:41

$ operator

松代? (2010-12-28 (火) 15:54:34)

パッケージVARSを使うために解説書どおりに以下のコマンドを打ち込みましたが、最後コマンドの後に“以下にエラー Canada$e : $ operator is invalid for atomic vectors”という警告が出ました。対応策をご存じの方教えてください。

> library(vars)
> data(Canada)
> layout(matrix(1:4, nrow = 2, ncol = 2))
> plot.ts(Canada$e, main = "Employment", ylab = "", xlab = "")
  • Canada は "mts", "ts" クラスのオブジェクトなので,$ は使えません。Canada[,1] か Canada[, "e"] としてください。 -- 河童の屁は,河童にあらず,屁である。? 2010-12-28 (火) 16:42:38
  • うまくいきました。ありがというございました。私が参考にしたのは公式の解説書だとおもうのですが、公式でも間違いはあるのですね。”http://rss.acs.unt.edu/Rdoc/library/vars/doc/vars.pdf” -- 松代? 2010-12-28 (火) 16:51:18
  • その文書中に Canada$e のような用例は見つかりませんが? -- 河童の屁は,河童にあらず,屁である。? 2010-12-28 (火) 17:02:17
  • あるけど -- 通りすがり? 2010-12-29 (水) 09:50:41
  • 大急ぎで通り過ぎたのかぶっきらぼうなこと(^_^;) 「通りすがり」さんはもう見ることもないかも知れないので,原質問者に追加コメントしておきます。
    なるほど,「その文書」には確かに書いてありますね。しかしその文書は「古すぎる」。文書作成の日付は September 9, 2007 だから,R 2.5 か R 2.6 あたりですね。
    http://rss.acs.unt.edu/... は公式というよりは,個人が管理するサーバーのようで,メンテナンスが悪い。
    現行の R (R 2.12.1) で,library(help=vars) をやると,その最後に,
    これ以上の情報はディレクトリ
    '/Library/Frameworks/R.framework/Versions/2.12/Resources/library/vars/doc'
    にある以下のビニエット中にあります:
    
    vars: VAR, SVAR and SVEC models (source, pdf)
    いずれにせよ「現行の文書中にはない」。私は,新しい文書を見ているので,古い文書に間違った(当時は正しかったのだろう)情報が書いてあるかもしれないという認識はなかった。
    公式のものであっても,パッケージの機能(関数)の更新があるのだから,解説文書も最新のものを参照すべきであるということもお忘れなく。 -- 河童の屁は,河童にあらず,屁である。? 2010-12-29 (水) 12:21:47
  • 「河童の屁は,河童にあらず,屁である」さん、ありがとうございました。とても勉強になりました。最新の解説書の所在もわかりました。他のパッケージを利用するときも役に立ちます。ご教示下さったご親切に感謝いたします。 -- 松代? 2010-12-29 (水) 17:44:40

Windows7+R64 2.12.1でパッケージadaptをインストールできません。

松代? (2010-12-25 (土) 00:07:03)

Windows7+R64 2.12.1でパッケージadaptをインストールできません。解決方法をご教示ください。

> install.packages("adapt")~
パッケージを ‘C:\Users\fujimot\Documents/R/win-library/2.12’ 中にインストールします 
(‘lib’ が指定されていないので) 
--- このセッションで使うために、CRANのミラーサイトを選んでください --- 
警告メッセージ: 
In getDependencies(pkgs, dependencies, available, lib) :
 package ‘adapt’ is not available
  • CRANには、Package ‘adapt’ was removed from the CRAN repository.って書いてありますが。 -- 2010-12-25 (土) 01:39:49
  • 知りませんでした。「データ解析Rの基本技」を勉強中で本通りにやるのに一生懸命でそこまで気が回りませんでした。ありがとうございました。 -- 松代? 2010-12-25 (土) 10:24:03
  • 多変量関数の積分のためのパッケージ「adapt」が最近アップデートがなされなくなったようです。その代わりに、パッケージ「cubature」の関数 adaptIntegrate() が登場しております。 -- 著者? 2010-12-25 (土) 18:54:49
    install.packages("cubature",dep=T) # インストール
    library(cubature)                  # パッケージの呼び出し
    ?adaptIntegrate                    # 関数のヘルプ
    
    f <- function(x) cos(x)            # 1変数関数の場合
    adaptIntegrate(f, 0, pi/2)
    
    g <- function(x) {                 # 2変数関数の場合
      exp(-(x[1]^2+x[2]^2)/2)/(2*pi)
    }
    adaptIntegrate(g, c(-3, -3), c(3, 3))

tapply関数について

ランゲル・ハンス? (2010-12-21 (火) 09:00:38)

いつも掲示板を参考にさせていただいております。
以前も同じような質問をさせていただいたので、大変恐縮です。
NとMを10区間に区切って、その区間内に入るdの合計と平均を求めたいと思います。
下記の例(results1,results2)ではいくつかNAが出ます。NAを0として計算する方法を教えていただけないでしょうか?
最終的には区間にすべて色の入るlevelplotを作図したいと考えています。

N <- c(0, 1, 3, 7, 12, 20, 30, 45, 50, 81) 
M <- c(10, 20, 40, 60, 65, 75, 90, 95, 98, 100)
d <- runif(10, 0, 10)
data <- data.frame(cbind(N, M, d))

by1 <- cut(data$N, seq(0, 100, 10), right=TRUE, include.lowest=TRUE)
by2 <- cut(data$M, seq(0, 100, 10), right=TRUE, include.lowest=TRUE)

results1 <- cbind(tapply(data$d, list(by1, by2), sum))
results2 <- cbind(tapply(data$d, list(by1, by2), mean))
results1
results2

library(lattice)
levelplot(results1)
levelplot(results2)

どうぞよろしくお願いいたします。

  • tapply の後で,results1[is.na(results1)] <- 0 とすればよいだけでしょう?
    データの中に NA があるために sum や mean の結果が NA になるというような場合には,tapply(data$d, list(by1, by2), sum, na.rm=TRUE) とします。 なお,tapply の結果を cbind する必要はありません。 -- 河童の屁は,河童にあらず,屁である。? 2010-12-21 (火) 09:44:22
  • 河童さま 早速コメントありがとうございました。 -- ランゲル・ハンス? 2010-12-21 (火) 11:53:11
  • 世の中には親切な人がいるもんだ.rユーザーには性格がいい人が多い気がする -- 独り言? 2010-12-21 (火) 16:27:55

特定の値が連続して出現する回数の最大値を計算

なつ? (2010-12-20 (月) 22:13:28)

Rを使って,特定の値が連続して出現する回数の最大値を計算する方法を探しています。
例えば,特定の値=1としまして,

a <- c(0, 1, 1, 1, 0, 0, 1, 1)
b <- c(1, 1, 1, 1, 1, 0, 1, 0)

という2つのオブジェクトがあるとします。
この場合,aからは3,bからは5という値を計算したいということです。

何か良い方法がありましたら,教えて頂ければ幸いです。
初歩的な質問で申し訳ありませんが,よろしくお願いいたします。

  • 汚すぎ? -- きよしこ? 2010-12-20 (月) 22:58:01
    max(diff(c(0, which(b != 1), length(b)+1))-1)
  • あるいはこういうの。 do.call(function(lengths, values) max(lengths[values == 1]), rle(a)) -- 2010-12-20 (月) 23:20:51
  • こっちの方が分かりやすいかな。 max(subset(as.data.frame.list(rle(a)), values == 1)$length) -- 2010-12-20 (月) 23:25:23
  • 皆さま,さっそくありがとうございます。やっぱりRって便利ですね。短いスクリプトで書けるはずとはおもっていましたが。まだまだ知らない関数ばかりでべんきょうになります。とりあえず,"max(subset(as.data.frame.list(rle(a)), values==1)$length) "が分かりやすかったですので,これを使うようにしようかなと思います。ありがとうございました! -- なつ? 2010-12-20 (月) 23:38:16
  • 度々すみません。ちなみに,ある値以上の値が連続して出現する回数となると(例えば,0から1までの連続な数がオブジェクトaに入っており,0.5以上の値が連続する回数を計算する),よい方法はありますでしょうか?この場合だとrleは使えなさそうです(もちろん,前述のオブジェクトaを事前にif関数等を使って,0か1といった整数に変えたオブジェクトを作ってしまえば問題はないのですが)。 -- なつ? 2010-12-20 (月) 23:52:43
  • rle を使ったやり方はよくわかりませんが,一番最初のごり押しスクリプトの場合,which(b != 1) の部分をお望みの条件に変えればいいですね.0.5 以上の値が連続する回数ならば, max(diff(c(0, which(b < 0.5),length(b)+1))-1) ですね. -- きよしこの? 2010-12-21 (火) 00:05:43
  • x が実数値ベクトルとすると x >= 0.5 は TRUE, FALSE (つまり 1,0) 列になりますから、やはり rle() が使えますよ。 -- 2010-12-21 (火) 00:16:00
  • これまたさっそくありがとうございます。>きよしこの様,お陰で,どういう計算をやっているのか,よく分かりました。ありがとうございます。>名無しさま 仰るとおりですね。単にrle(a)のところを,rle(a >= 0.5)とすれば良いのですね。大変勉強になりました。 -- なつ? 2010-12-21 (火) 00:37:46

少し高度なヒストグラム(か散布図)

yos? (2010-12-19 (日) 20:39:01)

よろしくおねがいします.

1分おきで1日(0~1440分)に計測された,ある値があります.
1列目が,時間(0,1,2,...,1440)
2列目が,その時間における値(10, 40, ..., 50)
3列目が,グループ(A, B, C)
これを,
X軸を,例えば1時間おきの24分割
Y軸を,A, B, Cの3分割
で,値の平均値をプロットしたいのですが,色々調べてもどうしても方法が分かりません.
ご教授いただけないでしょうか

  • データは?  x軸を時間(分刻み), y軸を値,グループは違う色で表す,とかの方がいいと思います。x軸もy軸も意味のない分割をしなくてよいので。 -- ソクトン? 2010-12-20 (月) 09:23:22
  • tapply を使い,結果を matplot で描画する。グループの区別は matplot の引数を活用する。 -- 河童の屁は,河童にあらず,屁である。? 2010-12-20 (月) 10:11:19
    set.seed(123)
    d <- data.frame(time=0:1440, value=rnorm(1441), group=sample(factor(LETTERS[1:3]), 1441, replace=TRUE))
    d$time2 <- d$time%/%60
    d$time2[d$time2 == 24] <- 23
    d$time2 <- factor(d$time2)
    matplot(tapply(d$value, list(d$time2, d$group), mean), type="l")
    matplot.png
  • 大変ありがとうございます。言葉足らずで大変申し訳ありません。データを人の数とすると、Y軸の5グループが、X軸をまっすぐ進み、1時間ごとの階級平均値で色分けしたい目的です。イメージとしては、5ピクセル*24ピクセルの画像データになります。お手数をおかけしまして申し訳ありません。よろしくお願い致します。 -- yos? 2010-12-20 (月) 15:14:28
  • それでは,matplot の代わりに,image を使えばよいかな。後半部分のみを示す。この場合も,image の引数を適切に設定すること。
    意図はともかく,見づらいグラフ。上のような折れ線の方が良く分かると思いますけどね。
    もっとも,作り付けの関数は,どこかに不満が出るものなので,自分でチョコチョコッとプログラムを書くのが吉。rect や grid を使えば簡単に描ける。
    tapply(d$value, list(d$time2, d$group), mean) の部分が主要部分なのだ。 -- 河童の屁は,河童にあらず,屁である。? 2010-12-20 (月) 15:45:16
    image(x=0:23, y=1:3, tapply(d$value, list(d$time2, d$group), mean), yaxt="n", ylab="", xlab="")
    axis(2, at=1:3, labels=LETTERS[1:3], pos=-0.5)
    image.png
  • ご対応いただき大変ありがとうございます.イメージ通りのグラフですが,さらに自分のデータにうまく合わせるよう頑張ってみます. -- yos? 2010-12-20 (月) 20:34:23
  • 良い方法が見つかったら,報告してください。

自由度調整済み決定相関係数の求め方

Kai? (2010-12-12 (日) 15:31:30)

こんにちは。
lm()でデータAの一次回帰式を求め、predict()でデータBを回帰します。

A_res <- lm(formula=Volume ~ Girth, data=trees) # データAの回帰結果
B <- trees+rnorm(dim(trees)[1]*dim(trees)[2]) # データBの作成
B_res <- predict(A_res, B$Girth) # データBの回帰

B_resの回帰結果から自由度調整済み決定相関係数を求めたいのですが、どのようにすればよいのでしょうか?
ヘルプファイルを読む限りではse.fitという引数が関係ありそうな気がしたのですが、そこから先がよくわかりませんでした。

Rは2.11.1, OSはMac 10.5.8です。宜しくお願いします。

  • > B_resの回帰結果から自由度調整済み決定相関係数を求めたいのですが
    そういうものは,自由度調整済み決定相関係数(「自由度調整済み決定係数」の間違いと思いますが)とは呼べないものです。 -- 河童の屁は,河童にあらず,屁である。? 2010-12-12 (日) 16:01:50
  • ご指摘の通り「自由度調整済み決定係数」の間違いでした。この場合はなんと呼ばれるのですか? -- Kai? 2010-12-12 (日) 16:24:30
  • 名前はないと思いますけど。そのようなものを一般的に使うことは少ないと思いますので。名前はともかくとして,どうしても計算したいということなら,通常の自由度調整済み決定係数の計算にならって計算すればよいでしょう。予測値が,別のデータセットにおける予測式によるものであるという点が違うだけですから。
    しかし,それが何を意味するか,他の人の理解を得られるものであるかは別です。あなたの分野で,そのような統計量が使われているなら別ですけど。 -- 河童の屁は,河童にあらず,屁である。? 2010-12-12 (日) 19:10:54
    > trees <- data.frame(Volume=c(56, 54, 33, 58, 49), Girth=c(62, 44, 37, 57, 50))
    > A_res <- lm(formula=Volume ~ Girth, data=trees)
    > B <- trees+rnorm(dim(trees)[1]*dim(trees)[2])
    > B_res <- predict(A_res, newdata=B) # 予測値
    > Se <- sum((B$Volume-B_res)^2) # 残差平方和
    > n <- nrow(B) # データ数
    > St <- var(B$Volume)*(n-1) # 全平方和
    > MSe <- Se/(n-2) # 残差の平均平方
    > MSt <- St/(n-1) # 全体の平均平方(不偏分散)
    > (CorrectedR2 <- 1-MSe/MSt) # 自由度調整済み決定係数という名前には当てはまらない,訳のわからない統計量
    [1] 0.3946343
  • 計算方法ありがとうございました。一般的には使われないものなのですか・・あるデータから作成した回帰式やモデルが、他のデータでどれくらい適合するかという評価指標は無いのでしょうか? -- Kai? 2010-12-12 (日) 20:35:03

igraphのインストールエラー

kouka? (2010-12-11 (土) 22:07:24)

R全くの初心者です。igraphのパッケージは下記のようにインストールされるのですが、

> utils:::menuInstallLocal()
パッケージ 'igraph' は無事に開封され、MD5 サムもチェックされました 

パッケージを読み込む際に、

> library(igraph)
 エラー:  パッケージ 'igraph' は 'arch=i386' に対してインストールされていません。

と表示されます。原因を教えていただけませんか?

  • あなたの環境がわからないのですけど。
    あなたの環境ではないパッケージをインストールしたとか?
    あなたの環境(sessionInfo() の結果)と,どのようにインストールしたかの詳細を述べれば,回答を付けてくれるウィザードがいるかもしれません(まあ,ウィザードなら,そんな情報は必要ないのでしょうけど)。 -- 河童の屁は,河童にあらず,屁である。? 2010-12-12 (日) 20:20:32
  • Rのバージョンをあげると解決しませんか?このヘルプが該当しませんか? -- akira? 2011-01-07 (金) 02:22:27

rep.aovとSPSS

YK? (2010-12-11 (土) 19:53:30)

はじめまして。
被験者間因子と被験者内因子を含む分散分析に関する質問です。
先日、中級Q&Aに投稿した内容ですが、初級Q&Aが適切ではないかというご指摘をいただき、こちらに再投稿します。
Rのaov、nlmeパッケージのlme、carパッケージのAnovaと岡田先生のrep.aovで同じ結果が得られるのですが、SPSSや桐木先生のWEBの結果と一致しません(SPSSと桐木先生の結果は一致します)。
下記にサンプルを示します。
P値はfactor1, factor2, timeの順に0.044, 0.441, 0.017となりますが、SPSSや桐木先生のWEBでは順に0.042, 0.397, 0.575となります。
ダミーの結果を加えて被験者内因子の水準を3にしてみても結果は一致しません。
他のサンプルデータでも結果が一致するときとしないときがあるようです。
SPSSはType IIIで計算していますが、R側でtype IIIを指定しても一致しません。
原因についてどなたかご教示いただけましたら幸いです。

ID <- factor(rep(c(1:32),2))
factor1 <- factor(c(0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 
1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 
0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 
0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0))
factor2 <- factor(c(0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 
0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 
0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 
0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0))
time <- factor(c(rep(1,32), rep(2,32)))
result <- c(102.56, 101.80, 123.72, 74.16, 34.12, 
61.52, 54.08, 115.08, 58.96, 60.24, 111.68, 122.20,
45.04, 104.84, 121.48, 125.20, 45.48, 217.00, 39.40,
157.48, 119.96, 65.80, 4.44, 39.40, 65.80, 90.20,
45.48, 117.72, 83.04, 156.40, 42.72, 110.92, 135.52,
22.60, 129.08, 127.76, 149.12, 69.92, 73.24, 97.12, 
114.92, 54.56, 170.08, 71.60, 179.96, 57.08, 199.88, 
126.48, 59.56, 120.40, 53.56, 127.12, 66.48, 75.24, 
268.64, 90.88, 102.48, 147.84, 116.84, 84.40, 147.84, 
138.76, 122.96, 120.04)
df <- data.frame(ID, factor1, factor2, time, result)

rep.aov(result ~ I(time) + B(factor1, factor2) + S(ID), df)
  • セルフレスです。解決しました -- YK? 2010-12-13 (月) 19:15:18 SPSSと結果が一致しなかった件ですが、 contrasts(factor1) <- "contr.Sum" として因子の対比を零和対比にすることによって carのAnova(type="III")でSPSSと一致するようになりました。 下記のページが参考になりました。 http://myowelt.blogspot.com/2008/05/obtaining-same-anova-results-in-r-as-in.html 投稿する前にもっとしっかりと調べておくべきでした。 お騒がせして申し訳ありません。

ネットワーク(sna)のグラフ描画(辺ごとの太さの調整)について

net? (2010-12-10 (金) 19:24:00)

R初心者です.
ネットワーク分析をして,ネットワーク図を描くときに,辺の太さを辺ごとに調整できるとされています.太さを与えるデータはベクトルでも隣接行列でもよいという解説がありました.
たとえば,重み付きグラフの隣接行列(たとえばwg)でグラフを描き,その重みに応じて各辺の太さを変えたい場合,辺の太さを指定するedge.lwdをつかって具体的にどのように表現したらいいでしょうか.
ちなみに,wgは作業ディレクトリにあるcsvファイルで,
wg<-as.matrix(read.csv("XXXXX(ファイル名)".csv))
で既に定義してあるとします.
私は,
gplot(wg,
edge.lwd = wg)
として,グラフを描こうとしたら,エラーで「使われていない引数があります」として,edge.lwd = wgがでてしまいました.

具体的なスクリプトを教えていただけたら幸いです.

  • 「具体的なスクリプトを教えていただけたら幸いです」ということなら,あなたこそ,ほかの人が追試できるように,あなたが実際に行った「完全な」(追試可能な)スクリプト(プログラム)を提示すべきでしょう。
    read.csv("XXXXX(ファイル名)".csv) なんていわれても,"XXXXX(ファイル名)".csvが どんなものかもわからないので追試できないし,例えそのファイルを提示されても,それが数万行のファイルなら(そんなときにはそれを提示するのも大変だろうが,提示されてもそれを自分でもやってみようとはよほど奇特な人でない限り)無理。
    コメントを求めようと思うなら,現象を再現できる適切な規模のテストデータを含めて提示するのが「お作法」だと思います。
    あなたの遭遇した状況を,ああでもあるか,こうでもあるかと,いろいろ想定して,エラーの原因を究明してくれる人はそんなに多くはないかも知れませんよということですけど。まあ,いるかもしれませんけどね。
    例えば,gplot についても,どのパッケージに入っているのかもわからないということで,その時点で「もういい」と判断する人もいるのでは?(もっとも,そのような人は相手にしないということなら何をかいわんや) -- 河童の屁は,河童にあらず,屁である。? 2010-12-10 (金) 21:43:38
  • snaパッケージのgplotのコードとしては間違っていません。read.csvでheader=FALSEとしているかが気になるところ。 -- 2010-12-11 (土) 13:24:07
  • 土曜日にコメント頂いた方へ ありがとうございました. もう一度試してみたら,以下のスクリプトでできました.headerはTRUEです. 質問をお送りした時のスクリプトと変更していないと思いますが,もしかしたら,=の前後のスペースなどに問題があったかもしれません. (もちろん,スペースなどをチェックして何回かやり直したのですが) -- net? 2010-12-13 (月) 11:42:50
    library(sna)
    wg <-as.matrix(read.csv("test.csv",header=TRUE))
    gplot(wg,
    edge.lwd = wg)
    test.csvのなかみ
    A,B,C,D,E,F
    0,8,0,0,0,0
    0,0,0,1,0,1
    0,6,0,0,0,0
    0,0,0,0,0,0
    0,0,0,0,0,2
    1,0,0,0,2,0

列数が不揃いなtxtファイルを読み込みたい

しょう? (2010-12-10 (金) 02:48:02)

スペース区切りのテキストファイル(数百万行*9列)をRに読み込もうとしています。

ただ、元データの8列目が「備考」欄のため、scan(file="xxx.txt", sep="")を使うと備考のない部分は区切りのスペースと同じ扱いを受けてしまい、matrixを使って行列化するときにずれてしまいます。

read.tableを使うと「'289' 行目には,8 個の要素がありません」とエラーがでてしまい、読み込んでくれません。(288行目までは備考がなく、289行目で初登場のため)

read.delim("xxx.txt")を使うと、空白の備考欄に「NA」を入れてくれ、一番理想に近いのですが、1行目に備考がないため8列のフレームが作られてしまいます。

read.delimで列数を設定できればよいのですが、可能でしょうか?googleやRの書籍などで探したのですが見当たりませんでした。解決方法があればお教え願えると幸いです。よろしくお願いいたします。

R version=2.9.2, OS=Vista

  • Version 2.12.0 では,read.delim でちゃんと読めるようだけど?
    最新バージョンで確認してから質問すべきではないでしょうか?
    また,read.table でも,fill=TRUE にすると read.delim と同じく読めます(read.delim も read.csv も,もとは read.table なのだから,あたりまえですけど。つまり,read.delim では fill=TRUE がデフォルトになっているだけ。)
    「こんなことができないのかな?」と思ったら,もう一度オンラインヘルプをじっくり読んでみましょう。 -- 河童の屁は,河童にあらず,屁である。? 2010-12-10 (金) 11:11:00
    ファイル
    1 2 3 4 5 6 7 8
    11 12 13 14 15 16 17 18
    21 22 23 24 25 26 27 28 comment
    31 32 33 34 35 36 37 38
    実行結果
    > read.delim("test.txt", header=FALSE, sep=" ")
      V1 V2 V3 V4 V5 V6 V7 V8      V9
    1  1  2  3  4  5  6  7  8        
    2 11 12 13 14 15 16 17 18        
    3 21 22 23 24 25 26 27 28 comment
    4 31 32 33 34 35 36 37 38        
  • ありがとうございます。初投稿で、要領を得ず申し訳ありません。
    早速最新versionをインストール致しました。
    備考が6行目以降に初めて現れると、8列の箱が出来上がってしまうようです。
    9列のheader行を追加するしかなさそうでしょうか? -- しょう? 2010-12-11(土)2:54:00
    #ファイル
    1 2 3 4 5 6 7 8
    11 12 13 14 15 16 17 18
    21 22 23 24 25 26 27 28
    31 32 33 34 35 36 37 38
    41 42 43 44 45 46 47 48
    51 52 53 54 55 56 57 comment 58
    61 62 63 64 65 66 67 comment 68
    71 72 73 74 75 76 77 78
    
    #実行結果
    read.delim(file="test.txt",sep="",header=F)
    
       V1 V2 V3 V4 V5 V6 V7      V8
    1   1  2  3  4  5  6  7       8
    2  11 12 13 14 15 16 17      18
    3  21 22 23 24 25 26 27      28
    4  31 32 33 34 35 36 37      38
    5  41 42 43 44 45 46 47      48
    6  51 52 53 54 55 56 57 comment
    7  58 NA NA NA NA NA NA        
    8  61 62 63 64 65 66 67 comment
    9  68 NA NA NA NA NA NA        
    10 71 72 73 74 75 76 77      78
  • なるほど,備考欄は途中にあると。確かに,最初の質問にもそう書いてありましたね。このデータだと,コンピュータは8番目に出てきたのが備考(文字列)か数値データか考えて処理しなくてはいけませんね。特に備考の文字列中に delimiter があったりすると,備考全体が引用符でくくられていないと解釈はより困難になるでしょうね。ということで,通常の read.* 関数ではそこまでの処理を期待できないでしょう。
    > 9列のheader行を追加するしかなさそうでしょうか? 追加しても,この場合
    4 31 32 33 34 35 36 37      38 NA
    5 41 42 43 44 45 46 47      48 NA
    6 51 52 53 54 55 56 57 comment 58
    7 61 62 63 64 65 66 67 comment 68
    8 71 72 73 74 75 76 77      78 NA
    みたいになるだけでしょう。その後で8列と9列をちゃんと解釈して代入し直せばよいですけど(面倒)。
    > matrixを使って行列化する とありますが,備考欄以外は数値データですか?備考欄は文字データでしょうね?とすると,行列化するときに,数値データ部分も文字列に変換されてしまいますけど(それはそれでよいのかな)。
    結局の所は,readLines で一行ずつ読んで,備考欄を自分で処理するしかないのではないかと思います。 -- 河童の屁は,河童にあらず,屁である。? 2010-12-11 (土) 10:22:38
    txt <- readLines("test.txt")
    n <- length(txt)
    dat <- matrix(0, n, 9)
    for (i in 1:n) {
    	str <- unlist(strsplit(txt[i], " "))
    	if (length(str) == 8) {
    		str[8:9] <- c("", str[8])
    	}
    	dat[i,] <- str
    }
    dat
    実行結果
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]      [,9]
    [1,] "1"  "2"  "3"  "4"  "5"  "6"  "7"  ""        "8" 
    [2,] "11" "12" "13" "14" "15" "16" "17" ""        "18"
    [3,] "21" "22" "23" "24" "25" "26" "27" ""        "28"
    [4,] "31" "32" "33" "34" "35" "36" "37" ""        "38"
    [5,] "41" "42" "43" "44" "45" "46" "47" ""        "48"
    [6,] "51" "52" "53" "54" "55" "56" "57" "comment" "58"
    [7,] "61" "62" "63" "64" "65" "66" "67" "comment" "68"
    [8,] "71" "72" "73" "74" "75" "76" "77" ""        "78"
  • >追加しても,この場合…みたいになるだけでしょう。→ご指摘どおりです。頂いたコードでうまくいきました!本当に助かりました。ありがとうございます。 -- しょう? 2010-12-12 (日) 20:27:02

R commanderのセットアップ

まさ? (2010-12-08 (水) 17:45:28)

R commanderを動かそうとしている初心者です。MacOSX10.6、Rのバージョンは2.12.0です。

install.packages("Rcmdr", dependencies=TRUE)
の後に、

library(Rcmdr)
と入力すると以下のメッセージが来ました。

要求されたパッケージ tcltk をロード中です
Tcl/Tkインターフェースのロード中


となり、それから特に何も起こりません。 この後少し打ち込もうとすると、それ以上入力できず、終了せざるをえない状況です。良い解決策を教えていただけないでしょうか?またX11は立ち上がった状況でやってはいますが、解決できていません。よろしくご教授下さい。

  • > install.packages("Rcmdr", dependencies=TRUE) で Rcmdr はちゃんとインストールできているのでしょうかね?
    install.packages(....) を入力した後,
    also installing the dependencies ‘aplpack’, ‘relimp’
    
     URL 'http://cran.md.tsukuba.ac.jp/bin/macosx/leopard/contrib/2.12/aplpack_1.2.3.tgz' を試しています 
    Content type 'application/x-gzip' length 2077295 bytes (2.0 Mb)
     開かれた URL 
    ==================================================
    downloaded 2.0 Mb
    
     URL 'http://cran.md.tsukuba.ac.jp/bin/macosx/leopard/contrib/2.12/relimp_1.0-2.tgz' を試しています 
    Content type 'application/x-gzip' length 37864 bytes (36 Kb)
     開かれた URL 
    ==================================================
    downloaded 36 Kb
    
     URL 'http://cran.md.tsukuba.ac.jp/bin/macosx/leopard/contrib/2.12/Rcmdr_1.6-2.tgz' を試しています 
    Content type 'application/x-gzip' length 2647612 bytes (2.5 Mb)
     開かれた URL 
    ==================================================
    downloaded 2.5 Mb
    
     ダウンロードされたパッケージは、以下にあります 
     	/var/folders/mL/..../downloaded_packages 
    のようなログがコンソールに出ましたか?出ていないなら,インストールはうまくいっていないでしょう。
    他のパッケージをインストールしたことはありますか?
    インターネット環境は,プロキシ・サーバを通して外部とつながっているのでしょうかそれとも直通でしょうか?
    プロキシ・サーバを介しているならば,それなりの準備をしないといけません。
    かつても,「Rcmdrのダウンロード」というような,「うまくいかないよ〜」という質問が上がってきて,コメントも付いたのだけど結局うまくいったのかどうか分からない(うまくいったのだとは思うけど)うやむやのままで,後からの質問者の役に立たないスレッドがあります。
    その他にも,上の「単語検索」で「プロキシ」を検索すると,プロキシを介してアクセスするときの準備などについての情報が得られることでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2010-12-08 (水) 19:17:54
  • 御返事有り難うございます。install...の入力後のログは同様のものが出ました。プロキシ・サーバについては調べてみます。説明不足でしたがlibrary(Rcmdr)入力後「Tcl/Tkインターフェースのロード中」の後に「>」が出現してチカチカ点滅しているのが現状です。 -- まさ? 2010-12-08 (水) 20:47:38
  • > library(Rcmdr)入力後「Tcl/Tkインターフェースのロード中」の後に「>」が出現してチカチカ点滅
    その後は,
     要求されたパッケージ tcltk をロード中です 
    Tcl/Tkインターフェースのロード中  終了済 
     要求されたパッケージ car をロード中です 
     要求されたパッケージ MASS をロード中です 
     要求されたパッケージ nnet をロード中です 
     要求されたパッケージ survival をロード中です 
     要求されたパッケージ splines をロード中です 
    
    Rcmdrのバージョン 1.6-2
    
     次のパッケージを付け加えます: 'Rcmdr' 
    
    The following object(s) are masked _by_ '.GlobalEnv':
    
        partial.cor
    
    The following object(s) are masked from 'package:tcltk':
    
        tclvalue
    となるはずなので,やはりどこかおかしいのでしょう。なお,【X11については,ユーザは何にもしなくてもかまいません】。どこらあたりから脇道にそれているのかわかりますか?
    うまくいかない場合について,「うまくいかない」という筋道を示すのも難しいかも知れませんが,もう一度最初からやってみるというのもよいかも知れませんね。
    なお,言うまでもないですが,もしうまくいったら,「どのようにしたらうまくいった」というのを,是非是非,アップロードしてくださるよう,お願いしますね。
    なお,Rcmdr には依存しないようにすることをお勧めしたいと思います。初心者に優しいのと,その後の発展が期待できるのは相反することだと思うわけで。-- 河童の屁は,河童にあらず,屁である。? 2010-12-08 (水) 21:36:21
  • Tcl/Tkのダウンロードで解決しました。RパッケージマネージャにTcltkが表示されていたのでそれをクリックすれば大丈夫だと勘違いしていました。CRAN mirrorのR-2.12.0.pkgを良く読むと太字でTcl/Tkの記載に気がついて、自分が誤解していたことに気がつきました。親切御対応誠に有り難うございました。 -- まさ? 2010-12-08 (水) 22:37:04
  • 問題解決のための,素晴らしいスレッドになりましたね。あなたの貢献に賛辞を送ります。 -- 河童の屁は,河童にあらず,屁である。? 2010-12-08 (水) 22:36:34

plotの使い方

質問君? (2010-11-27 (土) 18:29:37)

plotの使いかたで質問です。

x <- c(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
y <- c(5, 6, 7, 1, 3, 5, 6, 7, 1, 3)

これらのデータで、x[1]の時、y[1]をプロットし、x軸にそのままxの値を10〜100まで表示したいのですが、どうやればよいのでしょうか?
よろしくお願いします。

  • 今日はみんな,立川あたりへ出払っているのかな?
    plot(x, y, xaxt="n")
    axis(1, at=x)
    とでもするかな?グラフの横幅はある程度大きくしないと総ての目盛り数字は書かれない(逆に言えば,総ての目盛り数字が書かれるまで横幅を大きくしてね)。
    なお,x は この場合 x <- 1:10*10 とか x <- seq(10, 100, by=10) とかする方がスマートですね。 -- 河童の屁は,河童にあらず,屁である。? 2010-11-27 (土) 20:26:46
  • 有難う御座います。参考になります。 -- 質問君? 2010-11-28 (日) 09:14:26

aggregate関数について

ランゲル・ハンス? (2010-11-26 (金) 15:14:51)

aggregate関数について質問させていただきます。

以下のようなデータフレーム(data)があったとき、cut 関数で N を 10 区間に区切って、その区間における d の合計を求めたいと思います。ある区間において NA がある場合、NA を 0 として合計する方法を教えていただけないでしょうか?下記の例では (50, 60], (60, 70], (70, 80] の区間の合計を 0 としたいと思います。
どうぞよろしくお願いいたします。

N <- c(0, 1, 3, 7, 12, 20, 30, 35, 50, 91)
d <- runif(10, 0, 10)
data <- data.frame(cbind(N, d))
by1 <- cut(data$N, seq(0, 100, 10), right=TRUE, include.lowest=TRUE)
agg <- aggregate(data$d, by=list(by1), FUN="sum")
agg
  • 「NA がある場合」ではなく,「該当区間にデータがない場合」ですね。以下のようにしても答えは求まりますね。cbind は,結果を縦に書くために使ったので,本質的なものではありません。
    その他にも色々なやり方があるでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2010-11-26 (金) 16:19:02
    > cbind(sapply(levels(by1), function(x) sum(d[by1 == x])))
                  [,1]
    [0,10]   21.574116
    (10,20]   8.055110
    (20,30]   3.415935
    (30,40]   2.436897
    (40,50]   9.260387
    (50,60]   0.000000
    (60,70]   0.000000
    (70,80]   0.000000
    (80,90]   0.000000
    (90,100]  5.495600
    > cbind(sapply(split(d, by1), function(y) sum(y))) # なども
  • 河童さま、早速コメントありがとうございました。 -- ランゲル・ハンス? 2010-11-26 (金) 19:16:50
  • すみません、もう一点追加で質問させていただきます。私はsapply関数については全くの素人です。区間に入るNの個数を求める方法もご教示いただけないでしょうか? -- ランゲル・ハンス? 2010-11-26 (金) 19:21:15
  • データの個数は,sapply を使うまでもなく,table(by1)だけでよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2010-11-26 (金) 20:55:24
    > table(by1)
    by1
      [0,10]  (10,20]  (20,30]  (30,40]  (40,50]  (50,60]  (60,70]  (70,80]  (80,90] (90,100] 
           4        2        1        1        1        0        0        0        0        1 
    > sapply(split(d, by1), function(x) length(x)) # これでもよいですけどね。大げさです。
      [0,10]  (10,20]  (20,30]  (30,40]  (40,50]  (50,60]  (60,70]  (70,80]  (80,90] (90,100] 
           4        2        1        1        1        0        0        0        0        1
  • 河童さま、ありがとうございました。感謝・感謝です。明日は心静かに統数研に行けそうです。 -- ランゲル・ハンス? 2010-11-26 (金) 21:13:46

改行、空行

超初心者? (2010-11-20 (土) 15:53:12)

空行の実行方法とプロンプト上で改行を行なう方法を教えてください!!
マニュアル等いろいろ探したんですが、全くわかりません。
初歩的すぎて申し訳ございませんが、よろしくお願いします。

  • 「空行の実行」とは何をどうすることなんでしょうか。改行を連続出力すれば空行が作れますね。「プロンプト上で改行を行なう」というのも,よくわからないですね。改行を出力すると言うこと?改行は "\n" を書けば,改行されますよ。例えば,cat("123, "\n", 456, "\n\n", 789, "\n") とかやってみるとよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2010-11-20 (土) 18:40:33
  • RでSEM入門(http://m884.jp/Osaka.R/_media/osaka.r_no.3/r%E3%81%A7sem%E5%85%A5%E9%96%80.pdf)のp16を参考にしたのですが、どの部分に"∖n"を打ち込めば改行を出力できますか? あと、cat("123, "∖n", 456, "∖n∖n", 789, "∖n")を行なってみたのですが、エラーが出てうまくいきませんでした。解決策あれば再度教えていただきたいです。よろしくお願いいたします。 -- ? 2010-11-21 (日) 15:37:07
  • まだるっこしいですね。「エラーが出てうまくいきませんでした。」どのようなエラーが出たのですか。 -- 河童の屁は,河童にあらず,屁である。? 2010-11-21 (日) 19:16:29
  • 「RでSEM入門 P16 をやったけどうまくいかなかった」なら,そう書けばよいのに。
    まずね,プロンプトの後に,sem パッケージつかうよということで,library(sem) を入力しますね。
    > library(sem)
    次に,read.moments 関数,入力しますね。
    > cor.1 <- read.moments(diag=FALSE, names=c("年齢", "個人年収",
    + "教育年数", "職業威信"))
    そうすると,コンソールには「1:」というプロンプトが出ます。プロンプトに応じて,
    1: 0.12107847
    2: -0.28075478 0.2329769
    4: -0.04963399 0.3954726 0.2921118
    を入力しますね。この入力が終わるとプロンプトは
    7: 
    になります。このあと,何も入力せずに,リターンキーを押すのです(つまり,空行を入力したことになるんだけど)。
    そうすると,コンソールには
    Read 6 items
    と表示され,入力が完了した事になります。
    cor.1
    を入力すれば,cor.1 の内容が表示されるでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2010-11-21 (日) 19:21:16
  • ∖n じゃない。バックスラッシュ \ とn -- 本筋ではないが,? 2010-11-22 (月) 18:47:33
  • お手数おかけしてすみませんでした。挑戦してみます。有り難うございました。 -- 超初心者? 2010-11-23 (火) 13:48:33

日本語を含む固定長ファイルの読み込み

困り果ててます? (2010-11-19 (金) 18:48:40)

日本語を含む固定長ファイルを読み込みたいのですが,うまくいきません。

123あ  456
321いう789

のような内容の test.txt というファイルがあり,1件目のデータをV1="123", V2="あ ", V3="456" と読みたいのですが,

read.fwf("test.txt", width=c(3, 4, 3))

だと意図したように読めません。

readChar("test.txt", c(3, 4, 3), useByte=TRUE)

としてみたのですが,1行目しか読めません。
解決法をご存知の方がいらっしゃいましたら是非 ご教示ください。
よろしくお願いします。

  • あなたの環境がわからないので何とも言えません。上の方にあるように sessioniInfo() の結果を示してください。
    「あ」の後に,半角空白が2個あるのですけど,本来そこには全角空白があると考えるのが普通?なので,半角空白2個を全角空白1個に変換して,utf-8 で保存して,Macintosh 版の R で以下のようにすれば,あなたの望むように(?)読めますけど。
    > read.fwf("test.txt", width=c(3, 2, 3))
       V1   V2  V3
    1 123 あ  456
    2 321 いう 789
    Macintosh 版の R では,全角でも半角でも,「一文字は一文字」ということですね。
    Windows でも,これとは違った規則であるけど,規則に従ってデータを用意して,規則に従って読めばちゃんと読めたはず。今ちょっと,試してみることができないので,あしからず。明日まで待って頂くことが可能なら,やってみますけど。
    と,書いて,思い出しました。「R による統計解析」の 22 頁に,Windows の場合の読み取り方が書いてありました。
    lc <- Sys.getlocale("LC_CTYPE")
    Sys.setLocale("LC_CTYPE", "C")
    read.fwf("test.txt", width=c(3, 4, 3))
    Sys.setLocale("LC_CTYPE", lc)
    とすればよいのかな?前後に余分な面倒な指定が必要なのか?Windows では,読み取り幅を,バイト単位で指定するということか。 -- 河童の屁は,河童にあらず,屁である。? 2010-11-19 (金) 20:38:40
  • ご返事,ありがとうございます。 sessionInfo の結果は
    > sessionInfo()
    R version 2.10.1 (2009-12-14) 
    i386-pc-mingw32 
    
    locale:
    [1] LC_COLLATE=Japanese_Japan.932  LC_CTYPE=Japanese_Japan.932   
    [3] LC_MONETARY=Japanese_Japan.932 LC_NUMERIC=C                  
    [5] LC_TIME=Japanese_Japan.932    
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     
    です。もとのデータを編集するのは極力避けたいので,半角の空白2文字を全角空白1文字にするといった対処法は避けたいのと,例では全角文字しか出しませんでしたが,2行目の「いう」に相当するところに「ABCD」などの半角文字が入るケースもあり,半角2文字を全角1文字に変換するだけでは意図した読み込みができません。 他の環境のことはわかりませんが,Windowsでは読取幅を指定すると全角半角を問わず1文字単位で数えるようなので,読み取り幅をバイト単位で指定する方法がわからず,質問しました。-- 困り果ててます? 2010-11-22 (月) 14:59:38
  • > Windowsでは読取幅を指定すると全角半角を問わず1文字単位で数えるようなので,読み取り幅をバイト単位で指定する方法がわからず,質問しました。
    ああ、ごめんね。Sys.setLocale じゃなくて、Sys.setlocale だったわ。
    > lc <- Sys.getlocale("LC_CTYPE")
    > Sys.setlocale("LC_CTYPE", "C")
    [1] "C"
    > a <- read.fwf("test.txt", width=c(3, 4, 3))
    > Sys.setlocale("LC_CTYPE", lc)
    [1] "Japanese_Japan.932"
    > a
       V1   V2  V3
    1 123 あ   456
    2 321 いう 789
    のように、ちゃんとよめたけどなあ。 -- 河童の屁は,河童にあらず,屁である。? 2010-11-22 (月) 15:27:44
  • 丁寧にご教示いただき,ありがとうございます。試してみたのですが,
    > lc <- Sys.getlocale("LC_CTYPE")
    > Sys.setlocale("LC_CTYPE", "C")
    [1] "C"
    > test <- read.fwf("test.txt", width=c(3, 4, 3))
    > Sys.setlocale("LC_CTYPE", lc)
    [1] "Japanese_Japan.932"
    > test
       V1     V2 V3
    1 123  あ  4 56
    2 321 いう78  9
    やはり文字単位でしか読み込めませんでした... -- 困り果ててます? 2010-11-22 (月) 21:26:55
  • さて,困りましたね。私はうまく読めたといい,あなたは読み込めなかったという。どちらが正しいというわけではなく,どのようにすればちゃんと読めるのかと言うことですね。たぶん,あなたのファイルのエンコーディングなんか変なのだろうかなという気がするだけですけど。差し支えなければ,あなたが読もうとしているデータファイル(の一部)をアップロードしてみるというのも,解決策に導く一方法かもしれませんね。 -- 河童の屁は,河童にあらず,屁である。? 2010-11-22 (月) 21:53:17
  • 何度もありがとうございます。ファイル(test.txt)をアップロードしました。文字コードは shift-jisです。
    con <- file(description="test.txt", open="r", encoding="shift-jis")
    lc <- Sys.getlocale("LC_CTYPE")
    Sys.setlocale("LC_CTYPE", "C")
    test <- read.fwf(con, width=c(3, 4, 3))
    Sys.setlocale("LC_CTYPE", lc)
    test
    close(con)
    
    > test
       V1     V2 V3
    1 123  あ  4 56
    2 321 いう78  9
    のように,文字コードを指定して読み込もうとしてみたのですが,やはり結果は同じでした。 -- 困り果ててます。? 2010-11-22 (月) 22:47:03
  • 何でconをfileで設定しなければならないのかなど,疑問だらけですけど。まあ,できないならできないんでしょう。お気の毒様と言うしかないのかなあ。
    なぜにして、「文字コードは shift-jisです」とおっしゃるのかよくわかりませんが。なにより、con <- file(....と、わざわざやらなくてはならないのかもわかりません
    あなたがアップロードしたファイルに対して、プログラムを何度やっても、ちゃんと読めるのはなぜでしょうね。わかりません。
    私のハンドルが微妙に違うのは、なれないWindows環境で試してから、コメントしているわけで、でたらめ言っているわけじゃないんですよ。というか、もう、Windows は、懲りた。もうやめる。 -- 河童の屁は、かっぱにあらず、屁である? 2010-11-22 (月) 23:55:50
  • わざわざWindows環境で試してくださったんですね。ここまでお付き合いくださり,本当にありがとうございました。何かの設定が違うのだろうと思って option の内容を見てみたりしましたが,どうしたらいいのかさっぱりわかりませんでした。私の環境がおかしいのかもしれませんね。他のPC(Windows)でも試してみます。Macなど他のOSを使える環境ではないので... -- 困り果ててます? 2010-11-23 (火) 13:35:01
  • 他のPCで試してみてもうまくいかなかったのですが,Sys.setlocale("LC_CTYPE", "C") を Sys.setlocale("LC_CTYPE", "E") にしてみたら,意図したように読み込めました!
    > lc <- Sys.getlocale("LC_CTYPE")
    > Sys.setlocale("LC_CTYPE", "E")
    [1] "English_United States.1252"
    > test <- read.fwf("test.txt", widths=c(3, 4, 3))
    > Sys.setlocale("LC_CTYPE", lc)
    [1] "Japanese_Japan.932"
    > test
       V1   V2  V3
    1 123 あ   456
    2 321 いう 789
    ありがとうございました。 -- 困り果ててます? 2010-11-23 (火) 14:11:15
  • これを機会にWindows上に仮想PC (VMPlayerなど)に無償OS(Linuxなど)を入れたものを作っておくといいよ。 -- 2010-11-24 (水) 23:10:09
  • な,なるほど... 検討してみます。ご助言,ありがとうございました。 -- 困り果ててます? 2010-11-25 (木) 12:57:44

エクセルとの乱数の比較について

質問君? (2010-11-18 (木) 22:04:57)

エクセルでMM法を乱数で実行してるのですが、Rの乱数の方が良いと聞いたので、Rでも試したいのですが、エクセルとの擬似乱数比較について、Rが優れているなど分かりやすく、紹介されてるサイトや記事はないのでしょうか?たしかにエクセルよりも、乱数関数は多いです。性能的にはどうなのでしょうか?
探しても見当たりませんでした。もし、ご存知の方がいらっしゃれば、お願いします。

  • エクセルの乱数と比べられるとは,R も心外であろう。
    良い乱数・悪い乱数には,冒頭に「最も多くの人に使われている乱数であろう Visual Basic の Rnd の質は最低である。」と書かれ,後の方に「周期はたったの 1677万しかない。…精度も24ビットしかない。…Randomize は与えられた種を16ビットの整数に変換して初期化する。従って、65536種類の系列しか得られない。」などと,ケチョンケチョンである。
    そのほかにも,「エクセル 乱数 R メルセンヌ ツイスタ」をキーワードとして検索すると色々出てくるでしょう。
    R の乱数については,オンラインヘルプを探したらすぐ見つかりますよ。? RNG で,詳細な説明(およびさらなる詳しい文献情報など)が得られます。ただ,「わかりやすく紹介されている」とは言えないかも知れませんが。 -- 河童の屁は,河童にあらず,屁である。? 2010-11-18 (木) 23:57:23
  • 参考になりました。有難う御座います。 -- 質問君? 2010-11-20 (土) 21:33:06

パッケージ ltm の grm 関数の出力結果の読み方

NT? (2010-11-17 (水) 20:14:57)

3 段階評価 (0, 1, 2) の尺度の項目母数を grm 関数によって求めてみました。
出力結果の二行のみ示すと以下の通りとなります。

      Extrmt1	Extrmt2	Dscrmn
Item1  -1.719	 -0.126	 1.553

ここで Extrmt1 とは評価点 0 と 1 の項目曲線が交わる地点のθの値、Extrmt2 とは評価点 1 と 2 の項目曲線の交わる地点のθの値と解釈してよいのでしょうか。
ご教示願います。

  • Extrmt1と2は反応確率が0.5となるθ値でした -- NT?? 2011-03-13 (日) 14:48:04

ある座標と最も近い座標を特定する際の高速化の方法

Saito? (2010-11-17 (水) 01:37:43)

いつもお世話になっております。
この手の話は既出かと思い検索しましたが、見つけることが出来なかったので質問させてください。

ある座標セットaを持っています。この座標セットには、座標とそれに付随する価が入っています。もう一つ別の座標セットbを持っています。こっちには、座標しか入っていません。今、座標bに最も近い座標aの持つ付随値を補間したいと考えています。下記にサンプルプログラムを示します。

> ###座標とそれに付属する価###
> a <- data.frame(
+         expand.grid(Long=seq(11, 13), 
+                      Lat=seq(20, 23)),
+         value=seq(1, 12)
+                 )
> ###マッチさせる数###
> num <- 1000
> 
> ###座標しか分かっていない###
> b <- data.frame(long=runif(num, 11, 13),
+                  lat=runif(num, 20, 23)
+                 )
> head(b)
      long      lat
1 12.00220 21.48183
2 11.14583 21.13535
3 12.31510 20.28334
4 11.54138 21.18872
5 11.66167 20.76173
6 12.52289 21.27551
> ###全ての組み合わせから最近接距離を持つ座標を特定###
> dis <- NULL
> for(i in 1 : nrow(b)) {
+ dis <- sqrt((b[i, 1] - a[, 1])^2 + (b[i, 2] - a[, 2])^2)
+ b[i, 3] <- a[which(dis==min(dis))[1], 3] #i番目のbがどのaに最も近いか探し出 してマッチング
+ }
> head(b)
      long      lat V3
1 12.00220 21.48183  5
2 11.14583 21.13535  4
3 12.31510 20.28334  2
4 11.54138 21.18872  5
5 11.66167 20.76173  5
6 12.52289 21.27551  6


しかし、実際にはaもbも超巨大で、この方法だとものすごく時間がかかることがあります。上記プログラムをもっと高速化するにはどうすればよいでしょうか。どなたかわかる方がいらっしゃいましたら、ご助言頂けると幸いです。

  • 例えば spatstatパッケージのnncross関数はいかが。 -- あああ? 2010-11-17 (水) 07:19:24
  • classパッケージのknn関数とか。 -- bob3? 2010-11-17 (水) 09:53:45
  • ご助言ありがとうございました。無事出来ました。下記にnncrossの例を示します。(すみませんbob3さん 汗) -- Saito? 2010-11-17 (水) 13:54:20
    >  a <- data.frame(
    +          expand.grid(Long=seq(slong, elong), 
    +                       Lat=seq(slat, elat)),
    +          value=seq(1, elong*elat)
    +                  )
    >  b <- data.frame(long=runif(num, slong, elong),
    +                   lat=runif(num, slat, elat)
    +                  )
    > 
    > dis <- NULL
    > pp_a <- ppp(x=a[, 1], y=a[, 2], c(slong, elong), c(slat, elat))
    > pp_b <- ppp(x=b[, 1], y=b[, 2], c(slong, elong), c(slat, elat))
    > 
    > system.time(
    +  for(i in 1 : nrow(b)) {
    +  dis <- sqrt((b[i, 1] - a[, 1])^2 + (b[i, 2] - a[, 2])^2)
    +  b[i, 3] <- a[which(dis==min(dis))[1], 3] #i番目のbがどのaに最も近いか探し 出 してマッチング
    +  }
    + )
       user  system elapsed 
      17.19    0.00   17.20 
    > 
    > system.time(
    + b[, 4] <- a[nncross(pp_b, pp_a)$which, 3]
    + )
       user  system elapsed 
       0.01    0.00    0.02 
    > 
    > head(b)
          long       lat   V3   V4
    1 54.32715 76.365028 7554 7554
    2 90.84222  7.004393  691  691
    3 88.88978 93.650574 9389 9389
    4 61.72731  8.535613  862  862
    5 73.77037  6.405291  574  574
    6 95.42776 92.221599 9195 9195

大量の従属変数について共分散分析を行う方法について

カワウソ? (2010-11-15 (月) 19:11:55)

はじめまして。
n個の従属変数(y1,y2,…,yn)と一つの独立変数xに関して,if構文を使って以下のような作業を一度に行うにはどのようにプログラムを書いたらよいのでしょうか?

lm(y1 ~ x + g)
lm(y2 ~ x + g)
・
・
・
lm(yn ~ x + g)
  • データはデータフレーム(または行列)に入っているのでしょうか?そうならば従属変数の入っている列番号を使えばよろしいと思います。データフレーム(行列)名を d として,従属変数が1列〜n列,x, g が n+1, n+2 列に入っているなどと言うことなら,for (i in 1:n) lm(d[,i]~d[,n+1]+d[n,+2) のようにすればよろしいでしょう。飛び飛びに入っているならば,i in 1:n の部分は,i in c(2,4,7,8) のようにすればよいですし。
    そんなことはよもやアルマイとは思いますが,従属変数が別々のベクトルに付値されているとか?まずは,そのようなデータ構造を改善する方が後々のためかもしれません。(まあ,そんな場合であっても,d <- data.frame(y1, y2, y3, ..., yn, x, g) などとするだけですけど,n が 10000 なんてことになると,eval(parse(text=...)) を使うほうが簡単と言うこともありますが)。 -- 河童の屁は,河童にあらず,屁である。? 2010-11-15 (月) 19:30:29
  • 試しにirisを使ってやってみたのですが,どうやって結果を表示すればいいか分かりません. -- カワウソ? 2010-11-15 (月) 19:40:06
    > iris.ancova <- for (i in 2:4) lm(iris[,i]~iris[,1] + iris[,5]) 
    > summary(iris.ancova) 
    Length  Class   Mode      
    0   NULL   NULL 
    > iris.ancova <- for (i in 2:4) summary(lm(iris[,i]~iris[,1] + iris[,5]))
    > iris.ancova
    NULL 
  • summary は それぞれの lm 関数の引用ごとにやらないといけないし,for ループの中では print 関数を明示的に使わなくてはならないというのは,ご存じなかったですか。正確に書くと以下の通りです。 -- 河童の屁は,河童にあらず,屁である。? 2010-11-15 (月) 21:25:13
    for (i in 2:4) print(summary(lm(iris[,i]~iris[,1] + iris[,5])))
  • ありがとうございます。とても勉強になりました。 -- カワウソ? 2010-11-15 (月) 22:04:37

データセットの削除方法

ダルビ? (2010-11-10 (水) 21:24:20)

初めまして。
Rコマンダーで特定のデータセットを削除するにはどうすればよいのでしょうか?
いろいろなデータセットができてしまって困っています。
お手数ですが、よろしくお願います。

kmeans と pamのクラスタリング結果について

Jam? (2010-11-08 (月) 17:07:02)

初めまして。
clusterライブラリで利用できるk-meansとpamの挙動について質問です。

2次元のxy座標で示せるデータをk-meansとpamでクラスタリングをしていて気になることがありました。それはpamの実行結果が毎回同じであるということです。
私の解釈として、どちらの手法も初期のランダムサンプルに結果が依存するため、クラスタリング結果は同じデータ・設定で実行したとしても毎回変わると思っています。確かにk-meansでは実行の度に結果は変わることは確かに確認できるのですが、pamではクラスタリング結果が毎回同じです。
クラスタリング結果が同じというのは、plotした図、result$centers (k-meansの場合)、result$medoids (pamの場合)を見て判断しています。データ数は1000弱です。

これはどういうことなのでしょうか?pamのランダムサンプルはクラスタリング結果に依存する、つまり結果は毎回多少でも異なってくると思うのです。k-menansの$cnetersは実行のたびに異なるが、pamの$medoidsは毎回同じ値になることは以下のプログラムで確認しました。

検証プログラム。

library(cluster)
# (x, y)形式のデータを読み込む
data <- read.table(var.in_file, header=F, sep="\t") 

################
# pam clustering          #
################
data.clust <- pam(data, 10)
data.clust$medoids

################
# k-means clustering     #
################
data.clust <- kmeans(data, 10)
data.clust$centers
  • medoids 引数で,むちゃくちゃな初期値を指定してもちゃんと正しい答えをだしてくるので,それこそが "a more robust version of K-means" なのではないですか?そもそも,毎回結果の異なる K-means の方がおかしいのでしょう。k-means だって,start でかなりの繰り返し数を指定してやると多数決原理で正しい答えを得ることはできますけど,何回も繰り返して分析しているのはどうもしょうがないというか。 -- 河童の屁は,河童にあらず,屁である。? 2010-11-08 (月) 18:14:16
  • 回答ありがとうございます。ロバストであることは知っていましたが、結果が安定しすぎている(結果が同じになっている)と思い投稿しました。ランダムサンプルを適用していることにより、kmeansの各回の結果は異なっているのは妥当だと思いますが違うのでしょうか。この質問ではクラスタリング結果の良し悪しではなく、クラスタリング結果が毎回同じであるpamの挙動に疑問を抱いたためです。説明が下手くそですみません、クラスタリング結果がデータ解析において妥当である、正しいである、というのは今回の質問ではあまり意味が無いです。 -- Jam? 2010-11-08 (月) 18:54:15
  • 「むちゃくちゃな初期値を指定してもちゃんといつも同じ(正しい)答えをだしてくる」というほどロバストなんでしょう。 -- 2010-11-08 (月) 19:16:11
  • 初期ランダムサンプル、pamでいうとmedoidですがこれにあまり依存せず同じ解へとたどり着く傾向があるんですかね。うーん、いまいち腑に落ちないところが…。 -- Jam? 2010-11-08 (月) 19:39:46
  • > pamでいうとmedoidですがこれにあまり依存せず同じ解へとたどり着く傾向があるんですかね
    私も,想像だけで言っているわけではなく,最初に書いたように,medoids 引数(length-k vector of integer indices (in 1:n) specifying initial medoids )を使って,全くでたらめな初期値を指定しても(iris データセットで例えば1:3 を指定するような),いつも同じ解が得られるのを確かめているんですよ。
    kmeans の動態が異常すぎるだけです。毎回違った答えが出る方が異常なんですよ。初期解に依らず同じ答え(たぶん正しい答え)が出るのが当たり前でなくてはならないのです。 -- 河童の屁は,河童にあらず,屁である。? 2010-11-08 (月) 20:55:21
  • kmeansの場合、最初に重心要素をランダムで決めるわけですから、最終的に収束したクラスタリング結果が異なるのは、"通常"と思うのですが勘違いなのでしょうか?もしこれが通常であるのならば、pamにおいても初期medoidsをランダムに決めるわけですから結果も必然的に初期のinitial medoidsに依存してしまうと思っているのです。回答が重複していますがやはり腑に落ちません。私の解釈ではどこか見落としているのでしょうか。 -- Jam? 2010-11-08 (月) 22:06:58
  • 追記です。あくまで現在利用しているデータは2次元座標であり、irisの種類のようにクラスタリング結果に正解はありません。 -- Jam? 2010-11-08 (月) 22:08:54
  • > 私の解釈ではどこか見落としているのでしょうか。
    お互いの意見が全くすれ違ってますね。見落としているんじゃなくて,見解の相違でしょう。同じデータを分析したら毎回同じ答えが出るのが望ましい。あるデータの平均値を計算するたびに違った数値が出たら(例えばランダムに全データの1割のデータから平均値を計算しました。毎回違って当たり前でしょうーーなんて),そんなもの信頼できないでしょう。ランダムな初期値から出発するんだから結果もランダム性が反映されるはずと考えるのはよいでしょうけど,ロバストナな結果が出たことに違和感を感じると言われても,そうですかねえとしか言えない。
    「クラスタリング結果に正解はありません」そんなことはわかっています。別に正解という言葉にこだわっているわけではない。何回,どのような初期値から出発しても同じ答えが出るなら,それはそれで出てきた結果はでたらめなもんじゃないんだなと言うことでしょう。データ解析しているわけだから「正解」はないだろうけど,出てきた答えはそのデータの持っている性質・性格・特性などなどを表しているのだからそのデータを解釈する上では信頼できるものでしょう。いずれにせよ,これ以上の議論は不毛ですので,やめにします。 -- 河童の屁は,河童にあらず,屁である。? 2010-11-08 (月) 23:21:39
  • kmeansの場合は確かにランダムに初期値を決めていたと思いますが、pamの初期値はランダムではなく、一定の値に帰結するような方法で決めているのでは? pamのヘルプを見るとこうありますね「the algorithm first looks for a good initial set of medoids (this is called the *build* phase)」。 -- 2010-11-25 (木) 14:36:20

LOESS平滑化曲線と信頼区間

MKI? (2010-11-06 (土) 05:26:32)

散布図にLOESS()で平滑化曲線を加えたあと、その信頼区間を合わせてグラフに描画したいのですがそれらしい関数が見あたらず、もしどなたかご存じでしたら教えて下さい。できれば信頼区間を95%以外にも自分で変更できれば助かります。

  • http://finzi.psych.upenn.edu/R/library/stats/html/predict.loess.html 「se an estimated standard error for each predicted value.」 「df an estimate of the effective degrees of freedom used in estimating the residual scale, intended for use with t-based confidence intervals. 」 とあります。この2つを使えば信頼区間が得られます。 -- 竹澤? 2010-11-06 (土) 08:46:00
  • http://finzi.psych.upenn.edu/R/library/ggplot2/html/stat_smooth.html「method smoothing method (function) to use, eg. lm, glm, gam, loess, rlm」「display confidence interval around smooth? (true by default, see level to control)」を使うこともできます。 -- 竹澤? 2010-11-06 (土) 09:04:12
  • ありがとうございます。それらしいグラフを描けるようになったのですが、平滑化曲線+SEから平滑化曲線+95%信頼区間に変更する場合、信頼区間=t(自由度=n-1)×SEということになると思いますが、このときの自由度は全サンプル数ということでいいのでしょうか、なんか違うような気がするのですが・・・。 -- MKI? 2010-11-09 (火) 03:25:36
  • 上にあります、「df an estimate of the effective degrees of freedom」が自由度です。データの数ではありません。 -- 竹澤? 2010-11-10 (水) 08:54:16

リストの成分

nan? (2010-10-31 (日) 18:35:42)

初めまして。

リストの成分にアクセスしたいのですが、例えば以下のようなデータについて

> test <- function(x) {y=log(x); z=sin(x); return(list(value=x, log=y, sin=z))}
> test(1:3)
$value
[1] 1 2 3
$log
[1] 0.0000000 0.6931472 1.0986123
$sin
[1] 0.8414710 0.9092974 0.1411200

$logの[0.0000000]や$sinの[0.9092974]にアクセスするにはどのようにすれば良いのでしょうか?

宜しくお願いします。

  • リストの要素はベクトルになっているので,foo$log[i] のように参照するのですよ。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-31 (日) 18:56:49
    > foo <- test(1:3)
    > class(foo)
    [1] "list"
    > class(foo$log)
    [1] "numeric"
    > foo$log[1]
    [1] 0
    > foo$sin[2]
    [1] 0.9092974
  • ありがとうございました! -- nan? 2010-10-31 (日) 23:12:09
  • この場合は名前付きリストなので$が使えますが,[[ ]]でも参照できます。つまりtest(1:3)[[2]][1]とかtest(1:3)[[3]][2]とできます。 -- 2010-11-10 (水) 11:48:46

空の値を欠損値と指定する

のの (2010-10-31 (日) 04:07:34)

データフレームxの中の列名(変数名)aについて

> attach(x)
> x <- ifelse(a=="", NA, a)

とすると、空の値を欠損値NAと指定できます。
しかし、aがfactorだった場合には、factorの性質が失われてしまうようです。
何かもっとエレガントな方法はあるのでしょうか?

> x <- subset(x, a != "")
> table(a, useNA="always")

これも違うようです。

  • x$a <- factor(sub("^$", NA, x$a)) とするかなあ?(attach は嫌いです) -- 河童の屁は,河童にあらず,屁である。? 2010-10-31 (日) 06:05:11
  • ありがとうございます、見事ですね。美しいです。attachが嫌いな理由を是非教えていただきたいです。ワークスペースにオブジェクトが溢れるからですか? -- のの 2010-10-31 (日) 09:58:37
  • attach が嫌いな理由。(1) 引用はできるが付値ができない(できたつもりでいると大やけど。ちゃんとしようとすると,x$a と a が入り交じって,汚いし,混乱する)。(2) 途中で重複して attach なんかすると悲劇的。(3) エディタ使ってプログラムしていると,データフレーム名を省略できてもなんにもうれしくない。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-31 (日) 14:46:56
  • 河童さん、丁寧にありがとうございます。(1),(2)の理由は何となく気がついていましたがまだ火傷したことがないので重要視していませんでした。もうちょっと勉強してみます。 -- のの 2010-11-01 (月) 09:45:28

ブートストラップ法によるreliability

MKI? (2010-10-29 (金) 22:29:49)

多変量解析を行い、意味のありそうな説明変数を取り出す作業をした後、それをブートストラップ法によってreliabilityを確認するよう求められました。Rでやってみたいと思いますが、「entry criteriaをp<=0.10にしてretention criteriaをp<0.05で確認する」ように指示されましたがstepAICでできるのでしょうか。方法としては
1.スプレッドシートからランダムにサンプリング(重複あり)
2.一般化線形モデルに当てはめ
3.stepAIC???で残った説明変数を抽出
4.1〜3を1000回繰り返す
といった感じになるかと思うのですが3.の部分が方法として正しいのかどうか分かりません。あるいは同じようなこと(多変量解析+ブートストラップ法)ができるパッケージはありますか。もしご存じでしたら教えて下さい。

  • 追記ですが、指示されたクライテリアによる方法とstepAICを使った方法は明らかに違うと思いますが、どちらの場合でも取り出し方が分かりません。どのようにしたらよいでしょう(方法論とし正しいかどうか???ですが、統計学専門家?のコメントらしいので) -- MKI? 2010-10-29 (金) 22:49:42
  • ブートストラップを要求してくる割に,多くの問題が指摘されているp値を使えとは一貫しない指示ですね.ま, validate() とか calibrate() (どちらも Design パッケージ)とかで簡単にできますが,MKIさんが専門家でないなら,統計学専門家の指示を仰ぐのが得策かと... -- コンソメコメット? 2010-10-29 (金) 23:23:38
  • 指示を仰げる統計学専門家が身近におりませんので、一応、stepAICを使用して説明変数を抽出してみたいと思います。その上で有意なp値をカウントする?という折衝案で行きたいと思います。個人的には推定値と信頼区間だけでもいいような気がしますが・・・。(時々、推定値もなくp値のみだけ説明変数と並べられているものがありますが・・・。)  -- MKI? 2010-11-06 (土) 05:36:56

abline(h = 5) との交点の X の値

hashi? (2010-10-28 (木) 05:34:07)

Q&A (初級者コース)/11であった「任意の X 軸と曲線との交点(Y 値)の値の算出」の逆のことをしたいのです。
以下がデータです。

x <- c(2:10)
y <- c(0.084, 3.642, 12.472, 27.262, 47.035, 67.439, 83.974, 92.767, 100)
plot(x, y, xlim = c(2, 10), ylim = c(0, 100))
lines(spline(x, y, n = 20), col = 2)

このとき、abline(h = 5) を作図したときスプライン曲線との交点を読みたいのですが、どのようにしたらよいのでしょうか。
どうかよろしくご教授お願いいたします。

  • 正確ではないですけど,グラフィックウインドウをなるべく大きくしておいて,locator( ) を使うのが最も簡単でしょう。
    または,splinefun( ) で得られる関数を使って二分法などで答えを求める。ヒマがあったらプログラムしてみるかな。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-28 (木) 09:16:58
  • 昼飯前でしたので,ニュートン法にしました。初期値はなるべく真値に近いところを選んでね。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-28 (木) 10:16:07
    solve.spline <- function(x, y, y.val, x.init)
    {
    	fun <- splinefun(x, y)
    	x <- x.init
    	repeat {
    		x2 <- (y.val-fun(x))/fun(x, 1)+x
    		if (abs(x-x2) < 0.0001) return(mean(c(x, x2)))
    		x <- x2
    	}
    }
    使用例
    > solve.spline(x, y, 5, 4.5) # y=5 になる
    [1] 3.205662                 # x の値
    > solve.spline(x, y, 30, 6)  # y=30 になる
    [1] 5.150513                 # x の値
    > fun <- splinefun(x, y) # これがスプライン曲線の関数
    > fun(5.150513) # x=5.150513 のとき
    [1] 30.00001    # y=30.00001 になってる
  • 河童の屁は,河童にあらず,屁である。様ありがとうございました。解決方法はあるんですね。 実はxoutを使い求めたい値の極近い値で二分法により求めるしかないのかなと思っていました。 ところで、質問したxとyのデータを逆にしてスプラインを描き、xoutから値を求めると、 $y [1] 3.259891 となりました。値が異なるのか! y=xに対称なスプラインにはならないんですね。 -- hashi? 2010-10-28 (木) 22:08:17
  • > 値が異なるのか! y=xに対称なスプラインにはならないんですね。
    誤差を考える方向が垂直方向か水平方向かの違いがあるんですね。まあ,そういうことです。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-28 (木) 22:10:55

各列毎にある条件にあう要素の数をカウント

MKI? (2010-10-27 (水) 13:17:49)

データフレームの各列毎にある条件(たとえば0.1以上など)を満たす要素をカウントするにはどうしたらよろしいでしょうか。apply関数で各列のmeanなどは簡単に得られますが、似たような方法でカウント数を得ることは可能でしょうか。

  • apply(データフレーム, 2, function(x) sum(x > 0.1)) などでしょう。第3引数が関数の指定です。存在する関数を指定してもよいし,自分で定義する(定義した)関数を使うこともできますよ。apply のなかで関数を定義する(無名関数)やり方は,apply 関数のオンラインヘルプの例(example)にも出ているのではないかな?
    前もって必要な関数 func <- function(x) sum(x> 0.1) を定義しておいて,apply(データフレーム, 2, func) でもよいですけどね。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-27 (水) 13:34:49
  • ありがとうございます。無事にカウントできました。funcを使う方法も是非、トライしてみます。 -- MKI? 2010-10-29 (金) 22:09:56

4つの集合のベン図

sh? (2010-10-27 (水) 09:17:04)

4つの集合のベン図をRで描くにはどうすればよろしいでしょうか? [参考文献] http://ja.wikipedia.org/wiki/ベン図 多数の集合のベン図 http://www.ats.ucla.edu/stat/r/faq/venn.htm R FAQ: How can I generate a Venn diagram in R? vennDiagram Can't plot Venn diagram for more than 3 sets

  • 円を使うかぎりは不可能でしょう。別に,領域の大きさと表そうとする量は比例する必要はないので,楕円を使えば以下のような4つの集合のベン図を描くことはできます(そもそも,自由閉曲線を使ってもよいのだけど)。ただ,ベン図って,欧米諸国民はありがたがるようだけど,特に有意義な図示法でもないと思いますけどね?? -- 河童の屁は,河童にあらず,屁である。? 2010-10-27 (水) 11:42:29
    vennDiagram.png
  • ありがとうございます。4つの集合のベン図を描くRコードを教えていただけないでしょうか? -- sh? 2010-10-27 (水) 12:20:50
  • 昼飯後の仕事ですが,以下のようなものを。
    パラメータは適当なので,あなたの環境だと微調整が必要かも。
    関数の第一引数にカウントを指定する。順番に注意。以下のデータフレームを参考にすること。つまりは,"", "r", "g", "rg", "b", "rb", "gb", "rgb", "p", "rp", "gp", "rgp", "bp", "rbp", "gbp", "rgbp" の順(vennDiagram とは指定順が違うので注意)
    前のコメントの図のように,記号だけを描きたいときには第一引数に文字列ベクトルを指定することもできる。
    ラベルとカウントを描きたいときには,ラベルを labels 引数の方に与える。このとき,ラベルとカウントの行間を調整するのが delta.y 引数。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-27 (水) 13:22:40
    venn4 <- function(counts, col=c("red", "green", "blue", "purple"), lwd=2, labels=NULL, delta.y=7, ...)
    {
    	elp <- function(x0, y0, a, b, col, lwd)
    	{
    		theta <- 0:360/180*pi
    		x <- x0+a*cos(theta)
    		y <- y0+b*sin(theta)
    		lines(x, y, col=col, lwd=lwd)
    		
    	}
    	plot(c(0, 254), c(0, 202), type="n", axes=FALSE, xlab="", ylab="", ...)
    	x0 <- c(112, 116, 125, 68)
    	y0 <- c( 88, 134,  90, 90)
    	a <-  c( 45,  78,  95, 45)
    	b <-  c( 75,  50,  43, 75)
    	for (i in 1:4) {
    		elp(x0[i], y0[i], a[i], b[i], col=col[i], lwd=lwd)
    	}
    #                  ""    r    g   rg    b   rb   gb  rgb   p  rp   gp  rgp  bp rbp  gbp rgbp 
    	loc.x <- c(170, 120, 160, 118, 185, 135, 169, 134, 58, 89,  60,  91, 50, 90,  61,  95)
    	loc.y <- c( 30,  30, 150, 144,  80,  67, 112, 104, 36, 36, 138, 137, 85, 66, 107, 103)
    	text(loc.x, loc.y-!is.null(labels)*delta.y, labels=counts)
    	if (!is.null(labels)) {
    		text(loc.x, loc.y+delta.y, labels=labels)
    	}
    }
    venn4(d$counts, labels=c( "", "r", "g", "rg", "b", "rb", "gb", "rgb", "p", "rp", "gp", "rgp", "bp", "rbp", "gbp", "rgbp"),
          main="Four factors Venn diagram")
    
    > d
       r g b p counts
    1  0 0 0 0     42
    2  1 0 0 0     40
    3  0 1 0 0     32
    4  1 1 0 0      4
    5  0 0 1 0     15
    6  1 0 1 0     19
    7  0 1 1 0     26
    8  1 1 1 0      7
    9  0 0 0 1     10
    10 1 0 0 1     27
    11 0 1 0 1     43
    12 1 1 0 1      2
    13 0 0 1 1     20
    14 1 0 1 1     47
    15 0 1 1 1     13
    16 1 1 1 1      8
    
    venn4(d$counts, labels=c( "", "r", "g", "rg", "b", "rb", "gb", "rgb", "p", "rp", "gp", "rgp", "bp", "rbp", "gbp", "rgbp"),
          main="Four factors Venn diagram")
    vennDiagram2.png
  • なんで楕円でないといけないのかがやっと分かった... 河童さんは凄いです。 -- のの 2010-10-29 (金) 17:00:56
  • gplots パッケージの venn 関数は,5 集合までのベン図を描けるようです。 -- 河童の屁は,河童にあらず,屁である。? 2010-11-04 (木) 17:32:09

行列操作について

ランゲル・ハンス? (2010-10-26 (火) 10:29:21)

いつも掲示板を参考にさせていただいています。
さて、下記の行列mの各行の値を逆順にして、行列m2を作りたいと思います。
行列操作でmからm2を作る方法、あるいはdからm2を作る方法をご教示いただけないでしょうか?

d <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
m <- matrix(d, 3, 3, byrow=TRUE)
d2 <- c(3, 2, 1, 6, 5, 4, 9, 8, 7)
m2 <- matrix(d2, 3, 3, byrow=TRUE)

どうぞよろしくお願いいたします。

  • 色々やり方はありますが,一番簡単には m[,3:1] で良いでしょう。一般的にするためには,m[,ncol(m):1] ですね。各行の値を逆順にするというのではなく,各列を逆順に配置すると考えるのがこつです。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-26 (火) 10:58:23
  • ご教示ありがとうございました。簡潔な方法で大変参考になりました。感謝、感謝です。 -- ランゲル・ハンス? 2010-10-26 (火) 17:58:38
  • t(apply(m,1,rev))でもいけますね,たぶん。 -- 2010-10-27 (水) 10:16:37

ハフ変換

yorudan? (2010-10-25 (月) 17:22:10)

ハフ変換を行うためのパッケージはありますか!?

  • まあ,ずいぶんぶっきらぼうな質問ですこと。http://seekr.jp/ で "ハフ変換" とでも入力して検索するのがよいでしょう。Package ‘PET’ とかあるようですけど,それがあなたの望むものかどうか,自分で確認してください。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-25 (月) 23:18:25

library(gregmisc)のバグ!?

のの (2010-10-24 (日) 03:42:03)

library(gregmisc)を導入して、excelシートからデータを直接取り込む方法を試しています。
いくつかおかしな挙動をみつけたので書き込みます。
こちらの環境は、MacOS10.6.4, GUI版R version 2.11.1 (2010-05-31) x86_64-apple-darwin9.8.0 です。
他の環境で、同じ状況が再現するのかも教えて欲しいです。

1. エクセルシートの中で、"'’"または"…"を使っていると次のエラーが出る。

Wide character in print at /Library/Frameworks/R.framework/Resources/library/gdata/perl/xls2csv.pl line 262.

調べた範囲では、たぶん内部処理でperlに文字列を渡すときに文字コードエラーを起こしているのだと思います。ただデータは正しく取り込まれるので実質的な問題はないように思います。
これがfileサンプルファイルです。
2. サンプル数が増えてしまう
こちらの方が問題が大きいです。Rはエラー表示しませんが、変なレコードが追加されて、データフレームに影響を与えます。
試行錯誤して、""',"この文字列を含むとおかしくなることは再現できました。
これがfileサンプルファイルです。
まだ、library(gregmisc)開発サイトの方は良く調べていないのでこれから調べて何か分かればこの記事を更新する予定です。

  • それぞれエラーの原因はあるでしょうけど,それをバグとして片付けるのもどうでしょうか。CSV ファイルに含まれる文字列にもいくつかの制限があり,例えばプログラムによっては引用符中にあるカンマや引用符(2バイトコードで2バイト目が半角やカンマと同じコードなどは,正確に処理できないこともあるのでしょう。元のファイルで,そのような問題になる文字列を前もって無害なものに変換しておくことで,問題が生じないようならば,そのような対処をするのがよいと思います。積極的な問題解決でなくてすみませんが。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-24 (日) 18:02:03
  • コメントありがとうございます。そうですね、仕様なのかもしれません。サンプル数が増える方が実際的に被害が出るのですが、どういう文字列が悪さを与えるのかはっきり分かっていません。いちおう、試行錯誤して、添付ファイルでは再現できますが、サンプルの数も関係するようです。Gregory R. Warnes先生にも直接メールしてみました。 -- のの 2010-10-25 (月) 01:35:02

図の中に+/-

MKI? (2010-10-22 (金) 13:29:37)

図(グラフ)の中に平均(変数)+/-標準偏差(変数)を書き込みたいのですがexpressionを使用してもうまくいきません。ひとつひとつ数字を書き込めば
可能ですが、変数などと組み合わせて表示する方法はないでしょうか。

  • こういうことがやりたいのかな?
    eval と parse を使えばよいです。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-22 (金) 15:58:52
    plot(hist(rnorm(10000)))
    mean <- c(3.2, 4.5, 6.8)
    sd <- c(0.2, 0.1, 0.6)
    x <- c(-3, -2, 2)
    y <- c(1100, 1300, 1500)
    for (i in 1:3) {
    	str <- sprintf("text(%f, %f, labels=expression(%f%%+-%%%f))", x[i], y[i], mean[i], sd[i])
    	eval(parse(text=str))
    	
    }
    eval-parse.png
  • ありがとうございます。全くその通りです。3日も試行錯誤しましたができませんでした。 -- MKI? 2010-10-22 (金) 21:29:20
  • 失礼!for は無用でした。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-22 (金) 22:56:42
    plot(hist(rnorm(10000)))
    mean <- c(3.2, 4.5, 6.8)
    sd <- c(0.2, 0.1, 0.6)
    x <- c(-3, -2, 2)
    y <- c(1100, 1300, 1500)
    str <- sprintf("text(%f, %f, labels=expression(%f%%+-%%%f))", x, y, mean, sd)
    eval(parse(text=str))

scatterplot3dでの三次元プロットのサイズ設定について

しげゆき? (2010-10-18 (月) 10:39:18)

XPでR2.11.1の初心者です。よろしくお願いします。

scatterplot3dでプロットの色、サイズを変えた図を作成していますが、色はデータどおりいきましたが、サイズがデータと食い違ってうまくいきませんでした。

以下データで左3列がXYZ軸、colorが色4種類、sizeが5段階です。

  sisu dens length color size
1 -115  1.4    9.8     A    5
2  -62  1.6    7.0     A    3
3  108  1.7  452.0     B    2
4  174  1.8  202.0     B    1
5  184  1.7  141.0     B    4
6   11  1.7   10.2     C    4
7   23  1.7   40.0     C    5
8  -14  1.8  232.0     D    5
9  127  1.7  132.0     D    3
scatterplot3d(x=d$sisu, y=d$dens, z=d$length,
color=c(2,3,4,5)[unclass(d$color)],
cex.symbols=c(1,2,3,4,5)[unclass(d$size)])

cexを書き出しましたが、データどおりでおかしくありませんでした。

> c(1,2,3,4,5)[unclass(d$size)]
[1] 5 3 2 1 4 4 5 5 3

どこか間違っているのでしょうか。

  • 完全にはフォローしていませんが,scatterplot3d のバグだと思います。
    scatterplot3d の 88 行目に dat <- dat[y.ord, ] というのがあって,元のデータが並び替えられています。pch は 92 行目で対応して並べ替えているのですが,他のパラメータは無視されています。
    対応策としては,88 行目と 92 行目をコメントアウトしてしまうことでしょう。そうすれば,期待したとおりの図が描かれるでしょう。
    しかるべき方面へ,バグ報告してください。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-18 (月) 16:32:58
    scatterplot3d.png
  • どうもありがとうございます! それで重ねてで恐縮なのですが、scatterplot3dのコードをご指摘いただいたように直す方法が、初心者ゆえわかっていません。いろいろ調べてみたのですが・・・。何か参照先ありますでしょうか。 -- しげゆき? 2010-10-19 (火) 00:15:30
  • scatterplot3d2 <- edit(scatterplot3d) で編集します。編集後の関数は,別名で保存しておき,使うときに読み込みます。使うときには,scatterplot3d2(x, y, z, ...) のように使います。蛇足ですけど,edit の結果を付値するオブジェクトの名前はあなたが自由に決めることができます。
    ? edit でオンラインヘルプを見てください。
    それでもうまくいかないというときは,filescatterplot3d2.Rをダウンロードしてみてください。
    source("scatterplot3d2.R") で読み込み,scatterplot3d のかわりに,scatterplot3d2 を使います。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-19 (火) 08:53:35
  • 重ねてありがとうございます。教えていただいたとおりの対策により適正な図が描かれました。 -- しげゆき? 2010-10-19 (火) 15:31:47
  • コメント途中で切れてしまいました。全くお手上げと思っていましたが、本当に助かりました。ちなみに、「editの結果を付値するオブジェクトの名前」もよくわかっていませんが、また勉強します。 -- しげゆき? 2010-10-19 (火) 15:35:25

ベクトルの個数を返す関数の自作

のの (2010-10-14 (木) 11:05:44)

いつもお世話になります。 例えば、次のようなベクトルが二つあるとき、

x <- c(1:10)
y <- c(20:40)
test(x)とtest(y)の結果が1でtest(c(x,y))の結果が2となるような関数testを作りたいのですが、何か良い方法があれば是非教えて下さい。
test <- function(i) {
  text <- as.character(match.call()[2])
  if (grep("^c", text) != 1) {1}
  else {grep(",", text)}
}

のようになるのかと考えましたが上手くいきません。

  • 「test(x)とtest(y)の結果が1で test(c(x,y))の結果が2となるような関数testを作りたいのですが」って,意味が分からない。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-14 (木) 14:33:08
  • ベクトルの個数というか、変数の数というのか、オブジェクトの数と言うのか、どう言うのが正しいのか分かりませんが、例えば、test(c(x,y,z))ならx,y,z3つの変数で3と返し、変数の数がnならnを返すような関数です。変数x,y,zはベクトルとして中にデータが入っています。 -- のの 2010-10-14 (木) 14:45:40
  • やり方はいろいろあると思いますけど,簡単に書くなら以下のようにも。
    単に,カンマの個数を見ているだけなので,実際に利用するときには,微調整が必要。
    この関数があなたの意図した仕様を満たしているかどうか,私にはわからない。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-14 (木) 14:54:45
    > test <- function(arg)
    + {
    + 	sum(unlist(strsplit(deparse(substitute(arg)), ""))==",")+1
    + }
    > x <- 1:10
    > y <- 21:26
    > z <- 31:48
    > test(x)
    [1] 1
    > test(c(x, y))
    [1] 2
    > test(c(x, y, z))
    [1] 3
  • まさに求めていた回答です。理解するのに時間がかかりましたが、とても勉強になりました。ありがとうございます!! -- のの 2010-10-14 (木) 15:13:55

周囲の値を用いた中心座標の平均値の算出

Saito? (2010-10-13 (水) 13:00:02)

いつもお世話になっています。
過去ログ等検索しましたが、見つからなかったので質問させてください。
座標と座標に付与されたデータからなる3列のデータセットがあります。今、座標が細かすぎるので、もう少し粗い解像度に変換したいのですが、その変換プログラムが上手くいきません。以下に例を示します。

> ###仮想データセット###
> ###x, yが座標で、zが値###
> mat <- data.frame(expand.grid(x=1:6, y=1:4), z=1:24)
> mat
   x y  z
1  1 1  1
2  2 1  2
3  3 1  3
4  4 1  4
5  5 1  5
6  6 1  6
7  1 2  7
8  2 2  8
9  3 2  9
10 4 2 10
11 5 2 11
12 6 2 12
13 1 3 13
14 2 3 14
15 3 3 15
16 4 3 16
17 5 3 17
18 6 3 18
19 1 4 19
20 2 4 20
21 3 4 21
22 4 4 22
23 5 4 23
24 6 4 24
> ###y軸方向に足し合わせたときの行列を用意###
> mat2 <- data.frame(matrix(0, ncol=ncol(mat), nrow=nrow(mat)/2))
> 
> ###x軸方向にも足し合わせたときの行列を用意###
> mat3 <- data.frame(matrix(0, ncol=ncol(mat), nrow=nrow(mat2)/2))
> 
> ###y軸の値がx軸方向にいくつ詰まってるのか確認###
> a <- as.numeric(summary(as.factor(mat[, 2]))[1])
> 
> ###y軸方向に何度足せばよいのか確認###
> b <- length(levels(as.factor(mat[, 2])))
> 
> ###等比数列でy軸の値をx軸方向に詰まっている分だけ足し合わせ###
> for (i in 1 : (b/2)) {
+ mat2[((i-1)*a+1):(i*a), ] <- 
+     mat[((2*a)*(i-1)+1):((2*a)*(i-1)+a), ] + 
+     mat[((2*a)*(i-1)+(1+a)):((2*a)*(i-1)+(a*2)), ]
+ }
> mat2
   X1 X2 X3 
1   2  3  8
2   4  3 10
3   6  3 12
4   8  3 14
5  10  3 16
6  12  3 18
7   2  7 32
8   4  7 34
9   6  7 36
10  8  7 38
11 10  7 40
12 12  7 42
> ###同様にx軸についても###
> for(i in 1 : (nrow(mat2)/2)){
+ mat3[i, ] <- mat2[(2*(i-1)+1), ] + mat2[(2*i), ]
+ }
> mat3
  X1 X2 X3
1  6  6 18
2 14  6 26
3 22  6 34
4  6 14 66
5 14 14 74
6 22 14 82
> ###最終的に得たい座標セット###
> ###周囲4つの値の平均となってほしい###
> mat3/4
   X1  X2   X3
1 1.5 1.5  4.5
2 3.5 1.5  6.5
3 5.5 1.5  8.5
4 1.5 3.5 16.5
5 3.5 3.5 18.5
6 5.5 3.5 20.5
> 

一応、上記のへたくそなプログラムでもおおよそのやりたいことは出来ているのですが、実は、まだ上記に含めていない条件が二つあります。
一つは、周囲4つの平均でなく周囲9つの平均や16の平均(つまり正方形で扱いたい)と任意に変えたいときに、上記のプログラムでは一から書き直しになります。
そこを明示的に加えたいのですが、上手く書けませんでした(例ではそもそも24行しかないので、9や16は難しいですが…)。

もう一つの条件は、z軸にNAが含まれている座標があるのですが、そのときはNAを抜いた数で平均を返したいのです。
例えば、

mat[1, 3] <- NA

等とした時には、そのまま上記プログラムを走らせると最後までNA表記となり、やりたいことができません。
4で割るのではなく、そのときだけ上記例ですと3で割ってほしいのですが、複雑で出来ませんでした。
さらに、このデータ、実際は結構大きな行列(6万×3くらいです)ですので出来るだけベクトルで処理したいと思っています。
高速化した例ですと、大変助かります。

どなたか上記の条件で変換が出来る方がいらっしゃいましたら、ご教授頂けると幸いです。

  • 以下のようなプログラムを書けば簡単です。行列の添え字に,小行列を得るために i1:i2, j1:j2 のようなのが使えることと,NA を除外して平均値をとるために na.rm という引数があることがポイントですね。質問にあったようなデータから,下の例のように mat を作り直すのはあなたがやってください(簡単です)。関数の第二引数に,貴方の言うような 4, 9, 16 のようなまとめ上げるセルの数を指定してください(平方根で指定する方が間違いないけど)。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-13 (水) 17:26:23
    関数
    func <- function(mat, n2)
    {
    	n <- sqrt(n2)
    	nr <- nrow(mat)
    	nc <- ncol(mat)
    	stopifnot(nr%%n == 0 && nc%%n == 0)
    	ans <- NULL
    	for (j in 0:(nc%/%n-1)*n) {
    		ind.j <- (j+1):(j+n) # j+1 から j+n までの列
    		for (i in 0:(nr%/%n-1)*n) {
    			ind.i <- (i+1):(i+n) # i+1 から i+n までの行
    			ans <- c(ans, mean(ind.i), mean(ind.j),
                                    mean(mat[ind.i, ind.j], na.rm=TRUE))
    		}
    	}
    	return(data.frame(matrix(ans, ncol=3, byrow=TRUE)))
    }
    実行例
    mat <- matrix(1:108, 9, 12)
    mat[4,5] <- mat[7,3] <- mat[9,6] <- NA # 欠損値を適当にちりばめる
    mat
    (ans <- func(mat, 9)) # 9×12 行列を,3行×3列単位でまとめる
    実行結果
    > mat
          [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
     [1,]    1   10   19   28   37   46   55   64   73    82    91   100
     [2,]    2   11   20   29   38   47   56   65   74    83    92   101
     [3,]    3   12   21   30   39   48   57   66   75    84    93   102
     [4,]    4   13   22   31   NA   49   58   67   76    85    94   103
     [5,]    5   14   23   32   41   50   59   68   77    86    95   104
     [6,]    6   15   24   33   42   51   60   69   78    87    96   105
     [7,]    7   16   NA   34   43   52   61   70   79    88    97   106
     [8,]    8   17   26   35   44   53   62   71   80    89    98   107
     [9,]    9   18   27   36   45   NA   63   72   81    90    99   108
    > (ans <- func(mat, 9))
       X1 X2     X3
    1   2  2 11.000
    2   5  2 14.000
    3   8  2 16.000
    4   2  5 38.000
    5   5  5 41.125
    6   8  5 42.750
    7   2  8 65.000
    8   5  8 68.000
    9   8  8 71.000
    10  2 11 92.000
    11  5 11 95.000
    12  8 11 98.000
    性能評価
    > mat <- matrix(1:(500*500), 500) # セル数が25万
    > system.time(func(mat, 4)) # これが,一番時間のかかる場合(単位は秒)
       ユーザ   システム       経過  
        35.414     49.723     85.492 
    > system.time(func(mat, 25))
       ユーザ   システム       経過  
         1.599      1.213      2.886 
    > system.time(func(mat, 100))
       ユーザ   システム       経過  
         0.277      0.030      0.407
    
  • 河童の屁は,河童にあらず,屁である。さん、早速の回答をありがとうございました。 以下、確認と改造プログラムです。
    ###作成して頂いたfuncへ自分のデータを変換###
    > mat2 <- data.frame(expand.grid(x=1:6, y=1:4), z=1:(6*4))
    > mat3 <- matrix(mat2[, 3], 6, 4)
    > func(mat3, 4) #確認
       X1  X2   X3 
    1 1.5 1.5  4.5 
    2 3.5 1.5  6.5
    3 5.5 1.5  8.5
    4 1.5 3.5 16.5
    5 3.5 3.5 18.5
    6 5.5 3.5 20.5
    上記の変換で、作っていただいた関数用にデータ加工する方法はわかりました。本当にありがとうございました。ただ、実際のデータは座標が1から始まらないので変換する必要がありました。座標系を適当に1から与えてサンプルプログラムを提示した私のミスです。申し訳ありません。そこで、1から始まらない座標系にも作っていただいたプログラムが適用できる様に、以下のようなfunc2を作成してみました。
    > ###1から始まらない座標系を与える###
    > mat4 <- data.frame(expand.grid(x=seq(11, 16),  
    +                                y=seq(3, 6)), z=1:24)
    >
    > ###番地を付け足す###
    > mat5 <- data.frame(mat4, expand.grid(x2=1:length(levels(as.factor(mat4[, 1]))), 
    + y2=1:length(levels(as.factor(mat4[, 2])))
    +         ))
    >
    > ###座標を元の座標に戻すように改造###
    > func2 <- function(mat, n2, MAT)
    + {
    + n <- sqrt(n2)
    + nr <- nrow(mat)
    + nc <- ncol(mat)
    + stopifnot(nr%%n == 0 && nc%%n == 0)
    + ans <- NULL
    + for (j in 0:(nc%/%n-1)*n) {
    + ind.j <- (j+1):(j+n) # j+1 から j+n までの列
    +             for (i in 0:(nr%/%n-1)*n) {
    + ind.i <- (i+1):(i+n) # i+1 から i+n までの行
    +
    + ###合致するものをsubsetで探してくる###
    + ans <- c(ans, mean(MAT[ind.i, 1]), mean(  
    +                                      subset(MAT[, 2],   
    +                                      MAT[, 4]==ind.i&MAT[, 5]==ind.j)), 
    +                                 mean(mat[ind.i, ind.j], na.rm=TRUE))
    + }
    + } 
    + return(data.frame(matrix(ans, ncol=3, byrow=TRUE)))
    + }
    ###整合性の確認###
    > func(mat3, 4)     
       X1  X2   X3
    1 1.5 1.5  4.5
    2 3.5 1.5  6.5
    3 5.5 1.5  8.5
    4 1.5 3.5 16.5
    5 3.5 3.5 18.5
    6 5.5 3.5 20.5
    ###整合性の確認###
    > func2(mat3, 4, mat5)
        X1  X2   X3
    1 11.5 3.5  4.5
    2 13.5 3.5  6.5
    3 15.5 3.5  8.5
    4 11.5 5.5 16.5
    5 13.5 5.5 18.5
    6 15.5 5.5 20.5
    > 性能評価
    > mat <- data.frame(expand.grid(x=101:600, y=101:600),z=1:(500*500))
    > mat2 <- matrix(mat[, 3], 500, 500)
    > mat3 <- data.frame(mat, expand.grid(x2=1:as.numeric(summary(as.factor(mat[, 1]))[1]), 
    +                                     y2=1:as.numeric(summary(as.factor(mat[, 2]))[1])
    +         ))
    >
    > system.time(func2(mat2, 4, mat3))  
     ユーザ   システム       経過     
     539.02       0.12     539.36 #約9分かかります。
    > system.time(func2(mat2, 25, mat3))   
    ユーザ   システム       経過       
     83.35       0.00      83.35 
    > system.time(func2(mat2, 100, mat3))  
     ユーザ   システム       経過      
     20.77       0.00      20.77 
    もう目的は十分達成されていると思うので、お時間があれば、で構いません。 もし、座標を元に戻すやり方をもっと早く処理する方法をご存じの方がいらっしゃいましたらご教授頂ければ幸いです。 -- Saito? 2010-10-14 (木) 14:17:19
  • 簡単な話。行と列の座標値をベクトルに入れて,関数の引数に加え,座標の平均値を計算するときに,その座標値を使うようにするだけ。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-14 (木) 14:42:36
    func <- function(mat, rv, cv, n2) # ★★ rv, cv を追加
    {
    	n <- sqrt(n2)
    	nr <- nrow(mat)
    	nc <- ncol(mat)
    	stopifnot(nr%%n == 0 && nc%%n == 0)
    	ans <- NULL
    	for (j in 0:(nc%/%n-1)*n) {
    		ind.j <- (j+1):(j+n) # j+1 から j+n までの列
    		for (i in 0:(nr%/%n-1)*n) {
    			ind.i <- (i+1):(i+n) # i+1 から i+n までの行
    			ans <- c(ans, mean(rv[ind.i]), mean(cv[ind.j]), # ★★ rv, cv の平均を求める
                                    mean(mat[ind.i, ind.j], na.rm=TRUE))
    		}
    	}
    	return(data.frame(matrix(ans, ncol=3, byrow=TRUE)))
    }
    #実行例
    mat <- matrix(1:108, 9, 12)
    mat[4,5] <- mat[7,3] <- mat[9,6] <- NA # 欠損値を適当にちりばめる
    rv <- c(1,3,6,9,11,20,27,35,42) # ★★ 行方向の座標ベクトル(下の mat の表示の表側を参照)
    cv <- c(2,4,6,7,8,11,13,16,19,22,25,27) # ★★ 列方向の座標ベクトル(下の mat の表示の表頭を参照)
    rownames(mat) <- rv # これは付けなくても良いけど
    colnames(mat) <- cv # 〃
    mat
    (ans <- func(mat, rv, cv, 9)) # 9×12 行列を,3行×3列単位でまとめる
    
    > mat
       2  4  6  7  8 11 13 16 19 22 25  27
    1  1 10 19 28 37 46 55 64 73 82 91 100
    3  2 11 20 29 38 47 56 65 74 83 92 101
    6  3 12 21 30 39 48 57 66 75 84 93 102
    9  4 13 22 31 NA 49 58 67 76 85 94 103
    11 5 14 23 32 41 50 59 68 77 86 95 104
    20 6 15 24 33 42 51 60 69 78 87 96 105
    27 7 16 NA 34 43 52 61 70 79 88 97 106
    35 8 17 26 35 44 53 62 71 80 89 98 107
    42 9 18 27 36 45 NA 63 72 81 90 99 108
    > (ans <- func(mat, rv, cv, 9)) # 9×12 行列を,3行×3列単位でまとめる
              X1        X2     X3
    1   3.333333  4.000000 11.000
    2  13.333333  4.000000 14.000
    3  34.666667  4.000000 16.000
    4   3.333333  8.666667 38.000
    5  13.333333  8.666667 41.125
    6  34.666667  8.666667 42.750
    7   3.333333 16.000000 65.000
    8  13.333333 16.000000 68.000
    9  34.666667 16.000000 71.000
    10  3.333333 24.666667 92.000
    11 13.333333 24.666667 95.000
    12 34.666667 24.666667 98.000
  • 出来ました。以下確認です。
    > mat2 <- data.frame(expand.grid(x=11:16, y=3:6), z=1:(6*4))
    > mat3 <- matrix(mat2[, 3], 6, 4)
    > rv <- c(11:16)
    > cv <- c(3:6)
    > func(mat3, rv, cv, 4) #確認
        X1  X2   X3
    1 11.5 3.5  4.5
    2 13.5 3.5  6.5
    3 15.5 3.5  8.5
    4 11.5 5.5 16.5
    5 13.5 5.5 18.5
    6 15.5 5.5 20.5
    自分の実際のデータに適用しても上手く動きました。非常に勉強になりました。重ね重ね、本当にありがとうございました。-- Saito? 2010-10-14 (木) 18:45:12

ポリコリック相関係数行列の算出について

JJ? (2010-10-12 (火) 20:17:51)

まったくの初級者です。
ポリコリック相関係数を用いた因子分析(最尤法、プロマックス)を3日間ほど悩んでいます。最終的に因子得点も算出したいと思っています。
現在までのところ、
factanal(covmat=cor(データ), factors=3,promax,regression)

という感じまでは来たのですが。。。数字は出ますが、これは一般の因子分析なのかと思っています。

ちなみにpolychor(x,y,)関数の場合、相関係数にはなので、相関係数行列にはなりませんよね。

まことに見当はずれかもしれませんが、誰か力を貸していただければありがたいです。
上記の corのままでは

  • 投稿途中で送信しちゃいましたか?
    「相関係数にはなので、相関係数行列にはなりませんよね」。。。よくわからないですね。
    どう言うところに,どういう風に力を貸したらよいのかよくわかりましぇん。(^_^;) -- 河童の屁は,河童にあらず,屁である。? 2010-10-12 (火) 21:24:46
  • すみません途中で切れてしまいました。当方も統計、Rともに初心者で、試行錯誤しながら行っていてホームページを見ていてもよくわかからないところがあります。 ポリコリック相関係数を用いた因子分析を行いたいと思っているのですが、自分なりに試行錯誤してみて、作成したのが下のコマンドです。 factanal(polychor(データ),factors=2,rotation=promax,scores="regression") データは、もともとの生データで17項目の質問紙となります。 ただ、このコマンドを実行してもpolychorは、相関係数を算出する関数ですので、やはり無理です。ここの部分がどうしても上手くいかず、お知恵を拝借したいと思っております。 本来そこに入るのは、ポリコック相関係数ではなく、相関係数行列なのかと思うのですが、そのコマンドがわからずに右往左往しています。よろしくお願いします。 -- JJ? 2010-10-12 (火) 21:42:07
  • 「このコマンドを実行してもpolychorは、相関係数を算出する関数ですので、やはり無理です。」
    なにが無理なんですか?そのようにすれば,相関係数行列はポリコリック相関係数行列になっているんじゃないのですか?なってないとすれば,何になっていると思うのですか?
    どういうことをやって,どういう結果が出て,その結果をみてどこがどう期待に添わないのか,はっきり述べる必要があると思いますよ。(初心者だからと言うのは言い訳にならないと思いますよ) -- 河童の屁は,河童にあらず,屁である。? 2010-10-12 (火) 22:12:58
  • そうですね。できる限り正確に説明します。 もともと生のデータ17項目から、ポリコリック相関係数を利用した因子分析を行おうと考えました。 試行錯誤して、Rを利用した因子分析の基本はなんとか理解したつもりですが、どうしても、ポリコリック相関係数行列のコマンドがわかりません。 ↓のコマンドは実行しても“因子分析には最低3つの項目が必要です)となってしまいます。 actanal(polychor(生データ),factors=2,rotation=promax,scores="regression") ですから、↑の図の”polychor(生データ)”の部分では、相関係数行列を表しているのではなく、相関行列係数を表しているだけなのだろうと理解しています。 なんとか、この部分が相関係数行列とできるようなコマンドを教えていただければ幸いです。 -- JJ? 2010-10-12 (火) 23:07:02
  • psychパッケージのpolychoric関数ではどうでしょう? -- 2010-10-12 (火) 23:22:16
  • 返信ありがとうございます。すぐに行ってみたのですが、 factanal(polychoric(生データ), factors = 2, rotation = promax, scores = "regression") : 因子分析法は数値変数にしか適用できません  との結果でした。私の入力が間違いならば本当に申し訳ありません。 -- JJ? 2010-10-12 (火) 23:34:30
  • 謝る前に色々試したりヘルプを読んだほうがいいですよ。polychoric関数が返すオブジェクトはリストなのでそのまま代入してもエラーになるのは当たり前です。 -- 2010-10-13 (水) 00:18:53
  • かなり読んだつもりですが、まだわかりません。 factanal(covmat=(polychoric(生データ),factors=2,promax,scores="regression")  としてこのcovmat=polychoricで相関行列を入れて因子分析できるという認識なのですが、'covmat' は有効な共分散リストではありません。と出てしまいます。もちろん、ヘルプも見ましたが。その他いろいろ試行錯誤したところ、”covmatが未知です”というメッセージや、”XtoYの形式にしろ”というエラーになります。思いつく限りはやってみましたが、どこかで重要な間違いを犯しているのでしょうか。 -- JJ? 2010-10-13 (水) 01:34:50
library(psych)
library(polycor)
data(bfi)
dat <- bfi[1:17] # 17項目のデータ
pcr <- polychoric(dat)
pcr # polychoric関数はrhoやtauといった複数の値を返す。polychoric関数のヘルプ参照
ans <- factanal(covmat=pcr$rho, factors=2, rotation="promax")
ans
  • ポリコリック相関行列からfactanal関数で探索的因子分析を行い、因子得点を算出する方法はわかりません。ごめんなさい。 -- 2010-10-13 (水) 02:28:49
  • 上のプログラム,コピーペーストしたらちゃんと結果が出ますけど?あなたがやったらどうなったのですか。エラーが出たなら,その様子をそのままコピーペーストした方が,あなたがあれこれ書くよりはっきり分かると思うんですけどね。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-13 (水) 08:35:16
  • お二人ともありがとうございました。非常に勉強になりました。 -- JJ? 2010-10-13 (水) 09:04:56

続いている数字の数を出力する方法

sayaka? (2010-10-12 (火) 14:05:00)

以前、「T,Fを文字列として出力するには」でお世話になりました。
うまく説明するのが難しいのですが、下記の data のようなベクトルがあるとき、399,400,401・・のように数値が続いている場合に"何個続いているか"を下記の a のように出力したいと考えているのですが、どのようにすれば求めることが出来るでしょうか。
いろいろと試行錯誤したのですが、どうしても思いつきません。
data はあるデータ中のエラーデータの行番号を抽出したもので、エラーデータの開始位置と長さより削除するプログラムがあるために長さが必要です。
開始位置は下記のposiで求めました。
どうぞよろしくお願いします。

> data
 [1]  14  41  73 152 296 297 399 400 401 402 418 419 420 421 422 423 424 425 426 427 428 429
[23] 430 431 451 452 453 454 460 461 466 500 501 502 503 504 505 506 507 508
> posi <- data[diff(c(0,data)) != 1]
> posi
 [1]  14  41  73 152 296 399 418 451 460 466 500
> a
 [1]  1  1  1  1  2  4 14  4  2  1  9
  • どっかのパッケージに関数がありそうだけど、 table(c(0,cumsum(1-(diff(data)==1)))) で。 -- 2010-10-12 (火) 15:01:31
  • ありがとうございます!table()を使ってこんなことが出来るなんて目から鱗です!これは自分では逆立ちしたって絶対思いつけないと思いました。もっとよく勉強します! -- sayaka? 2010-10-12 (火) 15:43:30

RとWindows 7の相性

菊亭? (2010-10-06 (水) 22:12:34)

現在XPでRを使っております。そのうち7にアップグレードしょうかと画策中ですが、VistaとRの相性がかなり悪かった(というかVistaが酷かった)記憶があります。7とRには既知の問題はありますでしょうか?

  • 「UAC無効」にして「管理者権限で実行」すればたいして問題なかったような。それよりWin7自体になれるのが一苦労。ネットワーク設定周りとか。 -- okinawa 2010-10-07 (木) 14:15:29

plotirxのcolor2D.matplotの色表示について

ランゲル・ハンス? (2010-10-02 (土) 09:51:51)

plotrixにあるcolor2D.matplot関数について質問させていただきます。

library(plotrix)
x <- c(1, 0, 10, 5, 3, 6, 4, 5, 4, 3, 8, 5, 1, 0, 7, 5)
data <- matrix(x, ncol=4)
color2D.matplot(data, c(1, 0), c(0, 1), c(0, 1), show.values=TRUE)

このmatirixの数値をカラー表示のマトリックスに変換して数値も表示したいと思います。
上記の例では変換できるのですが、マイナスがある場合のスケール変換の方法と色表示の方法をご教示いただけないでしょうか?
例えばyの場合について

y <- c(1, 0, 10, 5, -3, 6, -4, 5, 4, 3, 8, 5, 1, 0, 7, 5)

よろしくお願いします。

  • 何をどうしたいのか、具体的に示すことはできませんか?あなたの例示されたyをそのままマトリクスにしてcolor2D.matplotした結果は、どこが問題なのでしょうか。どういう結果が得たいのだけど、どうすると、どうなってしまうのか、具体的に書かれた方がよいと思います。 -- 2010-10-02 (土) 10:29:33
  • すみません。yをcolor2D.matplot()でマトリックスを色分けしたいのですが、マイナスが入っているせいか、そのままではうまくいきません。マイナスをスケール変換してから、マトリックスを色分けしたいと思います。よろしくお願いします。 -- ランゲル・ハンス? 2010-10-02 (土) 14:37:49
  • ですから、「うまくいかない」というのは*具*体*的*に*どのようになることをおっしゃているのでしょうか。上記のyをマトリクス化してxと同様にプロットすると、小さい数字ほど赤く、大きい数値ほど水色で、数値もちゃんと書かれた状態でプロットされるのですが。 -- 2010-10-02 (土) 15:03:26
  • コメント遅くなり申し訳ありません。yは私の手違いでplotできました。大変失礼しました。 -- ランゲル・ハンス? 2010-10-04 (月) 08:50:16

psych パッケージの factor.pa の結果表示

隣は何をする人ぞ? (2010-10-01 (金) 21:34:02)

psych パッケージを使って因子分析を行ったとき、因子負荷量の大きい順にソートしたときとしなかったときで、因子負荷量の値が異なったものが表示されます。単に因子単位に因子負荷量の絶対値の大きい順に並べ替えて表示するだけだと思うのですが、なぜ因子負荷量の値が異なるのでしょうか。訳がわかりません。

library(psych)
data(bfi)
fa.parallel(bfi)
fpa.out <- factor.pa(bfi, nfactors=3, rotate="promax")
print(fpa.out) # 分析に使用した変数順そのまま
print(fpa.out, sort=TRUE) # 因子負荷量の大きい順に並べ替える

で分析を行いました。並び順は異なっても、各変数の因子負荷量は同じはずです。
まず、print(fpa.out) の結果です。いくつかの変数だけを選択して掲載します。

########## デフォルト(sort=FALSE)のとき
> print(fpa.out)
Factor Analysis using method =  pa
Call: factor.pa(r = bfi, nfactors = 3, rotate = "promax")
Unstandardized loadings based upon covariance matrix
            PA1   PA2   PA3     h2   u2     H2   U2
A1        -0.22  0.08  0.01 0.0600 0.94 0.0600 0.94
  :
E4         0.74 -0.06 -0.15 0.4823 0.52 0.4812 0.52
  :
gender     0.20  0.15  0.00 0.0490 0.95 0.0490 0.95
education -0.03 -0.04  0.10 0.0099 0.99 0.0099 0.99
age        0.04 -0.09  0.14 0.0398 0.96 0.0398 0.96

                PA1  PA2  PA3
SS loadings    3.30 2.66 2.15
Proportion Var 0.12 0.09 0.08
Cumulative Var 0.12 0.21 0.29

 Standardized loadings
          item   PA1   PA2   PA3     h2   u2
A1           1 -0.22  0.08  0.01 0.0600 0.94
  :
E4          14  0.73 -0.06 -0.15 0.4812 0.52
  :
gender      26  0.20  0.15  0.00 0.0490 0.95
education   27 -0.03 -0.04  0.10 0.0099 0.99
age         28  0.04 -0.09  0.14 0.0398 0.96

次に、print(fpa.out, sort=TRUE) の結果です。

########## sort=TRUE を指定したとき
> print(fpa.out, sort=TRUE)
Factor Analysis using method =  pa
Call: factor.pa(r = bfi, nfactors = 3, rotate = "promax")
Unstandardized loadings based upon covariance matrix
            PA1   PA2   PA3     h2   u2    H2   U2
E4         0.74 -0.06 -0.15 0.4823 0.94 0.339 0.66
  :
A1        -0.22  0.08  0.01 0.0600 0.73 0.076 0.92
gender     0.20  0.15  0.00 0.0490 0.58 0.078 0.92
  :
age        0.04 -0.09  0.14 0.0398 0.99 0.039 0.96
education -0.03 -0.04  0.10 0.0099 0.96 0.010 0.99

                PA1  PA2  PA3
SS loadings    3.30 2.66 2.15
Proportion Var 0.12 0.09 0.08
Cumulative Var 0.12 0.21 0.29

 Standardized loadings
          item   PA1   PA2   PA3    h2   u2
E4          14  0.62 -0.05 -0.12 0.339 0.66
  :
A1           1 -0.25  0.09  0.01 0.076 0.92
gender      26  0.25  0.19  0.00 0.078 0.92
  :
age         28  0.04 -0.09  0.13 0.039 0.96
education   27 -0.03 -0.04  0.10 0.010 0.99

Unstandardized loadings based upon covariance matrix については、並べ替えしてもしなくても、各変数の因子負荷量は同じです(これが当たり前だと思います)。
Standardized loadings については、並べ替えしたのとしないとでまるっきり違うものが表示されています。
なぜでしょう。
一応、psych クラスの print メソッド(psych:::print.psych) のソースもたどっては見たのですけど、明らかなバグというのではなく、書かれているプログラムがなぜそのようなパスをたどらなければならないのかがよくわかりませんでした(それ自身がバグと言うことなのかも知れませんが)。
多くの人が使っているパッケージなので、いまだにバグがあるとも思えませんが、不思議に思いましたので質問させて頂きます。

  • バグだと思います。psych:::print.psych.faの中を調べてみましたが、sqrt(h2+u2)で割って標準化しているようです。sort=TRUEの際にh2はソートされたものを使用しているのに対し、u2はソートされていないものを使用しています。そのために数値に食い違いが生じているのではと思います。ここからは一エンドユーザーとしての個人的意見ですが、「Rはたくさんの人が使っているから計算に信頼性がある」というような売り文句がありますけど嘘とは言わないまでも、言いすぎですね。私も含めた大半の一ユーザーはフリーだから使っているのであって、他人の作ったパッケージや関数のバグチェックなんてする人はごくわずかでしょう。 -- aor? 2010-10-07 (木) 15:32:33
  • 作者からやっと回答がありました。
    I finally  had time to find the bug.  It was not in factor.pa as I had hoped, but it was in
    the print routine which thus affected fa, as well as factor.pa.
    
    The sorted loadings are now sorted correctly, as are the communalities and uniquenesses.
    
    I have fixed this for version 1.0.93 which should be released sometime soon.
    だそうです。 -- 隣は何をする人ぞ? 2010-11-28 (日) 23:12:19

Rの実行を中断する方法

のの (2010-09-29 (水) 02:16:00)

MacでGUI版Rを使っています。version.string R version 2.11.1 (2010-05-31)
エディタにコマンドを連ねて、メニュー>編集>実行をする場合、途中でエラーがあっても、止まらずに最後まで流れてしまいます。
コマンドリストの任意の場所でRの実行を止める方法を探しています。
readline(),stopifnot()などを試しましたがだめでした。
今のところquit()を入れると、そこで、保存するかどうか聞いてくるので目的は達成できているのですが、何かもっと良い方法はないでしょうか?

  • try 関数を使うのが一つの方法。warning もエラーとして捉えるには options(warn=2) をしておく。例に示したように,実行したいプログラムの前後を try({ old <- options(warn=2) と options(old) }) でくくれば良いでしょう(warn の設定と解除を毎回行うのは無駄なので,old <- options(warn=2) と options(old) は,場合によっては try 関数の外で一回ずつやる方がよいこともあるが)。
    > try({ old <- options(warn=2) # これと,
    +     a <- sqrt(-9)
    +     print(,)
    +     print("ok")
    + options(old) })              # これの対で囲む
    Error in sqrt(-9) :            # 最初のエラーでストップ
       (警告から変換されました)  計算結果が NaN になりました  
    > try({ old <- options(warn=2)
    +     a <- sqrt(9)             # 修正した
    +     print(,)
    +     print("ok")
    + options(old) })
    Error in .Internal(print.default(x, digits, quote, na.print, print.gap,  : 
       'x'が見つかりません         # 二番目のエラーでストップ
    > try({ old <- options(warn=2)
    +     a <- sqrt(9)
    +     print(a)                 # ここも直した
    +     print("ok")
    + options(old) })
    [1] 3                          # 全部うまくいった
    [1] "ok"
    その他に,tryCatch, withCallingHandlers?, signalCondition, simpleError, simpleWarning, conditionCall, conditionMessage, withRestart, computeRestarts, findRestart, invokeRestart, invokeRestartInteractively?, isRestart, restartDescription, restartFomals, .signalSimpleWarning?, .handleSimpleError? などを調べると良いでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2010-09-29 (水) 12:26:45
  • お礼が遅くなりました。詳細にありがとうございます。 -- のの 2010-09-30 (木) 04:10:59
  • 多分、質問の仕方が分かりにくかったと思います。やりたかったのは、Rのエディタに複数行のコマンドを書き込んで、メニュー>編集>実行(Macならcommand+return,PCならControl+Rがショートカット)をすると、途中でエラーを起こすコマンドがあっても、エラー表示はされますが、そのまま次のコマンドが実行され、結果として最後のコマンドまで実行されてしまいます。やりたいのは 、どこかRの実行を止めたい場所に簡単な命令文か何かを入れて、エラーなどを起こさせて、強制的にそこで止まるようにしたいのです。止めたい場所にq()を入れると保存するかどうかの別ウインドウが開くので一応目的は達成できています。河童さんのコメントを見て次に思いついたのが
    while(1){     #エディタの最初に記載
    + ここから実行するコマンドリスト
    + 次のコマンド・・・
    + break      #ここでRの実行を止める
    + 結果として実行されないコマンド
    + break;}  #もし途中にbreakがない場合にはここで終了
    このような方法も思いつきましたが、コマンドの結果を出力させるためにcat()を使わないといけなかったりと面倒な感じです。もう少し軽やかな方法があればと思っています。 -- のの 2010-09-30 (木) 04:56:16
  • 途中で止められれば,エラーじゃなくてもいいんですね。では,選択範囲を実行ではダメなんですか? -- 2010-09-30 (木) 10:23:38
  • 上の try の 2 番目の例のように,止めたいところにエラーを含む文を書いておけばよいでしょう。print(,) などでもよいけど,エラーじゃないものと言うことなら,signalCondition(simpleError("Halt")) とか(表示は Error : Halt になるけど)。
    それとも,止めた後,実行継続をするかどうか判断できるようにしたいということ?だったら,debug でブレークポイントを設定する。
    重箱の隅つつきをするなら,while ループにして break を挿入するのは,そこで止めているわけではなく,制御を変えているだけ(while ループを抜ける)。 「コマンドの結果を出力させるためにcat()を使わないといけなかったりと面倒」それを面倒がってはいけないでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2010-09-30 (木) 10:28:02
  • ご質問の内容を正しく理解できているか分からないのですが...Rエディタの[編集]->[全て実行]は、スクリプトを1行1行コピーしてコンソールに貼り付けているのと同じですから、エラーが生じた行以降も順次ペーストされて実行されてしまう、ということがご不満なのではないでしょうか。Rエディタに
    print(1)
    print() # Error
    print(2)
    と書いて[全て実行]すると、
    > print(1)
    [1] 1
    > print() # Error
     以下にエラー print.default() : 
       要素 1 は空です; 
    > print(2)
    [1] 2
    のように、エラー以降のprint(2)も実行されてしまう、と。 これを解決したいということであれば、単純にスクリプト全体をプロック化して
    {
    print(1)
    print() # Error
    print(2)
    }
    のようにするのはいかがでしょう。括弧が閉じたところでスクリプトが実行され、エラーが起こるとブロック全体が止まります。
    > {
    + print(1)
    + print() # Error
    + print(2)
    + }
    [1] 1
     以下にエラー print.default() : 
       要素 1 は空です; 
    > # print(2)は実行されていない
    もちろんこんなことせずとも、全体をファイルに保存してからsourceすれば、エラーの部分で止まって以降の処理は行なわれないわけですが。どうしても[全て実行]を使いたいということであれば、この方法が楽かと思います。 -- 2010-09-30 (木) 16:22:26
  • 皆様、色々とコメントありがとうございました。とても勉強になりました。質問の意図は、2010-09-30 (木) 16:22:26さんのおっしゃる通りで、ブロック化をすることで目的は達成できました。ただ、この方法では、コマンドと結果が一対一では表示されないので、私の望む結果ではありませんでした。今のところの最善策は、2010-09-30 (木) 10:23:38さんのおっしゃる通り、止めたい場所の直前まで選択して選択した部分だけを実行するか、先に私が書いた、q()を止めたい場所に書き込む方法が良いのかと考えています。色々混乱させて済みませんでした。 -- のの 2010-10-01 (金) 11:57:43
  • 余談ですが、今MacとWinのGUI版Rを使った生物統計の講座を企画しています。予想以上にMacとWinのGUI版Rの性質が違い、できるだけ共通したマニュアル作成が出来ないか模索しているところです。 -- のの 2010-10-01 (金) 12:02:40

パッケージのロードは起動後毎回必要ですか

shumei? (2010-09-25 (土) 14:33:13)

Mac版R 2.11.1 をインストールした後、パッケージurcaをインストールしました。
urcaをロードし、パッケージの使用はできましたが、Rを起動するたびに未ロード状態にもどってしまいます。
何冊か書籍に当たってみましたが、該当する記述が見つからず、こちらに投稿させて頂きます。
パッケージのロード状態を維持するにはどうすればいいのでしょうか。それとも、これはRの仕様なのですか?
ご教授下さい。どうぞよろしくお願い致します。

  • 「パッケージのロードは起動後毎回必要ですか」 はい,毎回必要です。
    R を起動するたびに,自動的にロードしたいならば,ホームディレクトリの .Rprofile に, library(urca) 等と書いておけばよいです(.Rprofile がなければ,作る)。この .Rprofile は,R が起動されるときに実行されるので,そのほかにも毎回何かやりたいことがあるなら,このファイルに書き込んでおけばよいのです。
    どうやって .Rprofile を弄るかはわかるでしょうかね?「ターミナル」を起動し,適当なエディタ(vi など)で作ります。 -- 河童の屁は,河童にあらず,屁である。? 2010-09-25 (土) 14:56:24
  • 早速教えて頂き、ありがとうございます。パッケージのロードは毎回必要なんですね。 .Rprofileというのは、Macの場合ライブラリの下の方にある、Rprofile.site.のことでしょうか。ファイル内に、 library(urca)、ないし、setHook(packageEvent("urca","onLoad") と書き込んでみましたが、自動的にロードされません。 -- shumei? 2010-09-25 (土) 17:17:52
  • 「.Rprofileというのは、Macの場合ライブラリの下の方にある、Rprofile.site.のことでしょうか。」
    素直じゃないですね(^_^;)
    「ホームディレクトリの .Rprofile に, library(urca) 等と書いておけばよい」と書いたでしょう?
    なぜにして,Rprofile.site だと思ったのですか? -- 河童の屁は,河童にあらず,屁である。? 2010-09-25 (土) 17:50:25
  • ごめんなさい。先週初めてRをさわり始めたもので、右も左も分からない駆け出しもの状態です。
    ホームディレクトリに.Rprofileを作成しましたら、無事作動しました。
    ありがとうございました。 -- shumei? 2010-09-25 (土) 19:31:55
  • /.Rprofileと教えるところを単に.Rprofileと書くと、説明された方は?.Rprofileを参照して、R_HOME/etc/Rprofile.siteのことではないかと思う人もいるだろう -- 2010-10-02 (土) 14:33:58

ヒストグラムの階級分割

moyu? (2010-09-21 (火) 14:54:22)

ヒストグラムで、ある一部の区間において細かく階級を分割したいのですが、どうしたらいいのか分かりません。ちなみに以下の操作をしました。

hangseng = read.csv("ASIA/hangseng/hangsengdaily-1986dec31~2010jun11.csv")
hangseng.ts = ts(rev(hangseng$Close),start=c(1986,12,31),frequency=248)
ts.plot(hangseng.ts)
ts.plot(diff(hangseng.ts))
hist(diff(hangseng.ts),breaks=30,col="magenta")

histの中のbreaksをどういじったらいいのでしょうか??

  • ? hist で breaks の項を読みませんでしたか?
    breaks
      one of:
      ・ a vector giving the breakpoints between histogram cells,
      ・ a single number giving the number of cells for the histogram,
      ・ a character string naming an algorithm to compute the number of cells (see ‘Details’),
      ・ a function to compute the number of cells.
     In the last three cases the number is a suggestion only.
    あなたが指定した breaks=30 は,この中の 2 番目のものですよね。一番目の指定方法をとらないとね。どうやって良いかそれでもわからない?下の方の,Example の項にいくつか例があり,そのうちの breaks=c(12,20,36,80,200,1000,17000) というのがそれですよ。-- 河童の屁は,河童にあらず,屁である。? 2010-09-21 (火) 17:10:12
  • 回答ありがとうございます。助かりました。しかし上で示されている「histのbreaksの項」はどこから見ることが可能ですか?見方が分からないのでそれも教えていただいてよろしいですか? -- moyu? 2010-09-22 (水) 12:51:59
  • オンラインヘルプの見方分かりませんか?コンソールに "? hist" (引用符を除き,クエスチョンマークとhist)を入力すると,オンラインヘルプのウインドウが開きませんか?その中に,関数の説明が書かれています。その中に,引数 breaks の説明も,例 Example もあります。 -- 河童の屁は,河童にあらず,屁である。? 2010-09-22 (水) 16:16:46

embedFontsで「・」が表示される

初級者です。? (2010-09-20 (月) 18:11:38)

CentOS 5.5 に Rをインストールし、以下の操作をしました。

pdf("test.pdf",family="Japan1")
plot(1:10,ylab="test test")
dev.off()
embedFonts("test.pdf")

すると、ylabに指定した"test test"文字列の間にある空白の位置に、「・」が表示されてしまいます。
正確には、"test ・test"という感じで、普通に半角スペースが表示されている上に、若干右側によって「・」が重なっているという感じです。
embedFonts()を呼ぶ前の状態では、「・」は表示されていません。
また、その状態で文章のプロパティから使用されているフォントを見ると、

「KozMinPro-Regular-Acro」
「KozMinPro-Regular-Acro.Bold」
「KozMinPro-Regular-Acro.BoldItalic」
「KozMinPro-Regular-Acro.Italic」
「Symbol」
「ZapfDingbats」

というフォントが使用されていると出ますが、embedFonts()を呼んだ後で同様にフォントを確認すると、「Sazanami-Gothic(埋め込みサブセット)」というフォントが使用されていると出ます。
何らかフォントの設定が足りないとは思い、いろいろ調べてみてはいるのですが、壁に当たった状態です。
同様の現象を解決された方がいらっしゃれば方法をご教示いただけないかと思い、こちらに投稿しました。
よろしくお願いいたします。

  • pdf(file="test.pdf",family="Japan1Ryumin") としたら、上記の現象はなく正常に変換されましたが、理由はよくわかっていません。もし理由をご存知の方がいらっしゃれば、ご教示いただけますと有り難いです。 -- 初級者です。? 2010-09-20 (月) 23:16:06
  • sazanamiがいやんばかんと言うことだったと思いますので, IPAfont等を持って来て(例えば/usr/local/share/fonts/ipafontにほりこむ)もらって, /etc/ghostscript/cidfmap.ja に
    /KozMinPro-Regular-Acro << /FileType /TrueType /Path (/usr/local/share/fonts/ipafont/ipam.ttf) /CSI [(Japan1) 6] >> ;
    みたいに記述すれば良いと思います. -- なかま 2010-09-22 (水) 00:55:05

ヘルプファイルを表示エラー

てるてるぼうず? (2010-09-19 (日) 23:22:48)

関数のヘルプファイルを表示したいと思い、以下を実行するのですが、
?…またはhelp(…)毎回以下のようなエラーが出ます

> ?glm
 警告メッセージ: 
In file.show(temp, title = gettextf("R Help on '%s'", topic), delete.file = TRUE) :
   file.show():ファイル 'C:\DOCUME~1\蜿、蟾晏忽蠢予LOCALS~1\Temp\RtmpIDu7yb\Rtxt678418be' は存在しません 
> help("glm")
 警告メッセージ: 
In file.show(temp, title = gettextf("R Help on '%s'", topic), delete.file = TRUE) :
   file.show():ファイル 'C:\DOCUME~1\蜿、蟾晏忽蠢予LOCALS~1\Temp\RtmpIDu7yb\Rtxt3d6c4ae1' は存在しません 

検索エンジン等で調べてはみましたが、未だ解決していません。
環境は以下の通りです。

Microsoft Windows XP Professional
Version 2002
Service Pack 3
Intel(R) Core(TM)2 Duo CPU
E8400 @ 3.00GHz
2.99 GHz、976 MB RAM

Rのバージョン
R version 2.11.1 (2010-05-31)
  • 再インストールして症状が再現されてからまた質問されては。 -- 2010-09-21 (火) 08:51:59
  • てるてるぼうず再インストール後も同じ状況です。現在は別のパソコンでRを使っています。誰か情報をお持ちでないでしょうか? -- てるてるぼうず? 2011-01-09 (日) 01:55:35

regexprのpatternの文字数によるエラー

sh? (2010-09-16 (木) 11:50:21)

regexpr(pattern, text, perl = T)を実行したところ、以下のエラーが出力されました。patternの文字数(59291文字)を減らせば、正常に動作します。patternの文字数を減らすことなく、正常に動作させることは可能でしょうか?環境は、R version 2.11.1 (2010-05-31); x86_64-apple-darwin9.8.0です。

以下にエラー regexpr(pattern, text, perl = T) : 
追加情報:   警告メッセージ: 
In regexpr(pattern, text, perl = T) :
 PCREパターンのコンパイルエラー
	'regular expression is too large' 
	at ''
  • textの長さは?エラーが起きない程度のpatternの長さは?正規表現使うんですか?マッチが一つでもあることが知りたいのですか、それともマッチした回数も知りたいんですか? -- 2010-09-16 (木) 13:22:48
  • textは、数十個の要素(各要素は10文字程度の長さの文字列)からなるべクトルです。例えば、text = c('AAA1111111', 'AAA1111112', 'AAA1111113', ... ,'AAA1111129')。エラーが起きない程度のpatternの長さは、半分(29645文字)です。正規表現は使いません。patternは、10文字程度の文字列を'|'で連結したものです。例えば、pattern = 'AAA1111111|AAA1111112'。マッチしたべクトルの要素を知りたいので、regexpr(pattern, text, perl=T)>0として、TRUE/FALSEのべクトルを返すようにしています。 -- sh? 2010-09-16 (木) 13:49:37
  • 例えば(簡略化した例です)次のように多段階でマッチングしたらどうですか。 -- 2010-09-16 (木) 14:29:20
    > text
     [1] "A11" "A12" "A13" "A14" "A15" "A16" "A17" "A18" "A19" "A20" "A21" "A22"
    [13] "A23" "A24" "A25" "A26" "A27" "A28" "A29" "A30" "A31" "A32" "A33" "A34"
    [25] "A35" "A36" "A37" "A38" "A39" "A40"
    > text1 <- gsub(pattern = "A11|A15|A20|A27",NA,text) # マッチしたものをNAで置き換え
    > text1
     [1] NA    "A12" "A13" "A14" NA    "A16" "A17" "A18" "A19" NA "A21" "A22"
    [13] "A23" "A24" "A25" "A26" NA    "A28" "A29" "A30" "A31" "A32" "A33" "A34"
    [25] "A35" "A36" "A37" "A38" "A39" "A40"
    > text2 <- gsub(pattern = "A29|A31|A35|A36|A39",NA,text1)
    > text2
     [1] NA    "A12" "A13" "A14" NA    "A16" "A17" "A18" "A19" NA    "A21" "A22"
    [13] "A23" "A24" "A25" "A26" NA    "A28" NA    "A30" NA    "A32" "A33" "A34"
    [25] "A35" NA    "A37" "A38" NA    "A40"
    > is.na(text2)
     [1]  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
    [13] FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE
    [25]  TRUE  TRUE FALSE FALSE  TRUE FALSE
    > text[is.na(text2)]         # マッチした文字列
    [1] "A11" "A15" "A20" "A27" "A29" "A31" "A35" "A36" "A39"
  • これではだめ? -- surg? 2010-09-16 (木) 16:45:45
    > text <- paste('AAA11111', seq(11, 29), sep='')
    > pattern = c('AAA1111111', 'AAA1111112')
    > text %in% pattern
     [1]  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    [12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
  • アドバイスありがとうございます。text %in% pattern または match(text, pattern, nomatch = 0) > 0 で解決しました。 -- sh? 2010-09-16 (木) 23:00:13

read.csv で大きな値を読み込み表示する

g? (2010-09-14 (火) 11:54:44)

例えば,

A,B,C
3121234567890,10,20
3122345678901,20,30
3123456789012,30,40

という中身のcsvファイルa.csvをread.csvで読み込ませると

> read.csv("a.csv")
             A  B  C
1 3.121235e+12 10 20
2 3.122346e+12 20 30
3 3.123457e+12 30 40

となってしまいます.浮動小数点ではなくそのままの形で読み込ませるにはどうしたらいいでしょうか.

  • 計算機による数値計算では扱える最大整数は 2^(31)-1 = 2147483647 ですから、そのまま(i.e. 整数として)読み込むことは不可能です.しかし options(digits=22) とすれば一見整数であるかのように全体を表示してくれませんか。 -- 2010-09-14 (火) 12:14:57
    > (X <- read.csv("a.csv"))
                 A  B  C
    1 3.121235e+12 10 20
    2 3.122346e+12 20 30
    3 3.123457e+12 30 40
    > options(digits=22)
    > X
                  A  B  C
    1 3121234567890 10 20
    2 3122345678901 20 30
    3 3123456789012 30 40
  • read.csv("hoge.csv",colClasses=c("character","integer","numeric")) みたいなのがしたいのかなと思ってみたり, 読みたくないだろうけど, 詳細はヘルプを参照. -- 2010-09-14 (火) 12:30:42
  • > 計算機による数値計算では扱える最大整数は 2^(31)-1 = 2147483647 ですから
    それは,integer のことで,numeric(または double) の有効桁は15,6桁ほどですから,その範囲であれば小数点以下を含まない数「整数」は,ちゃんと誤差なくメモリーに入っています(? integer で,"doubles can hold much larger integers exactly." という文があります)。このような「整数」が浮動小数点表記されるかどうかは指定(指定がなければデフォルト設定)によります。R であれば,digits で指定します。15,6桁を超えればたとえ小数点以下を含まない「整数」であっても,メモリーには「近似値」が格納されます。opsions(digits=22)などとしておくと,22けたくらいまでは表示されますが,末尾の数字は思っているのと違います(近似値ということ)。質問にあるようなデータは何を表しているのかよくわかりませんが,有効数字が15,6桁以上というのは現実的ではないでしょう。金勘定ならば大きな数値が現れるかも知れませんが,そのような場合にはそもそも浮動小数点システムは不適切で,しかるべき固定小数点システムを使う必要があるでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2010-09-14 (火) 12:40:11
    > options(digits=22)
    > 123456789012345
    [1] 123456789012345
    > 1234567890123456
    [1] 1234567890123456
    > 12345678901234567 # 近似による誤差が生じ始める
    [1] 12345678901234568
    > 123456789012345678
    [1] 123456789012345680
    > 1234567890123456789
    [1] 1234567890123456768
    > 12345678901234567890
    [1] 12345678901234567168
    > 123456789012345678901
    [1] 123456789012345683968
    > 1234567890123456789012 # 浮動小数点表示になり始める
    [1] 1.234567890123457e+21
  • digitsの指定で解決しました.ありがとうございました.ちなみにこの数字(本物ではありませんが)は商品コードです. -- g? 2010-09-14 (火) 13:16:51
  • 商品コードならば,数値演算することはないし桁数も一定だろうから,上のコメント「colClasses=c("character","integer","numeric")」のように,文字列として扱うのがよいかも。digits は,他の数値の表現にも作用する。 -- 河童の屁は,河童にあらず,屁である。? 2010-09-14 (火) 13:26:34

plot エラー xy.coords(x, y, xlabel, ylabel, log) : 'x' and 'y' lengths differ

id? (2010-09-12 (日) 21:34:03)

密度関数を直接積分することで、分布関数を求めてプロットしようとしているのですが、うまくいきません。
簡単に書きなおすと以下のようなコードで、実行するとエラーを吐きます。

> pdf <- function(x) exp(-x)
> cdf <- function(x) integrate(f, 0, x)
> plot(cdf)
 以下にエラー xy.coords(x, y, xlabel, ylabel, log) : 
  'x' and 'y' lengths differ

cdf(Inf) などとすると正常な答えを返してくれるので、関数として機能はしているようですがプロットしてくれません。
プロットするにはどうすればよいでしょうか?

ちなみに実際に考えている分布は beta prime distribution です。
この分布の cdf に出てくる 2F1 関数の扱いがわからず、上のような苦肉の策をしようと思っています。

  • 実行環境がそのまま提示されていませんね。以下のようになります。f ってどうなってんでしょう。それと,エラーメッセージはその通りのことを言っているのですから,str(cdf) とか print(cdf) とか,やってみれば,なんかあなたの期待するようにはなっていないと言うことがわかり,エラーの解決に役立つのでは?
    「簡単に書きなおすと」ーーー*簡*単*に*書き直さないで,「やったその通りを提示」した方がよいですね。 -- 河童の屁は,河童にあらず,屁である。? 2010-09-12 (日) 21:42:24
    > pdf <- function(x) exp(-x)
    > cdf <- function(x) integrate(f, 0, x)
    > plot(cdf)
     以下にエラー match.fun(f) :  オブジェクト 'f' がありません
  • うまくいかない理由はあなたの定義した関数はベクトル化されていないからです.plot,curve 関数はまず必要な値を一度に計算し、それを描画するから cdf((0:100)/50) のような使い方ができないといけません(あなたの定義では最初の引数しか評価しない)。ベクトル化するには例えば次のようにします。ここで integrate(...) でなく integrate(...)$value とする理由はこのQ&Aの過去記事を見てください。 -- 2010-09-13 (月) 00:09:31
    > cdf <- function(x) sapply(x,function(t) integrate(pdf,0,t)$value)
  • お返事ありがとうございます&ミス失礼しました。ご教授いただいた通りにしたらうまくいきました。関数のベクトル化という概念があるんですね。ご丁寧にありがとうございました。 -- id? 2010-09-13 (月) 16:13:49
  • beta prime distribution とは X がベータ分布に従う確率変数として Y=X/(1-X) の分布らしいですが,だとすれば P(Y<= t) = P(X<=t/(1+t)) だからベータ分布の累積密度関数 pbeta() で簡単に計算できるのでは? -- 2010-09-13 (月) 16:51:11

pooled adjacent violator algorithmについて

sakura? (2010-09-12 (日) 17:26:35)

Rで、pooled adjacent violator algorithm を使ったライブラリーには何があるのでしょうか?

  • ググるとisotoneが該当しますがこういうことではない? -- tanaka? 2010-09-12 (日) 19:11:40
  • 最初、これかと私も思いましたが、・・・。ひとつの繰返しデータからカットオフの判別ポイントを決めるロジックになっているかどうか・・・。英語力の不足ですが、、、。 -- sakura? 2010-09-12 (日) 20:08:34
  • 「最初、これかと私も思いましたが、」こういう後出しじゃんけん止めませんか。回答者に失礼でしょう。別人かも知れないけど sakura さん名義の質問,いつもこんなふう?次回以降は別名で質問しないと回答ないかも。 -- 河童の屁は,河童にあらず,屁である。? 2010-09-12 (日) 21:26:38
  • 軽率な質問のようですね。毛頭、愉快犯でもないし、まじめに素朴な質問をしたつもりです。そのことで、皆さまに不快感を抱かせてしまうのでしたら、謹慎します。後出しじゃんけんと受け取られる軽率さ、反省します。 -- sakura? 2010-09-13 (月) 22:02:31
  • あなたのことを「愉快犯だ」なんていってません。悲劇のヒロイン(ヒーロー)を気取る必要もありません。謹慎する必要もない。今後また質問するなら,注意した方がいいかなというだけです(上の方の,"質問の作法"に書いてあることです)。 -- 河童の屁は,河童にあらず,屁である。? 2010-09-13 (月) 22:12:23

for文内での連番オブジェクトの記述

mtanaka? (2010-09-07 (火) 20:12:53)

for文で任意の関数に連番で命名したオブジェクトを入力する場合どのように記述すればよいのでしょうか?
for文内でのファイル名の記述様式がわかりません。

関数 func()
オブジェクト(入力データ): hoge01, hoge02, hoge03
オブジェクト(出力データ): piyo01, piyo02, piyo03
実行例
piyo01 <- func(hoge01)
piyo02 <- func(hoge02)
piyo03 <- func(hoge03)

この上記の実行例をfor文で記述したいです。
どなたか、ご助言いただける方がいらっしゃいましたら、宜しくお願いいたします。

  • もしですね,hoge01 から hoge99 まで 99 個あってそれをなんからの処理をして piyo01 から piyo99 まで 99 個の結果を得たとして,それを更に何らかの処理をするとき,いちいち piyoxx を加工して結果を出して,piyoyyを加工して結果を出してってやるんですか?なぜ別々のオブジェクト名にする必要があるんでしょう。扱いづらいことこのうえないでしょう。
    まあ,あえてやるなら方法がないわけではなく,以下のようにすればよいでしょう。
    hoge01 <- 1 # 関数に作用させる対象
    hoge02 <- 2
    hoge03 <- 3
    hoge04 <- 4
    for (i in 1:4) { # それぞれの対象について func を作用させ,結果を格納することの記述
    	eval(parse(text=paste(sprintf("piyo%02i <- func(hoge%02i)", i, i))))
    }
    piyo01 # 結果を参照するときに,一々名前を引用しないといけない
    piyo02 # 何の処理をすることなく,単に結果をファイルに書き出すだけであっても同じ
    piyo03
    piyo04
    しかし,普通は以下のようにした方がもっと扱いやすいでしょう。
    hoge <- 1:4 # 関数に作用させる対象を配列なりリストなりで表す
    piyo <- func(hoge) # 関数を作用させ結果も配列やリストに格納する
                       # 場合によっては,for ループで処理しないといけない場合もあるだろう
    piyo # 結果を引用するときも,配列やリストの要素を参照する
    eval(parse(text=foo)) は,今のあなたのやりたいことのために使うものじゃないでしょう。
    繰り返し処理は,データ構造も繰り返し処理に適したものを使うべきですよ。 -- 河童の屁は,河童にあらず,屁である。? 2010-09-07 (火) 21:23:54
  • まあもともと連番のデータが与えられている場合もあるでしょうからこうした必要もあるかもしれません.しかし出力については上の回答者と同意見でひとつにまとめて出力すべきですね。次の簡単な例が参考になるでしょうか. -- 2010-09-08 (水) 00:00:18
    > hoge1 <- 1; hoge2 <- 2; hoge3 <- 3; hoge4 <- 4
    > N <- 4
    > X <- vector("list",N)
    > for (i in 1:N) X[[i]] <- eval(parse(text=paste("hoge",i,sep="")))
    > str(X)
    List of 4
     $ : num 1
     $ : num 2
     $ : num 3
     $ : num 4
    > foo <- function(x) x^2
    > Y <- lapply(X,foo)
    > str(Y)
    List of 4
     $ : num 1
     $ : num 4
     $ : num 9
     $ : num 16
    > Y[[1]];Y[[2]];Y[[3]];Y[[4]]
    [1] 1
    [1] 4
    [1] 9
    [1] 16

パッケージに含まれているはずの関数が呼び出せない

rcddnsj? (2010-09-06 (月) 23:54:37)

Windows7でR version 2.11.1を使用しております。

サポートベクターマシンを試してみたくて、パッケージe1071をインストールし、関数svmを実行するところまでは、たどり着きました。

しかし、e1071に含まれているはずの関数predict.svmで予測しようとすると、「関数 "predict.svm" を見つけることができませんでした」とのエラーでpredict.svmを呼び出せませんでした。

操作はRcmdrのスクリプトウィンドウから実行しています。

このように、パッケージに含まれているはずの関数が呼び出せない場合、どのような原因とあるいは、対処法が考えられるのでしょうか?

Rの再インストール、パッケージe1071の再インストールなどはもちろん試しています。

sessionInfo() の実行結果は下記の通りです。

R version 2.11.1 (2010-05-31) 
i386-pc-mingw32 

locale:
[1] LC_COLLATE=Japanese_Japan.932  LC_CTYPE=Japanese_Japan.932    LC_MONETARY=Japanese_Japan.932 LC_NUMERIC=C
[5] LC_TIME=Japanese_Japan.932

attached base packages:
[1] splines   tcltk     stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] SparseM_0.86    e1071_1.5-24    class_7.3-2     Rcmdr_1.6-0     car_2.0-2       survival_2.35-8 nnet_7.3-1
[8] MASS_7.3-7

loaded via a namespace (and not attached):
[1] tools_2.11.1

どなたか、ご助言いただける方がいらっしゃいましたら、宜しくお願いいたします。

  • まず何よりも?predict.svmです。
    Usage:
    
        ## S3 method for class 'svm':
        predict(object, newdata, decision.values = FALSE,
        probability = FALSE, ..., na.action = na.omit)
    分かりますよね? -- 2010-09-07 (火) 00:07:05
  • ありがとうございます。そもそも関数の使い方を誤っているというヒントでしょうか。何分、初心者ですのでhelpを見ても意味するところがまだチンプンカンプンで難儀しています。 -- rcddnsj? 2010-09-07 (火) 07:41:11
  • すみません。そもそも、predict.svmなんて使い方はないということでしょうか。predict()で引数にsvmで作られたオブジェクトが与えられれば、predict.svmという関数が裏で勝手に実行される、そんなイメージを持ちました。もう少し、自分でRの基礎的な仕組みを勉強してみます。ありがとうございます。 -- rcddnsj? 2010-09-07 (火) 08:06:32
  • 度々すみません。総称的関数という言葉は聞いたことがあったのですが、使い方をちゃんと理解していませんでした。総称的関数って、単に安直に省略して書ける位にしか思っていなかったので、逆に本来実行される関数を直接書いてもダメなんですね。お騒がせしました。重ねてお礼申し上げます。 -- rcddnsj? 2010-09-07 (火) 08:12:53
  • どうしても,フルネームで使いたければ,e1071:::predict.svm(m) のようにすればよいだけです。 -- 河童の屁は,河童にあらず,屁である。? 2010-09-07 (火) 10:39:25
  • 普通メソッド関数(この場合 predict.svm)を直接使っても構わないはず(?)ですが、この関数は何か特別な細工がしてあるんだろうか? -- 2010-09-07 (火) 23:42:47

ある条件に対応する要素だけを置換したい

ito? (2010-08-31 (火) 20:12:14)

あるベクトルについて、他のベクトルの中のNAに対応する要素だけをNAに変換したいのです。よい方法はないでしょうか。

x <- c(1,3,4,6,8,9)
y <- c(1,NA,2,NA,3,4)

変換後

> x
[1]  1 NA  4 NA  8  9

となるようにしたいのです。

ifelse(x[is.na(y)],NA)

とか考えたのですが、うまくいきません。
よろしくおねがいします。

  • mapply(max, x, y)
    mapplyは1つ目の引数に指定した関数を2つ目以降に指定したベクトルから1つずつ取り出して実行する関数。 -- Spica? 2010-08-31 (火) 20:18:23
  • ありがとうございました。mapplyは難しいですが、頑張って理解しようと思います。 -- ito? 2010-08-31 (火) 20:25:22
  • たびたびすみません。この方法だと、xの要素のほうがyのものよりも小さいときには要素が入れ替わってしまいますね。NAだけを入れ換える方法もお教えいただきたいと思います。例が悪かったようですみません。 -- ito? 2010-08-31 (火) 20:35:09
  • x[is.na(y)]<-NA -- 2010-08-31 (火) 20:56:11
  • 関数の仕様が不明瞭ですね。x と y の長さが違うときにはどうするかというのがね。取りあえず以下のような関数仕様にしておきましょうか。素直に関数を書くに限る。 -- 河童の屁は,河童にあらず,屁である。? 2010-08-31 (火) 21:11:25
    func <- function(x, y)
    {
    	nx <- length(x)
    	ny <- length(y)
    	if (nx <= ny) {
    		return(ifelse(is.na(y[1:nx]), NA, x))
    	}
    	else {
    		return(c(ifelse(is.na(y), NA, x[1:ny]), x[(ny+1):nx]))
    	}
    }
    # 長さが同じときには色々な方法がある
    > x <- c(1,3,4,6,8,9)
    > y <- c(1,NA,2,NA,3,4)
    > func(x, y)
    [1]  1 NA  4 NA  8  9
    # x の長さが短いとき,x と同じ長さに y を切り詰めて,x, y を同じ長さにして処理
    > x <- c(1,3,4,6,8)
    > y <- c(1,NA,2,NA,3,NA)
    > func(x, y)
    [1]  1 NA  4 NA  8
    # x の長さが長いとき,y と同じ長さに x を切り詰めて処理した後,残りの x を接続
    > x <- c(1,3,4,6,8,9,10,11)
    > y <- c(1,NA,2,NA,3,4)
    > func(x, y)
    [1]  1 NA  4 NA  8  9 10 11
  • どうもありがとうございました。助かりました。 -- ito? 2010-08-31 (火) 22:09:06
  • (ベクトルの長さが等しいという前提で)NA値の特性を利用したこんなやりかたもあり。 -- 2010-08-31 (火) 23:40:51
    > 0*y
    [1]  0 NA  0 NA  0  0
    > x + 0*y
    [1]  1 NA  4 NA  8  9
  • あと, is.naがNA or NaNである事も忘れずに. -- 2010-09-01 (水) 16:58:17

pls回帰分析の有意検定について

初心者? (2010-08-30 (月) 16:56:25)

いつもお世話になっております。
 
pls回帰分析をしたいのですが,Rですと,ベータは求められても,そのベータが有意かの検定はできないのでしょうか。またできるのなら,どのように行うのでしょうか。

pls回帰分析を学ぶに当たり,岩田先生のpls回帰入門やAcreMaker?様のホームページを見ましたが,有意かどうか扱っていませんでしたので,質問させて頂きました。
 
使用環境は、R2.11.1です。OSはWindowsVista? です。
 
よろしくお願いします。

  • どなたからもコメントがないようなので。もともとpls回帰はたくさんの変数を使ってとにかく良い予測をしようということが目的なので,係数の検定というのは眼中にないんでしょうね。 -- 河童の屁は,河童にあらず,屁である。? 2010-09-07 (火) 10:42:04

複数条件でベクトルを抽出する際に、条件が定数ではなくベクトルだったときについて

Saito? (2010-08-27 (金) 08:52:15)

いつもお世話になっております。
似た様な質問はいくつかあったのですが、意外にも、条件抽出が複数で、かつ固定値ではなく、ベクトルで条件抽出をしている例が見当たらなかったので、質問させてください。

ある参照列(座標と価がセット)があるときに、それを参照して、新しい座標から、それにマッチングする価を参照したいと思っています。以下がサンプルプログラムです。

set.seed(1)
a <- seq(1, 10)
b <- seq(1, 10)
c <- rnorm(100)

###参照列###
d <- data.frame(expand.grid(a=a, b=b), c=c)

###当てはめたい座標###
e <- data.frame(a=sample(a, 50000, rep=T), b=sample(b, 50000, rep=T))

###これでは上手く動かない###
subset(d$c, d$a==e$a & d$b==e$b)

###これでも###
subset(d$c, d$a%in%e$a & d$b%in%e$b)


つまり、eの座標軸が与えられたときに、dの座標軸と対応させて、dの三列目(c列)を引っ張って来たいのです。

for文でやろうと思えばできるのですが、実際はもっとeが大きくて、for文が実行スピード的に使えません。%in%も、&が入っていなければ使えたのですが、この場合上手く動作しないようです。おそらく単純な問題だと思うのですが、思うようにいきません。

どなたか、分かる方がいらっしゃいましたら、ご教示いただけると幸いです。

  • merge(e, d),ただし行の順序が変わってしまう -- surg? 2010-08-27 (金) 09:28:45
  • 提示されている仕様を満たすという限定で,以下のように提案。
    d2 <- matrix(d$c, 10, 10)
    e2 <- as.matrix(e)
    d2[e2]
    つまり,この問題は表引きで,d$a, d$b が添え字の二次元配列で,その要素が d$c。d$a, d$b の添え字はちょうど R の二次元配列の順序と同じなので,d$c を matrix 関数で行列にするだけで済む。e$a, e$b を添え字と見て,その要素を取り出すのだから,単純な表引き。しかし,この場合,別に d2 や e2 など作る必要はなくて,
    d$c[e$a+10*(e$b-1)]
    だけでよいことがわかってしまう。
    d$a, d$b が自然数でないとか,d$c がないセルがあるとかの場合は何らかの形で二次元配列に落とし込む。同じ考え方で3次元以上の配列の表引きもできる。 -- 河童の屁は,河童にあらず,屁である。? 2010-08-27 (金) 09:57:50
  • > surgさん ありがとうございました。ただ、やはり順番が変わってしまうと少し不都合でしたので、河童さんの屁さんを採用させていただきました。
  • > 河童の屁は、河童にあらず、屁さん なるほど、上手く座標を順番に変えてしまって、それから索引すれば二次元以上の座標でも、一次の単純な数値に落とし込めるわけですね。
    想像の通り、実際は三次以上の座標でしたので、この方法で助かりました。ありがとうございました。 -- Saito? 2010-08-28 (土) 13:33:28
  • 参考まで:merge 関数を使って、しかももとの順序を保存する方法。 -- 2010-08-28 (土) 23:10:16
> Ord <- data.frame(ord=seq(nrow(e)))   # 本来の順序を示す作業用変数
> A <- merge(merge(cbind(e,Ord),d),Ord) # 欲しい結果
> AA <- A[,-1]                          # 作業用変数列が目障りなら
> str(e)
'data.frame':	50000 obs. of  2 variables:
 $ a: int  3 3 6 3 2 6 6 2 3 8 ...
 $ b: int  6 8 4 8 7 8 4 2 6 7 ...
> str(A)
'data.frame':	50000 obs. of  4 variables:
 $ ord: int  1 2 3 4 5 6 7 8 9 10 ...
 $ a  : int  3 3 6 3 2 6 6 2 3 8 ...
 $ b  : int  6 8 4 8 7 8 4 2 6 7 ...
 $ c  : num  0.3411 0.6107 -0.415 0.6107 -0.0392 ...
> str(AA)
'data.frame':	50000 obs. of  3 variables:
 $ a: int  3 3 6 3 2 6 6 2 3 8 ...
 $ b: int  6 8 4 8 7 8 4 2 6 7 ...
 $ c: num  0.3411 0.6107 -0.415 0.6107 -0.0392 ...

もしくは(こちらの方が直感的でわかり易い?)

> ed <- merge(cbind(e,Ord),d)
> str(ed)
'data.frame':	50000 obs. of  4 variables:
 $ a  : int  1 1 1 1 1 1 1 1 1 1 ...
 $ b  : int  1 1 1 1 1 1 1 1 1 1 ...
 $ ord: int  32810 46779 23088 6441 17984 15437 12878 47025 38836 21870 ...
 $ c  : num  -0.626 -0.626 -0.626 -0.626 -0.626 ...
> ed[order(ed$ord),][,-3]   # 上のAAと同じもの

関数"pls"を見つけることができませんでした

学生? (2010-08-26 (木) 22:48:35)

RでPLSを行おうとして追います。
PLSパッケージをインストールし,読み込んでも,「関数"PLS"を見つけることができませんでした」と返ってきます。
Rになれるための練習として,インターネット「岩田先生のPLS回帰入門」の「wine」についてPLSで分析しようとしているのですが上手くいきません。
何卒よろしくお願い致します。

  • あなたがどのようにやったのか,コンソールの表示をペーストしてくれるとよいのですが。(タイトルでは pls と小文字,本文中では PLS と大文字,どちらを入力したのかとか(どちらも間違いだけど),library(pls) したのかとかわからないのですよ)
    pls パッケージは,"Partial Least Squares Regression (PLSR) and Principal Component Regression (PCR)" を行うための関数が収められており,mvr 関数がその中心的なもの(Partial Least Squares and Principal Component Regression)。? mvr をしてみると,使いやすくするために,前者は plsr,後者は pcr というラッパー関数が用意されていることがわかるでしょう。
    具体的には以下のようにします。 -- 河童の屁は,河童にあらず,屁である。? 2010-08-27 (金) 07:15:14
    > library(pls) # pls パッケージを使うために
    
     次のパッケージを付け加えます: 'pls' 
    
    The following object(s) are masked from 'package:stats':
    
        loadings
    
    > plsr(foo, ...) # plsr というのが,あなたが使いたい関数ですよね
  • 早速,ご回答,ありがとうございます。plsは小文字で打っておりますし,library(pls)としても,なぜか上手くいきませんでした。 -- 学生? 2010-08-27 (金) 14:33:55
  • 以下にコンソールの表示をペースト致します。 -- 学生? 2010-08-27 (金) 14:36:44
    > wine <- read.table("wine.txt")
    > Y <- scale(wine[,1:3])
    > X <- scale(wine[,4:7])
    > library(pls)
    
     次のパッケージを付け加えます: 'pls'
    
    The following object(s) are masked from 'package:stats':
    
       loadings
    
    > wine.pls <- plsr(X, Y, 1:3, validation="CV")
    以下にエラー formula.default(object, env = baseenv()) : invalid formula
  • あなたは最初「関数"PLS"を見つけることができませんでした」というエラーがでますといっていたわけで,今回はそこはパスしたわけで,plsr の使い方が間違えている"invalid formula" といわれる段階に達したということですね。「plsは小文字で打っておりますし,library(pls)としても,なぜか上手くいきませんでした。」とは,現状認識ができていないですね。まずは,エラーメッセージを読み,それに従って対策をしないといけないのです。「岩田先生のPLS回帰入門」には確かに library(pls) しなさいとは書いてなかったりするのだけど,示された例の通り書いていくと示されたとおりの出力が得られるんじゃないかと思いますけど?(というか,2007年の資料では肝心なところが示されていないし,それより前のじゃエラーになるけど)。 -- 河童の屁は,河童にあらず,屁である。? 2010-08-27 (金) 15:49:48
    > library(pls)
    > wine <- read.table("wine.txt")
    > Y <- scale(wine[,1:3])
    > X <- scale(wine[,4:7])
    > wine.pls <- plsr(Y~X, 3, data=wine)
    > summary(wine.pls)
    Data: 	X dimension: 5 4 
    	Y dimension: 5 3
    Fit method: kernelpls
    Number of components considered: 3
    TRAINING: % variance explained
                       1 comps  2 comps  3 comps
    X                    70.45    98.35    100.0
    Hedonic              70.53    70.71    100.0
    Goes_with_meat       93.74    98.51    100.0
    Goes_with_dessert    25.72    86.97     87.5
    > coefficients(wine.pls, ncomp=2)
    , , 2 comps
    
                Hedonic Goes_with_meat Goes_with_dessert
    Price   -0.27140847     -0.2525422        0.01880366
    Suger    0.06339537      0.3206223        0.78764141
    Alcohol  0.28567521      0.3619657        0.27127454
    Acidity  0.30722143      0.3730769        0.24272634
  • 河童の屁さん,ご回答,ありがとうございました。おかげさまで,何とかRのplsになれるための練習ができました。現在は本番として,自分の調査で取った分析をplsでしようとしています。しかし,また最後の方で詰まってしまいました。度々申し訳ありませんが,ご助言をお願いできませんか。以下,コンソールです。 -- 学生? 2010-08-27 (金) 20:08:32
    > R574 <- read.csv("R574.txt")
    > Y <- scale(R574[,9:10])
    > X <- scale(R574[,5,8])
    > R574.pls <- plsr(Y~X, 3, data=R574)
    以下にエラー mvr(Y ~ X, 3, data = R574, method = "kernelpls") :
        Invalid number of components, ncomp
  • コンソールをペーストする方法も学びましょうね。
    本筋とは関係ないですけど,"scale(R574[,5,8])" というのは怪しいですね。"scale(R574[,5:8])" じゃないですか?実際にそのように入力すると,「次元数が違います」というエラーメッセージが出るはずです。コンソールをそのままコピー&ペーストしないとだめですよ。
    また,今後いろいろやっていく上で,エラーメッセージをみて間違いを修正するということができないと,自立できませんよ。
    Invalid number of components, ncomp と書いてあるのですから,number of components を示す ncomp 引数に与えた数値が invalid なんだなということでしょ?
    どういう風に invalid なのか,正しくはどのような値を指定しないといけないのかということを調べないといけません。ncomp が 3 でよいのかどうか確認してくださいね。正しい正しく内ないのレベルではなく,分析の条件はあなた自身が決めないといけないのです。
    お手本にあるものをそのまま引き写してやるのでは,だめなことが多いのですよ。だって,お手本とあなたのデータ分析は違うのですから。
    ? plsr でオンラインヘルプを参照するのが一番最初にやるべき事です。オンラインヘルプを見ましたか?
    R574 がどんなものなのかについて何の情報もないので,これ以上は適切な対処法をコメントすることはできません。 -- 河童の屁は,河童にあらず,屁である。? 2010-08-27 (金) 21:22:23
  • 河童の屁さん,度々ご回答ありがとうございました。Rを学んでから日が浅いため,基本的なことができておらず,すみません。分析は何とかできました。本当に助かりました。ありがとうございました。 -- 学生? 2010-08-28 (土) 10:51:08

図の軸の数値が指数表示になる

? (2010-08-26 (木) 16:50:23)

図を作成した際に,x軸やy軸に添えられる数字が指数表示(1e-01,1e+01など)に自動的になります。これを回避したいのですが,どなたか方法を教えて頂けませんでしょうか?
何卒よろしくお願い申し上げます。

  • 「自動的になります」というのは,そのようにした方が良いという判断でそうしてくれているわけです。axis 関数を使えば,自分で表示したい場所に表示したい形式で表示したいものを表示することはできます。
    また,例えば数値が1,000,000のオーダーの場合などである場合,数値を 1,000,000 でわったものをプロットすれば,そのようなことを避けることもできるでしょう。
    あなたが実際に描いた例を見れば,適切な対処法が示されることでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2010-08-26 (木) 20:16:14
  • 手っ取り早いのは,options関数でscipenをいじる方法 -- surg? 2010-08-27 (金) 09:10:35
    scipen.org <- getOption('scipen')
    x <- seq(0, 0.001, 0.0001)
    plot(x)
    options(scipen=10)
    plot(x)
    options(scipen=scipen.org)
  • 河童さま,surgさま,ご教示ありがとうございます。そこまで指数表示にしなくてもという場合がありましたので,質問させて頂いた次第です。河童さまがご提案頂いた方法はなんとなく考えてはいたのですが,surgさんの方法はまさしくです。ありがとうございました! -- ? 2010-08-27 (金) 12:38:02

DEAの線形計画問題について

atsuo? (2010-08-23 (月) 11:52:39)

optimやconstrOptimで解決できないかと、あれこれやってみたのですが、
以下の線形計画問題を解決したいのです。

� 2*θ−2*λ[1]−2*λ[2]−1*λ[3] >= 0
� 1*θ−1*λ[1]−2*λ[2]−2*λ[3] >= 0
�  1 −1*λ[1]−1*λ[2]−1*λ[3] <= 0
� λ[1]+λ[2]+λ[3] >= 1
� λ[1]>=0
� λ[2]>=0
� λ[3]>=0
� �〜�の条件を満たし、θを最小にする問題です。

欲しいのはθの値とλ[1]、λ[2]、λ[3]の値です。
これはDEA分析なのですが、パッケージのFEARでも準備されていない解θが欲しいのです。
環境は、R2.11.1です。OSはWindows7 です。

  • モンテカルロシミュレーションによると,λ1=1, λ2=λ3=0 のときにθ=1となるようですけど?そんな自明な解じゃダメなんでしょうか?それとも,条件にどこか間違いがある? -- 河童の屁は,河童にあらず,屁である。? 2010-08-24 (火) 19:27:33
    > sim <- function(trial=10000, mx=1)
    + {
    + 	count <- 0
    + 	min.theta <- 10000
    + 	while(TRUE) {
    + 		lambda <- runif(3, min=0, max=mx) # 一様乱数発生 条件(5), (6), (7)
    + 		if (sum(lambda) >= 1) { # 条件(4)
    + 			theta <- max(lambda%*%c(1, 1, 0.5), lambda%*%c(1, 2, 2))  # θは(1)と(2)を満たす大きい方
    + 			if (theta < min.theta) { # それまでに見つかったものより小さければ書き出す
    + 				cat(theta, lambda, "\n")
    + 				min.theta <- theta    # 見つかった解の候補で更新
    + 				ans <- c(theta, lambda)
    + 				count <- 0 # 空振り回数の更新
    + 			}
    + 			else {
    + 				count <- count+1 # 空振りが以下の回数続けば現在の解を最良とする
    + 				if (count > 1000000) return(ans)
    + 			}
    + 		}
    + 	}
    + }
    > (ans <- sim()) # 出力は順に,θ,λ[1],λ[2],λ[3]
    2.961947 0.9688506 0.2850662 0.711482 
    2.460659 0.9278959 0.2115464 0.5548352 
    1.890355 0.7575402 0.4784459 0.08796157 
    1.857158 0.2751631 0.7211324 0.06986522 
       途中省略
    1.030237 0.9743367 0.00815206 0.01979813 
    1.029195 0.9880413 0.004979686 0.01559721 
    1.023945 0.9964487 0.005063805 0.008684346 
    [1] 1.023944978 0.996448677 0.005063805 0.008684346 # これが最終解
    > # 念のために条件のチェック
    > 2*ans[1]-2*ans[2]-2*ans[3]-ans[4] >= 0 # (1)
    [1] TRUE
    > ans[1]-ans[2]-2*ans[3]-2*ans[4] >= 0   # (2)
    [1] TRUE
    > sum(ans[2:4]) >= 1                     # (3), (4)
    [1] TRUE
    > all(ans[2:4] >= 0)                     # (5), (6), (7)
    [1] TRUE
  • 問題が正しいとすれば,これは紙と鉛筆で解ける問題です.まず(3)と(4)は同値.(1),(2),(3)から θ>=1+λ[2]/3 で,したがって解はλ[2]=0の時θ=1.その時λ[1],λ[3]は条件 λ[1]+λ[3]>=1,λ[1],λ[3]>=0 で決まる四角形の中の任意の点. -- 2010-08-24 (火) 20:55:21
  • ちょっと違う。λ[2]=0 のとき,λ[1],λ[3],θは図のようになる。影をつけたのは手前から向こう,左手から右手へ上り坂になる平面(λ[1]≧0,λ[3]≧0,λ[1]+λ[3]≧1)。よって,θが最小になるのはλ[1]=1,λ[3]=0のときで,そのときθ=1。つまり,点Cですね。モンテカルロシミュレーションは正しいようだ。 -- 河童の屁は,河童にあらず,屁である。? 2010-08-25 (水) 10:51:31
    3dplot.png
  • 河童さま、ご教示ありがとうございます。モンテカルロシミュレーションの考え方でアプローチできることがわかりました。私にとっては目からうろこの状態です。θとλを収束させる過程はブラックボックスでもかまいませんので、optimやconstrOptimを使った方法などありましたら、ご教示いただけたらと思います。みなさま、よろしくお願い申し上げます。 -- atsuo? 2010-08-28 (土) 06:42:13
  • 正式表記は「河童の屁は,河童にあらず,屁である。」ですが(^_^;),あなたがやるべき事は,Rで数理計画ではないかと思いますけど?
    どの方法(関数)がよいか,どういうふうに使うのかなどは,私にはわかりません。目的に応じ宜しくご判断ください(その分野においては素人であるものに負けてはいけませんよ) -- 河童の屁は,河童にあらず,屁である。? 2010-08-29 (日) 20:19:06

GARCHの解釈

? (2010-08-20 (金) 22:42:44)

Coefficient(s)や、Hessian Matrixに標示される、muやomegaの解釈方法はどこを参照すればよいのでしょうか?ご教示頂ければ幸いです。
例) Coefficient(s):
  mu ar1 ma1 omega alpha1

  • 次々に質問するより,少しは自分で調べれば良いと思いますよ。「どこを参照するか」より,しっかりした教科書を読むのが先決でしょう。
    一般的にはオンラインヘルプ,パッケージによっては vignet のあるものもある。
    なお,コメントの付け間違いを自分で消去するとか,行の先頭に半角空白があるとどのように扱われるかを知るとか,ほかにも掲示板利用上の注意事項も確認してください -- 河童の屁は,河童にあらず,屁である。? 2010-08-21 (土) 08:30:27
  • なるほど。一応、Referenceに出ていたテキスト数冊とOnline help(JpとEnサイト)で検索に引っかかった項には、全て目を通したのですが、Omegaについての説明は見当たりませんでした。また、最後に出てくるはずのギリシャ文字が、αの前に出てきたことに違和感を感じて、どなたか暗黙知としてご存知なら、コメントを頂ければ幸いと存じ、質問差し上げた経緯でしたが、了解です。引き続き、検討します。有難うございました。 -- ? 2010-08-21 (土) 14:44:32
  • > Referenceに出ていたテキスト数冊とOnline help(JpとEnサイト)で検索に引っかかった項には、全て目を通したのですが、Omegaについての説明は見当たりませんでした
    すごいですね。全部見たけどなかったんですか。「muやomegaの解釈方法」とはどういう事を意味しているのでしょうか?
    「mu や omega とは何か」というのではないのでしょうね?
    GARCH と一言で言っても関連パッケージも関数もいろいろあるようなんですけど,例えば,fGarch パッケージの説明書(fGarch.pdf)には,garchSpec 関数の model 引数の説明で,a list of GARCH model parameters: omega - the constant coefficient of the variance equation, by default 1e-6; alpha - the value or vector of autoregressive coefficients, by default 0.1, spec- ifying a model of order 1; beta - the value or vector of variance coefficients, by default 0.8, specifying a model of order 1; The values for the linear part are: mu - the mean value, by default NULL; ar - the autoregressive ARMA coefficients, by default NULL; ma - the moving average ARMA coefficients, by default NULL. The parameters for the conditional distributions are: skew - the skewness parameter (also named "xi"), by default 0.9, effective only for the "dsnorm", the "dsged", and the "dsstd" skewed conditional dis- tributions; shape - the shape parameter (also named "nu"), by default 2 for the "dged" and "dsged", and by default 4 for the "dstd" and "dsstd" conditional distributions. とか,書いてあるようですが。
    まあ,あなたがどういう情報を欲しているのかがわからないのでなんともいえないのですけど?どんな教科書にも書かれていない出力の読み方とはどういうことでしょうね?
    なお,「最後に出てくるはずのギリシャ文字が、αの前に出てきたことに違和感を感じ」ということですが,モデル中のギリシア文字はそのモデルでの慣例で,
    omega-alpha.png
    みたいに使われるようなので,辞書順でなく,式の中での出現順の方がわかりやすいのでは?mu(μ)だって α の前に出ているでしょ?? -- 河童の屁は,河童にあらず,屁である。? 2010-08-21 (土) 15:20:33

なるほど、貴重なアドバイスを有難うございます。出てきたGarch項を推計式の誤差項に代入する場合には、同時方程式を使う形になるのでしょうか? テキストを見比べて、自分で式を考えてみたのですが、なかなかうまくいきません。 アドバイス頂けると幸いです。宜しくお願い致します。 (fgarchはうまくInstallできなかったため、そちらのマニュアルを確認することは、失念していました。調べ方が甘く、すみませんでした。 ご丁寧にアドバイスをいただいて、有難うございました。)-- z? 2010-08-31 (火) 19:05:42

Rのインストールで,メッセージ言語が文字化け

rの初心者? (2010-08-20 (金) 16:28:28)

とあることでRを用いて多変量解析を行う必要が生じまして、ダウンロードしてインストールしました。ところがメッセージ言語は文字化けしているようで日本語で表示されません。ただし「ファイル」「ヘルプ」といった表示は正常です。どうすればよろしいでしょうか? よろしくお願いします。

  • 中澤先生の統計処理ソフトウェアRについてのTipsというページの「インストール関連」という項目の Windows の最終段落を参照しても問題は解決しないでしょうか? -- 河童の屁は,河童にあらず,屁である。? 2010-08-20 (金) 16:55:01
  • 回答どうも有り難うございます。解決しました。またよろしくお願いします。 -- rの初心者? 2010-08-23 (月) 09:39:05

TARCH has not been available?

z? (2010-08-20 (金) 14:29:41)

RでTARCH(Threshold GARCH)をLoopで100社*10年分行おうと調べてみたのですが、該当する機能が見つかりませんでした。
RでTARCHするのと同じ結果を得られる機能がございましたらご教示頂けると幸いです。
宜しくお願いします。

  • 自己解決しました。まだベータ版までしか提供されていないようです。
    参照: http://r-forge.r-project.org/projects/rregarch/
    どなかた、その後のUpdateをご存知でしたら、ご案内頂けると幸いです。 -- z? 2010-08-20 (金) 22:37:16

forループのリストにベクトルを使ってはいけないのでしょうか?

青葉ほととぎす? (2010-08-20 (金) 14:18:14)

最近、Rでプログラムを始めたものです(Vistaでversion 2.10.1を使用)。
あるプログラムを作っているときに不可解な結果がでて、いろいろ試した結果、forループのところに問題がることが分かってきました。

以下は、問題の部分だけを抜き出したものです。

初め実験1を行っていたのですが問題があり、実験2のように書き変えたところうまくいきました。

sim.rate <- seq(0, 1, by=0.01)
result.matrix <- matrix(0, nrow=length(sim.rate), ncol=2)
# 実験1
for(i in sim.rate)
{
    result.matrix[i*100, 1] <- result.matrix[i*100, 1]+1
}
# 実験2
for(i in 1:length(sim.rate))
{
    result.matrix[i, 2] <- result.matrix[i, 2]+1
}

この2つは以下のような異なる結果を出します。

       [,1] [,2]
  [1,]    1    1
中略
 [27,]    1    1
 [28,]    2    1
 [29,]    0    1
 [30,]    1    1
中略
 [56,]    1    1
 [57,]    2    1
 [58,]    0    1
 [59,]    1    1
中略
 [95,]    1    1

そこで質問ですが、forループのリストしてベクトルを使ってはいけないのでしょうか?なぜこんな違いが生じるのかも教えていただけると助かります。

  • for ループのリストとしてベクトルを使っても,何の差し支えもありません。ただ,あなたの書いたプログラムがうまく期待通り動かないのは,いくつか問題があるからです。
    まず,sim.rate は 0.00 から 1.00 まで 0.01 刻みで 101 個の要素を持ちますが,実験1で i が sim.rate の第 1 要素,すなわち 0 ,を使って,添え字を計算すると result.matrix[0, 1] を参照することになってしまいます。R では,添え字は 1 から始まります。添え字 0 は別のものを意味します。
    > result.matrix[0, 1]
    numeric(0)
    もう一つは,i は sim.rate という実数値をとるので,0.05*100 は 5 になるのですが,いつも,期待されるとおりの結果にはならないということに注意が必要です。以下のように,sim.rate の 26 〜 32 番目の要素は 0.25 〜 0.31 ですが,それを使って計算される添え字は as.integer(sim.rate[26:32]*100)つまり,100 倍して,小数部を除いたものなので,29 になってほしいところが 28 になっているのがわかるでしょう(29 はなく,28 が 2 回出ていますよね)。
    > sim.rate[26:32]
    [1] 0.25 0.26 0.27 0.28 0.29 0.30 0.31
    > as.integer(sim.rate[26:32]*100)
    [1] 25 26 27 28 28 30 31
    ようするに,コンピュータの中での実数は(整数値や,2 進数で循環小数にならずに正確に表現できる実数を除いて),あくまでも「近似値」なのです。近似値を整数倍して小数部を除くと,期待されるのとは違う結果になることがあるということです。
    実数の計算結果を整数が期待される場所(添え字など)に使ってはいけませんということです。これに類することとして,「0.01 を 100 回加えても,1 にはなりません」というのがあります。 -- 河童の屁は,河童にあらず,屁である。? 2010-08-20 (金) 15:04:58
    > s <- 0
    > for (i in 1:100) s <- s+0.01 # 0.01 を 100 回足し込む
    > s       # 結果を書いて見ると
    [1] 1     # ちゃんと 1 になっているように見えますが
    > s == 1  # 1 と等しいかどうか見てみると
    [1] FALSE # 1 とは等しくないということがわかります
  • とてもわかりやすい解説ありがとうございます。近似値であること、しかと覚えておきます。また、私の質問部分を見やすくしてくださったこともお礼いたします。大感謝です。 -- 青葉ほととぎす? 2010-08-20 (金) 15:35:55

Windows7 Home Premiumで最新のRインストールできず

ななしのごんべ? (2010-08-12 (木) 19:53:54)

Windows7 Home Premiumで最新のRを入れたら、パッケージがインストールできません。「コンピューターにiconv.dllがないため、プログラムを開始できません。この問題を解決するには、プログラムを再インストールしてみてください。」というエラーウィンドウが出ます。どなたか解決策をご教示いただけるとありがたいです。

  • 上の質問者です。igraphパッケージだったのですが、古いバージョンのRをインストールしたら問題なくインストールできました。むむむ。 -- 2010-08-13 (金) 11:02:21
  • igraphパッケージはver.0.5.4からiconv.dllが必要になったようですね。当方もWindows7 Home Premiumですがhttp://www.kaoriya.net/から入手したiconv.dllをC:\Windows\systemに置いたらRもigraphも最新ver.で使用できました。 -- suzuki? 2010-08-17 (火) 02:10:47
  • igraphをver.0.5.4-1にバージョンアップすれば問題ないようです。 -- suzuki? 2010-08-21 (土) 11:41:28

積分した値が計算に使えない

しょーじん? (2010-08-11 (水) 14:36:14)

積分した値を計算に使おうと思ったところ,「二項演算子の引数が数値ではありません」と出てしまい,計算に使えません.
その値自体を調べると「0.5 with absolute error < 5.6e-15」とでます.
計算に使うためにはどうしたらよいのでしょうか?

  • こんなことなのでは? -- 2010-08-11 (水) 21:17:53
    > x <- integrate(dnorm, -1.96, 1.96)
    > x
    0.9500042 with absolute error < 1.0e-11
    > x + 2
    以下にエラー x + 2 :  二項演算子の引数が数値ではありません 
    > str(x)
    List of 5
     $ value       : num 0.95
     $ abs.error   : num 1.05e-11
     $ subdivisions: int 1
     $ message     : chr "OK"
     $ call        : language integrate(f = dnorm, lower = -1.96, upper = 1.96)
     - attr(*, "class")= chr "integrate"
    > x$value
    [1] 0.9500042
    > x$value + 2
    [1] 2.950004
  • 例えば,integrate 関数の結果を a という変数に付値(代入)したすれば,integrate 関数の結果は a$value のようにして使うんですよ。と。 -- わかりやすく教えてあげましょう? 2010-08-12 (木) 21:43:51
  • ありがとうございました.解決しました. -- しょーじん? 2010-08-13 (金) 16:10:16

単回帰のデータが認識されない?

z? (2010-08-07 (土) 23:56:43)

OLSを試みています。
推計式はComp1=α+βcomp0なので、以下の要領で、Syntaxを書いたら、Errorが出ました。

--Syntax-----
 Result1<-lm(comp1~comp0)
--error--------
Error in eval(expr, envir, enclos) : object 'comp1' not found

利用しているデータは下記の要領で、Comp0-90 まで、Dayは1-150まで。回帰式は、Comp<n>=α+βComp0 を Comp1-90まで順にComp0で回帰する予定です。

day        comp0        comp1        comp2        comp3        comp4    
1     -0.010873538 -0.017208413  0.009237875  0.000000000 -0.012048193
2      0.007344111 -0.001945525 -0.010297483  0.013313609  0.000000000
3      0.016795163  0.031189084 -0.019653179  0.002919708  0.034146341
4      0.006113627  0.003780718  0.004716981  0.010189229  0.007075472
5     -0.002080986 -0.007532957  0.011737089  0.010086455  0.145199063
6      0.005460344  0.001897533 -0.012761021 -0.021398003  0.022494888

Comp2以降はLoopでの処理を試みる予定なのですが、Comp1についての式は間違っていないようなのにエラーが出るので、調べ方にも窮しています。

  • > 式は間違っていないようなのにエラーが出るので、調べ方にも窮しています
    間違えているからエラーが出るのです。謙虚にオンラインヘルプを見ましょう。
    lm の使い方として,lm(formula, data ... と書かれているでしょう?第二引数には,今の場合,データフレームを指定しないといけないと書いてありますね。
    Syntax とか Loop とか,SPSS ユーザかと思いますが,速く R に慣れるとよいですね。
    >「Comp2以降はLoopでの処理を試みる予定なのですが」と書いていますが,そのような場合には,d をデータフレームとしたとき
    a <- vector(mode="list", length=90)
    for (i in 3:92) {
      a[[i-2]] <- lm(d[, 2] ~ d[, i]) # このような使い方のときには,第2引数にデータフレームは指定不要
    }
    また,投稿の仕方(投稿書式)についても確認してください。読みにくい質問は答えてやろうという気がわかないかも知れませんね。上の質問は書き直しました。あなたが投稿した後に表示されたものと比較してみてください。どのようにすれば上のように表示されるのか調べてください。
    誰でも初心者の時期はあるのですが,初心者だから至らない部分があっても勘弁してくれと言うのは初心者のおごりでしょう。初心者でもちゃんとしている人はちゃんとしています。 -- 河童の屁は,河童にあらず,屁である。? 2010-08-08 (日) 08:54:27
    なんらかの反応があってからと思っていましたが,音沙汰なしなので,以下のようなものも(for を使う方が簡単至極)。
    b <- lapply(paste("comp", 1:90, sep=""), function(x) lm(comp0 ~ eval(parse(text=x)), d))
  • たぶん下のスレッドと同じ質問者だと思いますが lm(comp1~comp0, data=dataset) とします (上の方の回答のとおりですが) 。attachを使ってもできないのであれば、変数名の指定 (comp0とか) などが正しくないのかもしれません。書いた内容がうまく反映されない場合はこのページの上のほうにある"編集"から修正してください。 -- 2010-08-08 (日) 10:18:24 lm構文については、Suggestionを頂いた通りに実行して、うまくいったのですが、For構文の方がうまくいきませんでした。Comp1をComp0で回帰、Comp2をComp1 で回帰、Comp3をComp0で回帰、というように、ColumnをずらすようなLoopをすることはRでは不可能なのでしょうか? 色々試してはいるのですが、うまくいかないので、引き続き、Try and errorを続けます。有難う御座いました。
  • 初心者なりにBestを尽くしたのですが、至らず、すみませんでした。今後、気をつけます。コメントを頂いたことに、深く感謝いたします。
    lm構文については、Suggestionを頂いた通りに実行して、うまくいったのですが、For構文の方がうまくいきませんでした。Comp1をComp0で回帰、Comp2をComp1 で回帰、Comp3をComp0で回帰、というように、ColumnをずらすようなLoopをすることはRでは可能なのでしょうか?
    例えば、
    for (i in comp1: comp90){lm(d[,0]~d[,i])}
    としてみたのですが、以下のようなErrorが出ました。 -- z? 2010-08-09 (月) 15:48:16
    > for (i in 1:90) {
    +   lm(d[, 0] ~ d[, i])
    + }
    Error in eval(expr, envir, enclos) : object 'd' not found  
    
    > for (i in 3:92) {
    +   lm(result1[, 0] ~ result1[, i])
    + } 
    Error in result1[, 0] : incorrect number of dimensions  
    
    > for (i in comp1:comp89) {
    +   lm(result1[, 0] ~ result1[, i])
    + } 
    Error: object 'comp89' not found  
    
    > for (i in comp1:comp3) {
    +   lm(result1[, 0] ~ result1[, i])
    + } 
    Error in result1[, 0] : incorrect number of dimensions In addition: 
    Warning messages:
    1: In comp1:comp3 :   numerical expression has 150 elements: only the first used
    2: In comp1:comp3 :   numerical expression has 150 elements: only the first used
    >   lm(result1[, 0] ~ result1[, i])
  • でたらめにやってもダメです。
    for (i in comp1: comp90){lm(d[,0]~d[,i])}では,i は comp1, comp2, ... となるので,lm(d[, 0] ~ d[, comp1]) をやれということになるわけですが,d[, comp1] なんていう指定はだめでしょう。それ以外も,それぞれ, for ループで i にどのようなものが付値されて,lm の呼び出しにどのようなものが使われるかを確認しましょう。d は私が件のデータフレームの名前として使っただけなのであなたが付けた名前にしないとだめでしょう。result1 というのも同じ。そのような名前のデータフレームなんですか?
    それと,「Comp1をComp0で回帰、Comp2をComp1 で回帰、Comp3をComp0で回帰」は「... Comp3をComp2で回帰」つまり,Comp<i> を Comp<i-1>で回帰するということでしょう? 以下では,上に示した要素(day, comp0, comp1, comp2, comp3, comp4)を持つデータフレーム d があるとしてのプログラム例です。
    a <- vector("list", length=4) # lm の結果は list なので,必要なメモリを確保
    for (i in 3:6) { # i は順に 3, 4, 5, 6 をとる
    	a[[i-2]] <- lm(d[, i] ~ d[, i-1]) # i=3 のとき,a[[1]] <- lm(d[,3] ~ d[,2]) が実行される
    }
    a
    # function には順に 1, 2, 3, 4がわたされ,
    # lm(eval(parse(text="comp1")) ~ eval(parse(text="comp0")), data=d) が実行される
    # 最終的には lm(comp1 ~ comp0, data=d) が実行される "comp1" と comp1 は別物だということに注意
    b <- lapply(1:4, function(i) lm(eval(parse(text=sprintf("comp%i", i))) ~
                                    eval(parse(text=sprintf("comp%i", i-1))), data=d))
    b
    # lapply っていったって,for とそうは変わらないのだ
    C <- vector("list", length=4)
    for (i in 1:4) {
    	C[[i]] <- lm(eval(parse(text=sprintf("comp%i", i))) ~
                        eval(parse(text=sprintf("comp%i", i-1))), data=d)
    }
    C
    それぞれの関数の引用について,なにをやっているのかを確認すること。
    回答方法について色々言う(後は自分で調べてとか,偉そうに言い過ぎるなどと言う??)人もいるようなので,
    > a <- vector("list", 10)
    > class(a) # vector は第一引数で指定するオブジェクトを
    [1] "list"
    > length(a) # 第二引数で指定する個数分用意する
    [1] 10
    > a[[2]] <- c(1, 3, 5) # リストの2番目の要素に付値(代入)する
    > a[[2]] # 結果を表示してみる
    [1] 1 3 5
    > parse(text="comp1")
    expression(comp1) # comp1 が作られるが,それは expression である
    attr(,"srcfile")
    <text> 
    > comp1 = "test dummy" # 例えば comp1 が "test dummy" という文字列だとすれば
    > eval(parse(text=sprintf("comp%i", i)))
    # これは,comp1 ということになり,それを print で表示すると "test dummy" という文字列になる
    [1] "test dummy"
    > print(eval(parse(text=sprintf("comp%i", i)))) # 上と同じ
    [1] "test dummy"
    これくらい冗長に書けばよいかな? -- 河童の屁は,河童にあらず,屁である。? 2010-08-09 (月) 16:19:20
  • 混乱したままの質問を投げてしまったのに、親切丁寧にコメントを下さって有難う御座います、すごく勉強になりました。お蔭様で、何とか無事、Loop計算できるようになりました。次は、この結果を一枚のTableにまとめるか、CSVにExportできないか、挑戦してみます!有難う御座いました=) -- z? 2010-08-09 (月) 22:42:28
  • 上記の結果を使って下記のようにgqtestをしてみたのですが、エラーが出ます。
gqt<-lapply(1:88, function(i){
  gqtest( lapply(1:88, function(i){
    lm(eval(parse(text=sprintf("comp%i", i))) ~ eval(parse(text=sprintf("comp%i", 0))), data=dataset)
  }), data= dataset,fraction=50, order.by=NULL) })
 Error in terms.default(formula) : no terms component 

どうアレンジしたら良いのでしょう? 調べ方等、アドバイスを頂けると幸いです。 宜しくお願い致します。 -- z? 2010-08-31 (火) 19:00:42

  • ページが横に伸びて見づらかったため、勝手ながらコードの部分に改行を入れました。長いコードを貼る時は、問題のない箇所で適宜改行してください。そもそも、元のコードは閉じ括弧が足りていませんでしたので、これがあなたが試されたものと質的に同じコードになっているか、お手数ですがもう一度チェックしていただけますか?(まだレスを待っておられるのであれば) -- 2010-09-30 (木) 16:50:40

+が勝手に出て、構文が使えない。

z? (2010-08-07 (土) 21:47:40)

二進も三進も行かず、困っています。データを読み込む行はエラーが出ないのですが、二行目から+が出て、どんな構文を打っても、+が続きます。どこが間違っているのでしょうか?
例えば、下記のようになります。

dataset<-read.csv("C:/Users/(myname)/Documents/(foldername) /(sheet name).csv”, header=T)
+ attach (dataset)
+
  • read.csv(file=file.choose()) として、ダイアログから選んでみてはどうでしょうか。何が間違いかはわかりませんが。headerはデフォルトでTRUEですから必要ありません。 -- 2010-08-07 (土) 22:18:13
  • うまくいきました =) 有難うございます! -- z? 2010-08-07 (土) 23:49:05
  • .csv の次の二重引用符が " でなくて ” ですね。read.csv(" の 二重引用符が閉じていないとみなされるためです(実際,閉じてないんだからあたりまえ)。 -- 河童の屁は,河童にあらず,屁である。? 2010-08-08 (日) 08:50:31

行列データの要素計算方法について

森の熊五郎? (2010-08-05 (木) 16:21:03)

X <- c(0.1, 0.2, 0.3, 0.4)
Y <- c(0.3, 0.5, 0.8, 0.5)
Z <- c(0.6, 0.5, 0.7, 0.9)
sum(X)
sum(Y)
A <- rbind(X, Y)
sum(A)
sum(Z)
B <- rbind(A, Z)
sum(B)

この式を繰り返し文 forを使って実行する方法を知りたい。

BASICでは例えば、A(20,10)の各要素を足し算する方法として

S=0
for I=1 to 20
  for J=1 to 10
    S=S+a(i,j)
  next
next

なる文にて計算が出来ますが、Rの場合、内側のループはsum文で処理をするとして、外側のループをFor文で制御仕様とした場合、どのように文を組めば良いでしょうか?ご教示下さい。上記の例ではsum文とrbind文と使えばよいのですが、rbind文を使わず、for文を使って組む方法を知りたいと思います。

  • なぜそのようなことをしたいのかはさておき、rbind 関数を for 文で実行したいというのなら次のようにすればできますが。 -- 2010-08-05 (木) 18:51:46
     A <- matrix(1:16, nrow=4, ncol=4)
     B <- matrix(1:20, nrow=4, ncol=5)
     nrA <- nrow(A)
     ncA <- ncol(A)
     ncB <- ncol(B)
     S <- matrix(NA, nrow=nrA, ncol=ncA+ncB)
     for (i in 1:nrA) {
       for (j in 1:ncA) S[i,j] <- A[i,j]
       for (j in 1:ncB) S[i,j+ncA] <- B[i,j]
     }
    # もし一重ループなら
     S <- matrix(NA, nrow=nrA, ncol=ncA+ncB)
     for (i in 1:nrA) {
       S[i,1:ncA] <- A[i,]
       S[i,ncA+1:ncB] <- B[i,]
     }
  • 質問文が意味不明
    sum(X) とか sum(A) とか,なにやっているんでしょうか。やりたいことは X, Y, Z を rbind してできる二次元配列の sum を for を使って求めたいというのでしょうか。実際,最後の sum(B) で得られるのはそれですから。X, Y, Z を rbind して,二重の for ループで 集計する。
    一般的には,「○○を使って□□をやりたい」というのではなく,□□を明確・詳細に述べて「□□をやるにはどうすればよいか」を聞くのがよいでしょう。あなたの質問はあなたの聞きたいことを正確に表していないのだと思いますけど?
    rbind を for でやるという意味じゃないんでしょ?もしそうだというなら,なぜそんなことをしないといけないのかわからない。プログラムの勉強ですというならしかたないけど。 -- 河童の屁は,河童にあらず,屁である。? 2010-08-05 (木) 19:32:27
    a <- rbind(X, Y, Z)
    S <- 0
    for (i in 1:nrow(a)) {
        for (j in 1:ncol(a)) {
            S <- S+a[i, j]
        }
    }
    print(S)
    # 内側のループはsum文で というへんな要望に答えるなら
    a <- rbind(X, Y, Z)
    S <- 0
    for (i in 1:nrow(a)) {
        S <- S+sum(a[i, ])
    }
    print(S)
    # でもそんなことする必要もなくて 
    a <- rbind(X, Y, Z)
    S <- sum(a)
    print(S)
    # rbind する必要さえなくて 
    print(sum(c(X, Y, Z)))
    # どれも,あなたのプログラムの最後に sum(B) としたのと同じ答えを得ることになりますよ?
    # それともまさか,
    S <- 0
    for (i in c("X", "Y", "Z")) {
        S <- S+sum(eval(parse(text=i)))
    }
    print(S)
    # または
    S <- 0
    for (i in c(X, Y, Z)) {
        S <- S+sum(i)
    }
    print(S)
    # みたいなのをお望みで?まさかね〜

memory.limiitについて

yoshi? (2010-08-02 (月) 14:56:40)

memory.limit()について質問です。
R上で

memory.limit()
[1] 1535

memory.limit(T)
[1] 12

memory.limit(F)
[1] 10
となります・ここで

memory.limit(4000)
[1] 4000
とした後は

memory.limit()
[1] 4000

memory.limit(T)
[1] 12

memory.limit(F)
[1] 10
となります。ここで質問なんですが「memory.limit()」「memory.limit(T)」「memory.limit(F)」の違いはなんなのでしょうか?今現在Rのメモリの上限のことで非常に困っています。また、皆さんはこのようなコマンドをどこから学んでいるのでしょうか?もし、良いWEBページ等がありましたら教えてくれると幸いです。

  • 付け足しですが、私が使っているパソコンはWindows 7 Professional,4GB,32bitです。 -- yoshi? 2010-08-02 (月) 15:00:41
  • ? memory.limit してみなさい。 -- 河童の屁は,河童にあらず,屁である。? 2010-08-02 (月) 15:10:41

パッケージ「R.huge」の読み込み方法

yoshi? (2010-08-02 (月) 10:49:35)

パッケージ「R.huge」のパッケージの読み込みが上手くいきません。
私がやったことは
�CRANミラーサイトから「R.huge」のzipファイルをダウンロード
�RのGUIで「ローカルにあるzipファイルからのパッケージのインストール」で「R.huge」のインストール
→RのGUI上では「パッケージ 'R.huge' は無事に開封され、MD5 サムもチェックされました 」と表示
�RのGUIで「パッケージの読み込み」で「R.huge」を選択し実行
→RのGUI上で「要求されたパッケージ R.oo をロード中です
 エラー: パッケージ 'R.oo' をロードできませんでした
 追加情報: 警告メッセージ:
 In library(pkg, character.only = TRUE, logical.return = TRUE, lib.loc = lib.loc) :
 'R.oo' という名前のパッケージはありません 」と表示
このように�までは良いと思うのですが、�でエラーが表示されてしまい、パッケージ「R.huge」が読み込まれていないと思います。

これを解決する方法を自分でも探したのですが分らなかったため今回投稿さしていただきました。よろしくお願いします。

  • R.huge は R.oo に依存します.R.oo はインストールしてありますか。 -- 2010-08-02 (月) 12:37:38
  • そーいうことだったんですね汗 R.hugeを読み込むことができました!! でも、処理がR.hugeを読み込む前と後で変わらず処理を行うとエラーメッセージ「 2129600676 のベクトルを割り当てることができません 」が表示され、メモリ(処理の大きさ?)が大きくなったように思えません。「R.huge」は読み込むだけで -- yoshi? 2010-08-02 (月) 13:05:43
  • 全部書く前に挿入してしまいました。 「R.huge」は読み込むだけでメモリが大きくなるのでしょうか?正直、全く使い方がわかりません。 -- yoshi? 2010-08-02 (月) 13:07:37
  • 書き込み整理してください -- 2010-08-02 (月) 20:15:27

2進数表記した時、右から数えて最初にゼロが出現する桁数

aMC? (2010-08-01 (日) 06:07:54)

たとえば、2→10なので1桁目、5→101なので2桁目、7→0111なので4桁目、などのように、2進数表記した時、右から数えて最初にゼロが出現する桁数を求める効率のよいやり方はありますでしょうか?ベクトルを与えると、何桁目かをベクトルで返してくれるようなものが欲しいのですが、forループを使うと時間が掛かり過ぎます。

  • 下の応用。which(intToBits?(7)==0) [1] など。内部ではループを使っているのだろうけど。 -- 河童の屁は,河童にあらず,屁である。? 2010-08-01 (日) 09:09:41
  • 反応がないようですが,反応を待つよりは自分で書いた方が速いことも。もっとも,「forループを使うと時間が掛かり過ぎます」ということなら,なんだかなあともいますけど,反応を待っている間に,単純なプログラムを書いておけば既に答えが求まっているかも(時間が掛かりすぎるって言っても,何十時間もかかるというわけじゃないのだから)。ということで,先の質問と併せて,以下のような,単純無比なプログラムを提示しておきましょう。
    > i2b <- function(x)
    + {
    + 	res <- integer(32)
    + 	for (i in 1:32) {
    + 		res[i] <- x %% 2
    + 		x <- x %/% 2
    + 	}
    + 	return(rev(res))
    + }
    > b2i <- function(x)
    + {
    + 	return(sum(x*2^(31:0)))
    + }
    > (a <- i2b(615729635))
     [1] 0 0 1 0 0 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 0 0 1 1 1 1 0 0 0 1 1
    > (b <- b2i(a))
    [1] 615729635
    > which(rev(a)==0)[1]
    [1] 3
    繰り返しておきますが,このプログラムが効率が悪いと言っても,あなたの人生に比べれば取るに足りない時間です。回答を待つ時間が無駄です。 -- 河童の屁は,河童にあらず,屁である。? 2010-08-01 (日) 21:48:11
  • ありがとうございます。すっきり書けるようになりました。 -- qMC? 2010-08-02 (月) 19:42:50
  • このようなのはどうでしょう。 -- ? 2010-08-03 (火) 05:27:54
    cnt <- function(vector) {
     x <- abs(vector)
     z <- x * 0 + 1
     times <- max(floor(log(max(x), 2)), 0)
     for(i in 1:times) {
      y <- x
      x <- x * 0 - 1
      x <- x + (y %% 2 != 0) * (y + 1) / 2 
      z <- z + (x != -1)
     }
     return(z)
    }
  • 投稿の作法を学びなさい(ちゃんと対応しないから,柳君のページ消されちゃったよ。プログラムを拾って,上にペーストしておく) -- 2010-08-03 (火) 08:34:49
  • f<-function(x){(1:32)[!as.logical(intToBits?(x))][1]} -- 2010-08-03 (火) 23:15:01
  • もう一つ別解を。これは二進法でn桁目が0なら2^(n-1)で割った結果の整数部分が偶数になっているはずだ、という事実を使っています。ceiling(log2(x))でxの二進法での最大桁数を計算して余計な計算をしないようにしています。また二進法ですべの桁が1の時はmin関数の仕様からInfが返されます。同時に警告が出るのでsuppressWarnings関数で警告を抑制しています。 -- 2010-08-04 (水) 09:05:17
    > foo <- function(x){a <- ceiling(log2(x)); 
               suppressWarnings(min(which((floor(x/2^(0:(a-1)))%%2)==0)))}
    > foo(1*2^5+1*2^4+1*2^3+1*2^2+1*2+1)
     [1] Inf
    > foo(1*2^5+1*2^4+1*2^3+1*2^2+0*2+1)
    [1] 2
    > foo(1*2^5+1*2^4+1*2^3+1*2^2+0*2+0)
    [1] 1
    > foo(1*2^5+1*2^4+1*2^3+0*2^2+1*2+1)
    [1] 3
    > foo(1*2^5+0*2^4+1*2^3+0*2^2+1*2+1)
    [1] 3
    > foo(1*2^5+0*2^4+1*2^3+1*2^2+1*2+1)
    [1] 5

b進展開(10進数→2進数、2進数→10進数)関数

qMC? (2010-07-31 (土) 22:56:24)

10進数→2進数、あるいは2進数→10進数へと変換する関数はありませんでしょうか?

  • intToBits? および packBits -- 河童の屁は,河童にあらず,屁である。? 2010-08-01 (日) 09:04:44

Rscriptでコードを実行するとグラフに文字化けが発生

りりぽん? (2010-07-31 (土) 11:56:57)

Rscriptで次のように、test.Rを実行させると、グラフタイトルの日本語文字化けが発生します。Rscriptを使わずに、直接、test.Rを実行すると問題なく日本語が表示されます。どなたか、解決方法をご教授いただけたら幸いです。よろしくお願いいたします。

###### test.bat ###################
C:\R-2.11.1-x64\bin\Rscript test.R
####### test.R ####################
postscript(file="test.eps", horizontal=F, family="Japan1Ryumin")
plot(1:10, main="日本語")
dev.off()
###################################

使用フォーマット・R環境:
ソースコード;UTF-8(BOMなし)エンコード
コマンドプロンプト;cp932;MSゴシック

R version 2.11.1 (2010-05-31) 
x86_64-pc-mingw32

locale:
[1] LC_COLLATE=Japanese_Japan.932  LC_CTYPE=Japanese_Japan.932
[3] LC_MONETARY=Japanese_Japan.932 LC_NUMERIC=C
[5] LC_TIME=Japanese_Japan.932
  • 64ビット版ですか。私には追試できませんでした。少なくとも 32 ビット版では問題は再現できませんでした(どちらのやり方でもちゃんと日本語が表示できました)。何の情報にもなりませんが。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-31 (土) 21:37:47
  • 問題継続中ですが、追試いただきありがとうございました。 -- りりぽん? 2010-08-13 (金) 23:42:56

forを使って変数を作成したい

basel_firb? (2010-07-29 (木) 15:18:47)

過去に「行列にfor文中の変数を含んだ名前をつける 」という質問があり、内容を読み、構文 eval(parse(text=...)を使用するということらしいのですが、よく分かりませんでした。

データフレームに、変数var1 var2 var3・・・var68というのがあり、for文を使って,h1=var1/var68,h2=var2/var68・・・と分子のvarを1〜67まで繰り返し計算したいのですが、どのようにすればよいのでしょうか?

  • 多くの場合 eval(parse(text=...)) は不要です。データフレームの列のアクセスは変数名でアクセスするほかに,列番号でアクセスすることができます。データフレームの名前 を d,(元のデータフレームも残しておきたいなら)新しく h1〜h67 を格納するデータフレームを h とすれば,
    h <- (d/d[,-68])[,-68]
    colnames(h) <- paste("h", 1:67, sep="")
    で十分です。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-29 (木) 17:09:13
  • ありがとうございます。よくわかりました。 -- basel_firb? 2010-07-30 (金) 10:19:35
  • 横から初心者の質問をさせて下さい。h <- (d/d[,-68])[,-68]は,h <- (d/d[,68])[,-68]でしょうか?多分そうですよね?ご教示ください。 -- スイカ? 2010-08-19 (木) 18:45:44
  • そうですね -- 河童の屁は,河童にあらず,屁である。? 2010-08-19 (木) 22:15:47
  • お返事ありがとうございます。ちょっとエラーが出たり,違う結果が出るだけで,右往左往してしまうもので。助かりました。 -- スイカ? 2010-08-20 (金) 08:54:32

Rのメモリ使用量

sano? (2010-07-29 (木) 12:39:07)

こんにちは、hclustで階層的クラスタリングを行おうとすると、

サイズ 3.4 Gb のメモリブロックを割り当てることができません。

とエラーメッセージが出てしまいます。
OSはwindows7,Rのversionは version 2.11.1(64bit), メモリは48GB積んでいます。しかしwindowsのリソースモニターを見ると、11GB程度でまだ余裕があります。

> memory.limit(T)

と実行すると、

[1] 7363

と表示されるので、Rが物理メモリを7GBしか、OSから割り当てられていないということではないかと思います。
30GB割り当ててもらおうと、

> memory.limit(30000)

と入力すると、

[1] 49149
警告メッセージ: 
In memory.size(size) :  メモリー限界を減らすことができません。

と表示され、うまくいきませんでした。
CPUがデュアルCPUでメモリを片側24GBずつ積んでいるのですが、このことも何か関係があるのでしょうか。
いろいろ調べてみたのですが、どうにもいかず、投稿させて頂きました。
お教えいただければ、幸いです。よろしくお願い致します。

  • 申し遅れました。hclustは3万×3万の距離行列を入力としています。 -- sano? 2010-07-29 (木) 15:20:02
  • FAQ のようですけど。Windows版RのFAQ 2.7 R が使うメモリーのサイズに制限があるように見えるのですが. (There seems to be a limit on the memory it uses!)
    大元はR for Windows FAQ で,その中の 2.9 There seems to be a limit on the memory it uses! ですね。
    Version for R-2.11.1 と表題にあり,内容も少し違っているようですから,確認してみるとよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-29 (木) 18:11:00
  • ご回答いただき、ありがとうございます。> tmp<-diag(1,46340)と、意図的にメモリを使用し、> memory.limit(F)とうつと、>[1] 36693と返ってきたので、メモリ限界はやはり、物理メモリサイズの48GBの様です。ですが、hclustの実行中にエラーが出るということは、FAQにある様にメモリマネージャーの影響ということなのでしょうか。 -- sano? 2010-07-29 (木) 21:03:00
  • 3万だと, 私のマシンで2カ月ほど処理時間がかかると思いますし, 46340だと1年くらいです. 1万位なら1日程で処理してくれます. -- 2010-07-30 (金) 18:19:40
  • コメントありがとうございます。cluster packageのagnes関数で行ったところ、エラーはでないのですが、ご指摘のとおり、恐ろしく時間がかかっています。48時間経過して終わっていません。 -- sano? 2010-08-01 (日) 11:34:18
  • たぶん,対象数の二乗に比例する時間が必要なので,1000,2000,3000位のところで計算所要時間を求め,lm で多項式回帰して predict で30000の場合の計算所要時間を見積もってから実行するのがよいでしょう。ところで,計算できたとして,計算結果を見るのは大丈夫なんでしょうね。 -- 2010-08-01 (日) 12:55:47
  • サンプル数3万ですと、プロットしても解釈できないので、cutreeでk群に分類して、クラスタの属性(変数)平均を見て、クラスタの特徴を確認する予定です。そうすると、kmeansとかでも良いのかもしれませんが。 -- sano? 2010-08-02 (月) 09:57:49
  • 72時間ほどで計算できました。hclustでエラーになりagnesで実行できたのは、未だに謎ですが。 -- sano? 2010-08-03 (火) 22:56:12

T,Fを文字列として出力するには

sayaka? (2010-07-26 (月) 11:59:13)

いつも参考にさせていただいております。自分でも本やGoogleなどで調べたのですがどうもわからず、質問させていただきました。
以下のようなデータ"test_data.csv"があるとき

"T","T"
"T","F"
"T","T"
"F","F"

data <- read.csv("test_data.csv",header=F)

というようにread.csvを使ってデータを読み込むと、以下のようにTやFが文字列ではなく論理値として出力されてしまいますが、どのようにすれば文字列として認識させることが出来るでしょうか?

> data
     V1    V2
1  TRUE  TRUE
2  TRUE FALSE
3  TRUE  TRUE
4 FALSE FALSE

どうぞよろしくお願い致します。

  • T,F はRでは特別な意味を持ちますから最初から使わないのが一番でしょう.たとえば t,f をつかえばこのような問題は回避できます.それじゃ嫌だという向きには次のような対症療法があります.データファイルの最後の行に行 "A","A" を加えてからつぎのようにします.要は "T","F" だけだとRは勝手に論理値と解釈するようになっているようです. -- 2010-07-26 (月) 14:17:26
    > data <- read.csv("test_data.csv",header=F)
    > data
      V1 V2
    1  T  T
    2  T  F
    3  T  T
    4  F  F
    5  A  A
    > data[-nrow(data),]
      V1 V2
    1  T  T
    2  T  F
    3  T  T
    4  F  F
    > str(data[-nrow(data),]) # 因子水準に "A" が残りますがご愛嬌
    'data.frame':	4 obs. of  2 variables:
     $ V1: Factor w/ 3 levels "A","F","T": 3 3 3 2
     $ V2: Factor w/ 3 levels "A","F","T": 3 2 3 2
  • 読み込んだ後,data <- sapply(data, function(x) ifelse(x, "T", "F")) とすればよいのだけど。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-26 (月) 14:36:25
  • お二方、ご回答頂きありがとうございます。お二方のご回答を参考にして対症療法でやりましたらうまくいきました。ありがとうございます。 -- sayaka? 2010-07-26 (月) 16:07:02
  • 追加コメント.河童さんのやり方は明快でお勧めですが,結果はただのリストですから,データフレームが欲しければさらに as.data.frame(data) とする必要があるようです. -- 2010-07-26 (月) 16:32:33
    > data <- read.csv("test_data.csv",header=F)
    > is.data.frame(data)
    [1] TRUE
    > data <- lapply(data, function(x) ifelse(x, "T", "F")) 
    > is.data.frame(data)
    [1] FALSE
    > is.list(data)
    [1] TRUE
    > data <- as.data.frame(data)
    > is.data.frame(data)
    [1] TRUE
    > data
      V1 V2
    1  T  T
    2  T  F
    3  T  T
    4  F  F
  • あなたは lapply を使ったので戻り値は list になりましたね。提示したのは sapply を使いましたから,戻り値は matrix です。matrix ならば,多くの場合 data.frame 的に使うことができます。いずれにしろ,data.frame が必要なら as.data.frame が必要ではありますが。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-26 (月) 17:57:33
  • お二方、追加コメントありがとうございます。ちなみに、私が使いたいデータにはT,F以外の文字列の列も含まれているのですが、お二方のコメントを参考にこのような関数を作ってみたのですがうまくいきません。 -- sayaka? 2010-07-27 (火) 10:59:00
  • T, F 以外の文字列が含まれているものを read.table("ファイル", as.is=TRUE) でデータフレームに読んだら,T も F も文字列として読めるでしょう?
    ちなみに,上の無名コメンテータのプログラム例だと,ご本人も言っておられるように「文字列ではなく factor」として読まれるのですよ。だから,as.is=TRUE が必要なんです。もっとも,factor として読まれたものを,as.character で文字列に戻すことはできますけど。
    どんなプログラムを書いたのかなかなかアップできないようですけど,そのあたりのことが関係しているのではないですか?
    ちびちびと小出しにするのではなく,聞きたいことをはっきり書いてもらう方がお互い時間の節約ということになると思います。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-27 (火) 11:09:59
  • コメントありがとうございます。小出しに質問してしまって申し訳ありませんでした。
    T,T,A
    T,F,A
    T,T,A
    F,F,A
    
    fixTF <- function(x) {
      if (is.logical(x)) {
        return(ifelse(x, 'T', 'F'))
      }else {
        return (x)
      }
    }
    data <- read.csv("test_data.csv", header=FALSE)
    data1 <- lapply(data, fixTF)
    data1 <-  as.data.frame(data1)
    data1
    
      V1 V2 V3
    1  T  T  A
    2  T  F  A
    3  T  T  A
    4  F  F  A
    以上のようにうまくいきました。もっとよく勉強します。ありがとうございました。-- sayaka? 2010-07-27 (火) 11:33:03
  • なるほど,T, F のある列は T, F だけなんですね。だったら,as.is=TRUE をやっても意味はないですね。ところで,そういうことならば,あなたの書いたプログラムのように fixTF をすべての列に作用させることはないのです(fixTF の else { return(x) } の部分(当然その前の if ( ) )も不要になります)。対象列がそんなに多くないなら,data$V1 <- fixTF(data$V1) のように個別に変換するとよいでしょう。そうすれば,後で as.data.frame なんか必要ないですし。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-27 (火) 11:55:29
  • 重ねてコメントありがとうございます。質問が言葉足らずで申し訳ありませんでした。おかげさまで無事解決できました。お二方ともありがとうございました。 -- sayaka? 2010-07-27 (火) 13:17:56

式が上手く評価されない?

em? (2010-07-21 (水) 01:30:51)

runif()関数を使って一様乱数を生成し、0〜100の範囲に変換してみました。

x <- round(runif(100), 2) * 100

ここで、7の出ている回数を調べようと

length(x[x==7])

とやると、実際にはベクトルxに7が含まれていても、0になってしまします。
また、x[x==7]のような式の結果もnumeric(0)となってしまいます。
どこがまずいのでしょうか?

  • 見かけは整数でも実際は実数とみなされているからでしょう. x[as.integer(x)==7] とすれば期待通りになりませんか. -- 2010-07-21 (水) 02:47:03
  • 理由と対処法は上のコメントの通りです。length(x[as.integer(x) == 7]) よりは sum(as.integer(x) == 7) とするのがよいでしょうけど。
    また,このようなことを避けるため,整数の一様乱数を生成するのには sample 関数を使うと良いでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-21 (水) 08:18:50
  • お二方、ご回答有難うございます。 なるほど内部では実数として処理されているということですね。しかし、1つ腑に落ちない点がありまして、きちんと評価される数字もあれば、そうでない数字もあります。7はダメですが、0〜6は大丈夫であったり。もしよければ、その理由も合わせて教えていただきたいです。 また、河童の屁は,河童にあらず,屁である。さん、改善点の指摘と代替案、有難うございます。 -- em? 2010-07-21 (水) 09:49:30
  • 本来は,コンピュータ上での実数は近似値に過ぎません。ただし,整数値(小数部を持たないもの)および,小数部が2進数で循環小数にならないもの(0.5, 0.125 などなど)は正確な数値として扱われます。ただし,整数値であっても,数値計算の結果整数値となる場合は誤差が含まれることがあります(例えば 0.01 を 100 回加えても 1 と等しくならないこともある)。「うまくいくもの」はたまたまということです。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-21 (水) 10:07:59
    > x <- 0
    > for (i in 1:100) x <- x+0.01
    > x      # x を表示させると 1 になっているけど
    [1] 1
    > x == 1 # 0.01 を 100 回足しても 1 にはなっていない
    [1] FALSE
    > (a <- round(0.0718*100))
    [1] 7
    > a == 7 # この場合は 7 だけど
    [1] TRUE
    > (b <- round(0.0718, 2)*100)
    [1] 7
    > b == 7 # このようにして得られた数値は 7 ではない
    [1] FALSE
    > all.equal(b, 7) # testing ‘near equality’  all.equal と identical の違い
    [1] TRUE
    > identical(b, 7) # being exactly equal
    [1] FALSE
  • 河童の屁は,河童にあらず,屁である。さん、追加の質問に詳細にわたりご回答いただき、有難うございます。おかげさまで、R、ほか一般のコンピュータを用いた数値計算の処理に対してより理解が深まりました。非常にわかりやすいサンプルプログラムにも感激いたしました。これで解決とさせていただきます。ありがとうございました。 -- em? 2010-07-21 (水) 10:33:22

デンドログラムのデータNo.の表示指定

hashiro? (2010-07-18 (日) 16:50:49)

「Rによる統計解析」を読みながらクラスター分析を行っています。
エクセルで、194の変数、160行のデータです。
R内に読み込んでデンドログラムまでは出来ました。
この時、デンドログラム最下段には1〜160までのNo.が表示されますが、
この数字をエクセルのa列の文字で表示したいのです。
plotの中にlabels= で指定すればいいみたいですが、指定の仕方が悪くエラーが出てしまいます。
指定方法をどうか教えていただけませんか。

  • どのように指定したら、どのようなエラーが出たんでしょうか?そのあたりが分からないと回答のしようがないと思いますけど -- 河童の屁は、河童にあらず、屁である? 2010-07-18 (日) 17:33:29
  • plot(ans, labels = f.xls[sheet1$a2:a161], hang=-1, cex=0.3, main="Cluster") では、「オブジェクト "f.xls"は存在しません」とエラーが出ます。 エクセルファイルとシートファイルおよびデータ位置を指定する表現の仕方がおかしいと思って、いろいろ記号を付けたり消したり試しているのですが、うまくいきません。 -- hashiro? 2010-07-18 (日) 18:21:39
  • 要素の指定方法で解決できました。ありがとうございました。 -- hashiro? 2010-07-19 (月) 04:36:32

相関ルールについて

t_y? (2010-07-16 (金) 10:57:30)

今現在相関ルール抽出のパッケージ「arules」を用いているのですが、分からないことがあります。しかし、言葉で端的に言うのは難しいので例を交えて説明します。
買い物バスケットで以下の例があるとします。

TID	アイテム集合
1	{パン、牛乳}
2	{ハム、牛乳}
3	{ビール、たばこ}

このデータを「data」に代入します。

> data <- list(c("パン", "牛乳"), c("ハム", "牛乳"), c("ビール", "たばこ”))

そして transactions 形式のデータを「data.tran」に代入します。

> data.tran <- as(data1, "transactions")

次に相関ルール「data.ap」に生成します

> data.ap <- apriori(data.tran)

生成された相関ルールは以下の 3 つです。

  lhs         rhs        support
1 {パン}   => {牛乳}   0.3333333
2 {ハム}   => {牛乳} 0.3333333
3 {ビール} => {たばこ} 0.3333333

相関ルールは lhs⇒rhs で「lhs が存在する場合に rhs が存在する」という意味です。
Support は「特定のルールの数÷全てのルール」です。例えば{パン}→{牛乳}の場合、support=1/3 です。

ここでもしアイテム「パン」と「牛乳」が新たなアイテム「食べ物」に属するとします。
属した場合の相関ルールの例を載せます

  lhs         rhs        support
1 {食べ物}   => {牛乳}   0.6666666
2 {パン}   => {牛乳}   0.3333333
3 {ハム}   => {牛乳} 0.3333333
4 {ビール} => {たばこ} 0.3333333

このように「食べ物」の中に「パン」と「ハム」が含まれているため suppot=2/3 になります。
しかし、data2 に以下のように代入し、

> data2 <- list(c(“食べ物”, ”牛乳”), c("パン", "牛乳"), c("ハム", "牛乳"),
+               c("ビール", "たばこ”))

同様に相関ルールを作成すると、

  lhs         rhs      support 
1 {パン}   => {牛乳}      0.25
2 {ハム}   => {牛乳}      0.25
3 {ビール} => {たばこ}    0.25
4 {食べ物} => {牛乳}      0.25

のようになり support の値が変化してしまいます。
これを解消する方法を教えて下さい。

SensomineRの分散分析でのエラー

Sensory? (2010-07-15 (木) 19:17:26)

分散分析を行うと出現するエラーについてです.R,Rcommander,SensomineRを使っています.SensomineRよりpanel performance(分散分析)を起動させた場合,Product35×Panelist5×descriptor9ではエラーは出現しないのですが,Product31×Panelist5×descriptor9では,"置き換えるべき項目数が,置き換える数の倍数ではありませんでした”というエラーが出現します.

何か解決策があれば教えて頂けないでしょうか.よろしくお願い致します.

  • なぜ,なかなか,回答が,得られないか。
    あなたが,何を,どうやったか,よくわからないからではないでしょうか?
    コンソールに入力したものをそのままコピーするだけでも,回答のきっかけになるのではないかなあ。
    私にはわからないけど,きっと他の誰かが答えてくれるでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-17 (土) 21:15:06

Rによる、SPSSファイルからSTATAファイルへの変換の仕方について

大学生? (2010-07-12 (月) 20:25:01)

SPSSファイルを、STATAファイルに変換したいのですが。

library(foreign)
read.spss("datafile",use.value.labels=FALSE)

で、SPSSファイルを読み込んだあと、そのまま、STATAファイルに変換して、保存したいのですが。この後のコマンドがわかりません。

Rのバージョンは2.8.1で、MACです。どうかよろしくお願いします。

  • 何となくのコメントで申し訳ないですが,あるアプリケーションプログラムが第三者同士のファイル変換のための機能を提供しているとは普通は考えられませんね。
    大多数のアプリケーションプログラムが共通して読み込めるデータファイルは,CSV でしょう。ということで,A というアプリケーションプログラムのデータを R で読んで,CSV でファイルに書いてやれば,B というアプリケーションプログラムが CSV ファイルを読めるならば,問題解決でしょう。
    というか,多くのアプリケーションプログラムは,他のアプリケーションプログラムで作られたファイルを読み込める機能を持っていることが多いですよ。つまり A というアプリケーションプログラムは B というアプリケーションプログラムの作ったファイルを「直接」読み込めるということ。
    そういうことが期待できないにしても,別に R が仲立ちをしなくても,A というアプリケーションプログラムに CSV ファイルに書き出す機能があれば,そのようにして書き出されたファイルを B というアプリケーションプログラムが CSV を読み取る機能を使って読み取ればよいだけでしょう。
    いずれの場合も,書き出された CSV を直接読み取るに当たって若干の障害が起きることはあるかも知れません(一行目に変数名を含むか含まないかなど)。しかし,CSV は所詮テキストファイルなので,然るべきテキストエディタを使うなりして,その障害を回避することはできるでしょう。
    まずは,それぞれ(今の場合は SPSS とSTATA か)の機能(マニュアル)を調べるのが吉。
    Stat/Transfer というデータ変換ソフト(有償)があるようですね(他の質問サイトにいっぱい同じ質問をしているようですが,それくらいは自分で探しましょう)。
    > Rのバージョンは2.8.1
    当面の問題には関係ないことですし余計なお世話ですけど,自分で管理できない環境でないなら最新の環境にしましょうね。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-12 (月) 21:06:04
  • コメントありがとうございます。SPSSファイルを読み込めることも、STATAファイルとしての保存もできるはずなんです。ただやりかたがいまひとつわからなくて。有償ソフトの存在は存じています。ただ、ちょっと手が届く値段ではないので・・・・ -- 大学生? 2010-07-12 (月) 22:53:52
  • このwikiを"stata"で検索してみてください。私はstataは使ってないので検証はできませんが。 -- 2010-07-13 (火) 01:38:27
  • library(foreign) write.dta(ここにRのデータフレーム名,file="ここに書き出すファイル名.dta", convert.factors = c("string")) でできるようなのですが、SPSSファイルを読んだ直後のフレーム名ってなんですか?m(__)m -- 大学生? 2010-07-13 (火) 07:26:44
  • > SPSSファイルを読んだ直後のフレーム名ってなんですか
    read.spss で読み込んで付値したデータフレーム名のことですよ。d <- read.spss("datafile",use.value.labels=FALSE) としたなら d のことです。
    データフレームに付値する必要がなければ,write.dta(read.spss("datafile",use.value.labels=FALSE), file=出力ファイル名, ...) とするも可。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-13 (火) 07:34:56
  • いろいろいじったらできました、ありがとうございました。 -- 大学生? 2010-07-13 (火) 10:23:43

3次元グラフにおける座標点の表示

メジロウ? (2010-07-09 (金) 21:24:59)

マトリックスを3次元グラフで描画した時、x、y、zの座標まで、グラフ内に頂点として表示されてしまいます

x、y、zの座標点を取り除き、純粋に数値の座標点のみを頂点として描画するにはどうすれば良いでしょうか?

打ち込んだコマンドラインは以下の通りです

jhin <-matrix(c(
1.1479, 0.8587, 0.8719,
-1.099, 0.353, 0.972,
-1.3226, -0.4005, -0.9295,
-0.4804, -0.7637, -1.3671,
-0.1707, -1.3382, 1.1815,
0.2106, 0.7653, -1.7421,
0.3761, 1.8047, 0.0608,
0.4473, -1.3014, 0.7972,
1.625, 0.7415, 0.5675,
1.5616, -0.7194, -0.4122),
nrow = 10, ncol = 3)
jhin
rownames (jhin) <- paste("in", 1:10, sep="")
colnames (jhin) <- c("X", "Y", "Z")
jhin
rg <-jhin
library(sna)
gplot3d(rg, thresh = 1.1, displayisolates = TRUE, suppress.axes = FALSE,
        displaylabels = TRUE, xlab = "dimension 1",
        ylab = "dimension 2", zlab = "dimension 3")
  • 例としてあげられた jhin は三次元の座標が 10 組ということでしょうか?gplot3d の第 1 引数はそのようなものではないようですが? -- 河童の屁は,河童にあらず,屁である。? 2010-07-10 (土) 17:20:40
  • そうです。コマンドラインの上部にある10組の座標(jhin)を3次元グラフで描画したいのですが、グラフ化した時に何故かx、y、zの座標点までグラフ内に描画されてしまうのです -- メジロウ? 2010-07-16 (金) 14:35:09
  • コマンドラインを修正しました。しかし、頂点の数は変わらず13個です・・・jhin <-matrix(c( -- メジロウ? 2010-07-16 (金) 20:57:36
  • そういうことを言っているのではなく,gplot3d は 3 次元空間の座標を与えてその座標点を表示するようなプログラムではないんじゃないでしょうかと言っているわけです。3次元空間の座標点を表示するプログラムとしては,たとえば rgl の plot3d があり,それは引数として3次元空間の座標を取ります。例に挙げたのは3次元空間で原点に頂点を置く立方体の座標を与えて plot3d で描いたものです。この3次元の座標をマトリックスにしてgplot3d に与えても,座標点が11個になってしまうのはさておいても,立方体の頂点なんか表示されないでしょうということなんです。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-16 (金) 23:28:46
    library(rgl)
    x <- c(0,1,1,0,0,1,1,0)
    y <- c(0,0,1,1,0,0,1,1)
    z <- c(0,0,0,0,1,1,1,1)
    library(scatterplot3d)
    plot3d(x, y, z, size=20, col=2)
    library(sna)
    gplot3d(cbind(x, y, z))
    
    > cbind(x, y, z)
         x y z
    [1,] 0 0 0
    [2,] 1 0 0
    [3,] 1 1 0
    [4,] 0 1 0
    [5,] 0 0 1
    [6,] 1 0 1
    [7,] 1 1 1
    [8,] 0 1 1
    plot3d.png
  • お返事ありがとうございます。立方体の頂点を表示したい訳では無いのですが、例に示して頂いたように、gplot3dを用いて3次元のグラフを描画すると、座標点が増えてしまうのが問題なのです -- メジロウ? 2010-07-19 (月) 12:49:47
  • 別に立方体の頂点を表示したいわけでないのは重々承知しています。でもあなたはどのような「3次元のグラフを描画」したいというのですか?gplot3d では「マトリックスを3次元グラフで描画」できないんじゃないでしょうかと言っているだけなんですが?
    example にある,gplot3d(rgws(1,5,3,1,0)) をやってみても,仰るような「座標点が増えてしまう」ということはないようですけど?
    rgws(1,5,3,1,0) は 125 × 125 の matrix で,描かれるのは 5 × 5 × 5 の 125 個の格子点ですよね?
    「x、y、zの座標まで、グラフ内に頂点として表示されてしまいます」なんて状況にはないようです。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-19 (月) 22:46:23
    glid.png
  • 状況が伝わりづらくて申し訳ありません。私は10個の座標を3次元で表示し、隣接する座標の距離が1.1以下の座標のみを線で結びたいのです。そのためにgplot3dを使ってグラフを描画しようと思っています。 -- メジロウ? 2010-07-20 (火) 13:00:49
  • なんだぁ。最初っからそういえばよいのに。jhin を使って例を示すなら,以下のようにすればよいだけでしょう。要するに,X,Y,Z 座標をマトリックス形式で与えてもダメだと最初っからいっていたでしょ?
    > library(sna)
    > gplot3d((as.matrix(dist(jhin)) <= 1.1)+0)
    jhin.png
    (as.matrix(dist(jhin)) <= 1.1)+0 は,以下のような行列です(+0 は FALSE/TRUE を 0/1 にするのですが,今の場合は FALSE/TRUE のままでもよいようです)。要するに,結びたい(結ばれている)要素同士は1,そうでないなら0で表すんです。まあ,対角成分は0でもよい(どうでもよいみたいだけど)。
    > (as.matrix(dist(jhin)) <= 1.1)+0
         in1 in2 in3 in4 in5 in6 in7 in8 in9 in10
    in1    1   1   0   0   0   0   0   0   0    0
    in2    1   1   0   0   0   0   0   0   0    0
    in3    0   0   1   0   0   0   0   0   0    0
    in4    0   0   0   1   0   0   0   0   0    0
    in5    0   0   0   0   1   0   0   0   0    0
    in6    0   0   0   0   0   1   0   0   0    0
    in7    0   0   0   0   0   0   1   0   0    0
    in8    0   0   0   0   0   0   0   1   0    0
    in9    0   0   0   0   0   0   0   0   1    0
    in10   0   0   0   0   0   0   0   0   0    1
    ラベルをつけたりなんだらかんだらは自分でやってください。
    なお,見て分かるように,各点は jhin の三次元座標を使って表示されているわけではないことに注意。だって,描画に使っているのは,as.matrix(dist(jhin)) <= 1.1 なんだもの。
    たぶん,それは,あなたにとっては不本意でしょうが,そもそも gplot3d は今回のあなたの意図を表現するには,最初っからいっているように,ふさわしくない関数だということ。-- 河童の屁は,河童にあらず,屁である。? 2010-07-20 (火) 13:53:09
  • なぜあなたが gplot3d にこだわるのか分からないけど,三次元空間の座標点と距離が特定の値以下の点を結ぶなら,plot3d ででもできますよね。
    library(rgl)
    plot3d(jhin, type="s", col=4, radius=0.05)
    text3d(jhin, text=1:10, adj=2)
    d <- as.matrix(dist(jhin))
    con <- which(d <= 1.5, arr.ind=TRUE)
    apply(con, 1, function(xy) lines3d(jhin[xy,], lwd=3, col=2))
    jhin2.png
    jhin を例としましたが,見栄えをよくするため,距離が 1.5 以下の点を結んでみました(当たり前ですが,どの点を結ぶかもプログラムで決めます)。-- 河童の屁は,河童にあらず,屁である。? 2010-07-20 (火) 17:05:57

Dataframeからある特定の因子を持つ行を抜き出したい

hello r? (2010-07-09 (金) 15:46:59)

ググッたり、ここのDatagram tipsを見たのですが、解決しなかったので質問させていただけると助かります。

CSVファイルから読み込んだファイルに因子が含まれています。

      t   s
1   3755  sd
2   3840  sd
3   3856  si
4   3884  sd
5   4011  si
6   4031  sd
7   4033  sd
8   4115  sd
9   4147  si
10  4157  si


ここから因子ごとにdataframeを分離したいと考えています。
因子でなければ

v <- dataframe[,"s"] == "sd"
dataframeSD <- dataframe[v,]

などとして抽出できると思うのですが、最初の因子の比較がDataframeの該当列の因子の取得方法が分からないため、マッチングが行えません。
どのように対処すればよいでしょうか。
もしよろしければご教授願えないでしょうか。
よろしくお願いします。

  • データフレームを d とすれば,split(d, d$s) -- 河童の屁は,河童にあらず,屁である。? 2010-07-09 (金) 15:56:04
  • ありがとうございます。それでうまくプログラムを組めました。個人的な興味なんですけど、純粋に因子の組み合わせだけを抜き出すことってできないですか?。 -- hello r? 2010-07-09 (金) 17:44:28
  • あなたが上に書いたことをやってみなかったのですか?ちゃんとできているんですよ。
    > v <- dataframe[,"s"] == "sd"
    > dataframeSD <- dataframe[v,]
    > dataframeSD
         t  s
    1 3755 sd
    2 3840 sd
    4 3884 sd
    6 4031 sd
    7 4033 sd
    8 4115 sd
    split を使う方法を示したのは,その方が汎用性が高いから。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-09 (金) 18:06:55
  • ええと、私のやりかたがまずいのかもしれませんが、vが全てFALSEになります。 -- hello r? 2010-07-09 (金) 19:30:56
    > v <- df[,2] == "si"
    > v
     [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
  • class(d[,2]) としたら何が表示されますか?私の場合は,factor であるといわれますけどね? -- 河童の屁は,河童にあらず,屁である。? 2010-07-09 (金) 19:46:06
    > v <- d[,2] == "si"
    > v
     [1] FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE
    > class(d[,2])
    [1] "factor"

メトロポリス法によるパラメータ推定プログラムを自作するにあたって

Saito? (2010-07-06 (火) 00:54:49)

いつもお世話になっています。
ググっても、過去ログを漁っても、持っている本を読んでも、どうしてもわからなかったので、質問させてください。
都合により、メトロポリス法によるパラメータ推定プログラムを自作しています。が、メトロポリス法によるパラメータ推定がうまくいきません。以下に例を示します。

set.seed(1)
iter <- 20000 

###真の値###
a <- 10
b <- 2
x <- seq(0.01, 1, length=500)
y <- b*x + rnorm(500, a, 1) 
###尤度の計算(!!!対数にはしていない!!!)###
cost_func2 <- function(a3, b3) { 
sum(dnorm(y, a3 + b3*x, 1))
}
###乱数と初期値の設定###
u <- runif(iter, 0, 1)
u2 <- runif(iter, 0, 1)
a4 <- b4 <- numeric(iter+1)
a4[1] <- b4[1] <- 5
lag <- 4

###メトロポリス法(?)の実行###
for(i in 1 : iter) { 
a4_2 <- a4[i] + runif(1, -lag, lag)
b4_2 <- b4[i] + runif(1, -lag, lag) 
###一つ前のサンプルで計算されるcost_funcの値が近すぎると、ほとんど採択される???###
a4[i+1] <- ifelse(u[i] < cost_func2(a3=a4_2, b3=b4[i])/
                         cost_func2(a3=a4[i], b3=b4[i]),
                         a4_2, a4[i])
b4[i+1] <- ifelse(u2[i] < cost_func2(a3=a4[i+1], b3=b4_2)/
                          cost_func2(a3=a4[i+1], b3=b4[i]),
                         b4_2, b4[i])
}
hist(a4[(iter/2):iter])
hist(b4[(iter/2):iter])


疑問点は二つです。メトロポリス法の場合でも、尤度を計算すると思いますが、対数尤度にするとマイナスになる場合があります。メトロポリス法では、棄却するか採択するかのときに、一つ前のパラメータのサンプルと現在のパラメータのサンプルの比をとります。しかし、比を取ってしまうと、マイナス同士が消しあってしまうこともあります。例えば、パラメータ-10が前回のサンプル、-11が今回のサンプルだとします。-10と-11の比は、1.1ですよね。同じく、10と11の比も1.1です。しかし前者は前回のサンプルよりも尤度は小さくなっており、後者は尤度が大きくなっています。しかし、比をとるだけだと、両者とも採択されてしまう気がします。そのため上記のプログラムでは対数にしていません。
もう一つの疑問は、メトロポリス法では、上記のように比を取った後、一定確率(u)で、尤度が小さい方向にサンプルされても、採択する場合があります。しかし、前回のサンプルと今回のサンプルの比が、例えば、先ほどの11、10でサンプルされる順番が逆だったとすれば、10/11=0.91となります。この0.9という数字は、ほとんど1に近く、ずっとこの比でサンプルが続けられるとすると、どんどん間違った方向へサンプルが続いていきます。

このようなことを避けるにはどうすればよいのでしょうか。
上記のプログラムですと、a4とb4の平均値がそれぞれ10と2になればよいのですが、うまくいきません。仮にb4を消して、切片モデルでやるとうまくいくのですが、それでは解決にならないので・・・。

どなたかわかる方がいましたら、ご教授のほどよろしくお願いいたします。
なお、環境はWindows7, R-2.11.1です。

  • メトロポリス法については知らなかったのですけど,a4, b4 の更新時の ifelse で,なぜ一様乱数値と比較しているんですか? cost_func2(a3=a4_2, b3=b4[i])/cost_func2(a3=a4[i], b3=b4[i]) が,1より大きいか小さいかを比較すべきでは?
    以下のように修正するとそれらしき値が推定できますけど? -- 河童の屁は,河童にあらず,屁である。? 2010-07-06 (火) 09:52:04
    a4[i+1] <- ifelse(cost_func2(a3=a4_2, b3=b4[i]) > cost_func2(a3=a4[i], b3=b4[i]),
                            a4_2, a4[i])
    b4[i+1] <- ifelse(cost_func2(a3=a4[i+1], b3=b4_2) > cost_func2(a3=a4[i+1], b3=b4[i]),
                            b4_2, b4[i])
      :
    > mean(a4)
    [1] 10.05778
    > mean(b4)
    [1] 1.890743
  • 早速の回答ありがとうございます。確かに、示してくださったコードですと、それらしい値にはなります。しかし、このコードですと、一旦どこかにトラップされると抜け出すのが困難です(実際、a4の値は上記コードを走らせたあと、ほぼ全て同じ値になっているようです)。そのために、一様乱数と比較していて、尤度が高いほうにも、(一様乱数との兼ね合いで)低いほうにも進むようなアルゴリズムでパラメータを推定しているのです。一様乱数によって、採択するかどうかを決定するのは、メトロポリス法の特徴らしいです。念のため、メトロポリスをRコードで記述した資料のリンクも貼っておきます。 ここまで情報が得られているのに、どうしてできないのか、我ながら情けないです。どこか、勘違いをしているのだと思うのですが、どうしてもできません。引き続き、どなたか、わかる方がいらっしゃいましたら、どうぞよろしくお願いいたします。-- Saito? 2010-07-06 (火) 10:24:49
  • 資料をもう一度よく読んでください。f(x)は尤度関数ではなく,確率密度関数です. -- surg? 2010-07-06 (火) 14:56:37
  • 回答ありがとうございます。ええと、尤度関数でなく確率密度関数に直せば、OKということでしょうか?ええと・・・。すみません、尤度を使わずにコードを組む、ということではないですよね?確かに、私のコードではdnormをsumしているので、尤度の最大化を図っていますが、資料では、dnormのみです。とはいうものの、あてはまりのよさそうなパラメータを探索するのに、尤度を計算するのは必要な気がするのですが・・・。ごめんなさい、何か勘違いをしてるかもしれません。簡単なコード例か、間違っている箇所のコードを指摘していただけると助かります。。。 -- Saito? 2010-07-06 (火) 16:00:39
  • 確率密度関数なので,負の値にはならないというのは了解ですか? -- surg? 2010-07-06 (火) 16:52:15
  • 早速の返信ありがとうございます。確かに確率密度ですと負の値にはなりませんが、対数にすると、負になることもあるのかと思った次第です。対数を取らなければよい、という話になるのでしょうか? -- Saito? 2010-07-06 (火) 16:56:22
  • sum(dnorm(y, a3 + b3*x, 1)) が尤度になるということについて,何か参考書などはありますか? -- 河童の屁は,河童にあらず,屁である。? 2010-07-06 (火) 17:36:30
  • ええと、クリティカルな参考書はありません。しかし、平均値がa3+b3*xに従って、その周りに実際のyの値がばらつくのだから、これで尤度になるのかと考えて、そのようにコードしました。誤差はわざと固定しました。そして、本当は尤度の積が必要ですが、それだとデータが多いと0になってしまい都合が悪いので、対数にしたいのですが、それができないのかな、という最初の疑問なのです。ですから、指摘してくださったコードの部分はもとより自信がありません・・・。もし何か気づいたことがありましたら、ご教授願えないでしょうか。 -- Saito? 2010-07-06 (火) 17:51:18
  • なぜ確率密度関数の対数をとるのですか? 誤解を恐れずに簡略化すれば,メトロポリス法とは乱数で確率の高い方を選びやすくしているだけの話です。-- surg? 2010-07-07 (水) 08:09:52
  • メトロポリス法で分布パラメータを推定するには二つの方法があります。一つはMCMC法で,これは事前分布を与えて事後分布にしたがう標本をメトロポリス法(もしくはギブスサンプラー)で多数発生するという方法です。もう一つはいわゆるシミュレーテッドアニーリング法です。もし後者なら最適化関数 optim のオプション SANN で実行できます。 -- 2010-07-07 (水) 09:57:00
  • > surgさん。なぜ・・・といわれると、確かに困りますね。。。しかし、尤度の計算のところを、
    likelihood <- 1
    likelihood2 <- 0
    cost_func2 <- function(a3, b3) { 
    for (i in 1 : length(y)) {
    likelihood2 <- likelihood * dnorm(y[i], a + b*x[i], 1)
    likelihood <- likelihood2
    }
    return(likelihood2)
    }
    などとして、対数を取らずに尤度の積を計算するようにしても、結果はやはり上手く推定できません。-- Saito? 2010-07-07 (水) 10:08:08
  • できれば、optimを使わず、自分で作りたいと思っています。勉強のためです。 -- Saito? 2010-07-07 (水) 10:11:15
  • すみません、河童の屁は,河童にあらず,屁であるさん。あまりにも、自分で考えておらず、掲示板の皆さまに頼るばかりのような質問でしたでしょうか?でしたらお詫び申し上げます。しかし、私としては本当に困っています。自分なりにやれるところまでやっていた結果を載せていたつもりでしたが・・・。 -- Saito? 2010-07-07 (水) 10:44:03
  • 何も分からないので教えてください。
    (1) sum(dnorm(y, a3 + b3*x, 1)) が尤度を求めるものだとして,なぜ,x は eq(0.01, 1, length=500) なのでしょうか。y の範囲は 7.856883, 15.790437 になりますが,平均値・分散の異なる正規分布でこの範囲の dnorm(y, ...) を求めるのでよいのでしょうか?
    (2) 結果の後半だけ a4[(iter/2):iter] を使う理由は何でしょうか。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-07 (水) 10:37:51
  • まず(1)ですが、確かに、このような線形回帰の場合、i.i.dで、独立に同じ誤差分布に従う必要があります。そのため、河童さん(すみません、勝手に省略しました)の言うとおり、平均値と分散の異なるものに当てはめているように見えるかもしれません。しかし、誤差は本当は平均0なのですから、きちんと書くと、dnorm(y-a3+b3*x, 0, 1)という風になります。これはdnorm(y, a3+b3*x, 1)と等しいです。y-a3+b3*xの部分が平均値から外れた偏差ですよね。それの確率密度の値を積で取れば尤度になると思います。xの範囲は適当に決めただけで、別に何でもよかったと言えばよかったです。それに真の関係は、a + b*x +eで、eの部分の誤差は1で固定しているので、まぁ誤差のパラメータは推定しないのであれば、dnorm(y, a3+b3*x, 1)という書き方で良いのかな、と。
    二つ目は、初期値依存を消すためです。今回は適当に初期値4からスタートしているので、その初期値の値からスタートして、ふらふらとサンプリングをすれば、最初のほうはかなり初期値に依存したサンプリングになるのです。そのため、最初のいくつかは解析から除くらしいです。MCMC用語ではburn-in等と呼ばれているはずです。-- Saito? 2010-07-07 (水) 11:01:39
  • 最初の質問への返答です。条件 U < L1/L2 の対数版は log(U) < log(L1)-log(L2) でしょう。それに一様乱数 U は毎回新しいものを使うんですよ。 それに複数のパラメータ (a,b) があれば個別に更新せずに (a_1,b_1) -> (a_2,b_2) のように一斉に変更するか、そのままかという選択になります。 -- 2010-07-07 (水) 12:38:35
  • > 一様乱数 U は毎回新しいものを使うんですよ
    最初に必要なだけ生成してておいて,u[i] のように,毎回違うものを使ってはいますね。 -- ? 2010-07-07 (水) 12:44:03
  • おっとそうでした。最終的に何をしたいのかよく分かりませんが、メトロポリス法の実習ということなら、なぜデータが最初にでてくるのか分かりません。メトロポリス法は(変数が二つ a,b として)ある密度(確率)関数 f(a,b)=Cg(a,b) に従う標本 (A,B) を正規化定数 C を知ることなく漸近的に生成する方法だからです。ベイズ法ではデータ X, 事前分布 p(a,b) を与えると (a,b) の事後分布が(正規化定数を除いて)定義できるから、メトロポリス法が意味をもってくるんですけどね。 -- 2010-07-07 (水) 13:02:00
  • >U < L1/L2 の対数版は log(U) < log(L1)-log(L2) でしょう。それは、確かにそうですが、尤度の計算をするときに対数化をするのかと思っていたものですから、U<log(L1)/Log(L2)の形になるのかと思ったのです。条件分岐のときにだけなら、わざわざ対数化する必要はないと思ったので・・・。
    >(a_1,b_1) -> (a_2,b_2) のように一斉に変更するか、そのままかという選択になります。しかし、私の持っている「マルコフ連鎖モンテカルロ法とその周辺」という本のp20には、(a_1,b_1) -> (a_2,b_1)という風にしても良いと記述してあります。ただ、交互に行ってもいい(a, b, a, bの順番で)という記述なので、私のようにそれぞれが独立に更新されていくような感じではないのかもしれませんね。
    >なぜデータが最初にでてくるのか分かりません。 いえ、単に線形回帰のパラメータ推定の際に、メトロポリスでやってみたらどうなるか、というだけです。実際はもっと次元が複雑ですので、まずはこのような簡単な例からやってみたかったのです。-- Saito? 2010-07-07 (水) 15:02:05
  • >なぜ尤度の計算をするときに対数化をするのか: 計算機による数値計算上のテクニックです.「桁落ち」などの語で検索されるとよいでしょう.また,誤差が正規でiidのときの尤度は,対数化しないときは prod(dnorm(x, mean, sd)) となるはずです.対数化するならば,sum(dnorm(x, mean, sd, log = TRUE)) です.さらに細かいことをいえば,ベイズ推定であるなら目標分布は事後分布であって「尤度」ではないですね.上の例では事前分布に無限の一様分布を与える暗黙の仮定なので,事後密度=尤度ということなのでしょうが. -- toto? 2010-07-07 (水) 16:32:34
  • >totoさん:対数化をするのは桁落ちを防ぐためなのですね。そういう単語は初めて知りました。ありがとうございます。対数化して、Log(L2)/Log(L1)の比を取るときに、-Log(L2)/-Log(L1)も同じ比になってしまいますが、これはどのように防げばよいのでしょうか? -- Saito? 2010-07-07 (水) 17:04:06
  • みなさんからの意見を加えて、このように改良致しました。が、まだ問題が残っています。
    set.seed(1)
    iter <- 20000 
    
    ###真の値###
    a <- 10
    b <- 2
    x <- seq(0.01, 1, length=500)
    y <- b*x + rnorm(500, a, 1) 
    ###正規化定数抜きの事後分布の計算###
    ###桁落ちするので、log(exp(1))を加えて、必ず1以上の数を返すように工夫(テクニックとしてアリ?)###
    ###マジメにa,bの事前分布を設定。真の値から平均を-1だけずらして、誤差は10として広く取った(注意!!!100だとダメ!)###
    cost_func2 <- function(a3, b3) { 
    sum(log(log(exp(1)) + dnorm(y, a3 + b3*x, 1)*dnorm(a3, a-1, 10)*dnorm(b3, b-1,  10)))
    }
    ###乱数と初期値の設定###
    u <- runif(iter, 0, 1)
    u2 <- runif(iter, 0, 1)
    a4 <- b4 <- numeric(iter+1)
    a4[1] <- b4[1] <- 5
    lag <- 4 
    
    ###メトロポリス法の実行###
    for(i in 1 : iter) { 
    a4_2 <- a4[i] + runif(1, -lag, lag)
    b4_2 <- b4[i] + runif(1, -lag, lag) 
    ###a, bは一斉に値を更新するように変更###
    if (u[i] < cost_func2(a3=a4_2, b3=b4_2)/
               cost_func2(a3=a4[i], b3=b4[i])) {
    a4[i+1] <- a4_2
    b4[i+1] <- b4_2
    } else {
    a4[i+1] <- a4[i]
    b4[i+1] <- b4[i]
     }
    } 
    
    ###a, bの事後分布###
    hist(a4[(iter/2):iter])
    hist(b4[(iter/2):iter])
     
    > mean(a4[(iter/2):iter])
    [1] 9.688851
    > mean(b4[(iter/2):iter])
    [1] 2.424549
    しかし、やはり対数の比のところはそのままの問題が残っていますし、事前分布の誤差を大きくとると、上手く推定されないようです。。。引き続き、何かお気づきの点がありましたら、ご教授頂けると幸いです。 -- Saito? 2010-07-07 (水) 17:39:32
  • Saitoさんが想定されているモデルだと,事後密度は,prod(dnorm(y, a3 + b3*x, 1)) * dnorm(a3, a-1, 10) * dnorm(b3, b-1, 10),対数事後密度なら,sum(dnorm(y, a3 + b3*x, 1, log = TRUE)) + dnorm(a3, a-1, 10, log = TRUE) + dnorm(b3, b-1, 10, log = TRUE) になるはずです.上のcost_func2における密度の定義では事前密度が余計に掛けられて(足されて)いるように思われます.ご確認ください.また,メトロポリスの採択率を計算する部分は,上で別の方が指摘されているとおり,事後密度での比較なら割り算,対数事後密度での比較なら引き算になります.上記のプログラムでは,対数化したあとに割り算をしているようなので,そこが根本的におかしいかと. -- toto? 2010-07-07 (水) 19:30:32
  • 対数とはいえ、前の対数尤度と今回の対数尤度の比を取るのですから、u<Log(L2)/Log(L1)になるのかと思っていました。しかし、実際は、Log(u)<Log(L2/L1)なのですね。たしかに、Log(u)<Log(L2)/Log(L1)では、もとの不等号の式には戻らない。ようやく理解致しました。そして理解して、修正した結果が以下です。誤差もついでに求めてみました。
    set.seed(1)
    iter <- 20000 
    
    ###真の値###
    a <- 10
    b <- 2
    c <- 1
    x <- seq(0.01, 1, length=500)
    y <- b*x + rnorm(500, a, c) 
    ###正規化定数抜きの事後分布の計算###
    ###マジメにa,b.cの事前分布を設定###
    cost_func2 <- function(a3, b3, c3) { 
    sum(log(dnorm(y, a3 + b3*x, c3)*
            dnorm(a3, a-1, 100)*dnorm(b3, b-1, 100)*dgamma(c3, 100, 100)))
    } 
    ###乱数と初期値の設定###
    u <- runif(iter, 0, 1)
    a4 <- b4 <- c4 <- numeric(iter+1)
    a4[1] <- b4[1] <- c4[1]<- 5
    lag <- 0.4 
    
    ###メトロポリス法の実行###
    for(i in 1 : iter) { 
    a4_2 <- a4[i] + runif(1, -lag, lag)
    b4_2 <- b4[i] + runif(1, -lag, lag)
    c4_2 <- c4[i] + runif(1, -lag, lag)  
    ###a, b, cは一斉に値を更新するように変更###
    if (log(u[i]) < cost_func2(a3=a4_2, b3=b4_2, c3=c4_2)-
               cost_func2(a3=a4[i], b3=b4[i], c3=c4[i])) {
    a4[i+1] <- a4_2
    b4[i+1] <- b4_2
    c4[i+1] <- c4_2
    } else {
    a4[i+1] <- a4[i]
    b4[i+1] <- b4[i]
    c4[i+1] <- c4[i]
     }
    } 
    
    ###a, b, cの事後分布###
    hist(a4[(iter/2):iter])
    hist(b4[(iter/2):iter])
    hist(c4[(iter/2):iter]) 
    
    > mean(a4[(iter/2):iter])
    [1] 10.07981
    > mean(b4[(iter/2):iter])
    [1] 1.872144
    > mean(c4[(iter/2):iter])
    [1] 0.9888237
    おそらく、これで問題なくコードできたと思います。皆様、本当にありがとうございました。そしてtoto様、分かりやすいコード例をありがとうございました。 -- Saito? 2010-07-07 (水) 21:31:30
  • 繰り返しになりますが,cost_func2のsumが掛かる場所がおかしいです.prod(対数化するならsum)を掛けるのは尤度の部分だけです. -- toto? 2010-07-08 (木) 05:55:59
  • Log(A*B)=Log(A)+Log(B)なので、一緒ではないのですか?sum(dnorm(y, a3 + b3*x, 1, log = TRUE)) + dnorm(a3, a-1, 10, log = TRUE) + dnorm(b3, b-1, 10, log = TRUE)とsum(log(dnorm(y, a3 + b3*x, c3)*dnorm(a3, a-1, 100)*dnorm(b3, b-1, 100))) -- Saito? 2010-07-08 (木) 06:35:56
  • 上記だと事前密度もデータの数だけ掛けられていることになりませんか? また,一気に掛け算したあと最後にlogを取るのでは,桁落ち防止としても意味がありません.上のコメントで書いたコード例をもう一度よく見てください.採択・棄却の部分については,要は対数密度の比で比較するのではなく元の密度の比で比較するということです.上のでもいいですが,普通は,u < exp(対数密度(new) - 対数密度(old)) のほうがわかりやすいでしょう.さらに,上記のコードでは分散パラメータもドローしているようですが,これだとランダムウォークで候補を発生させる際に負の値がありえてしまいます.よって,cについては事前に対数化しておく必要があります.またその際には,元のスケールで密度の比をとるときにヤコビアンを考慮する必要が出てくるでしょう.とにかく教科書通りやられることをお勧めします. -- toto? 2010-07-08 (木) 06:36:05
  • ご参照ください.
    > sum(dnorm(1:10, 0, 1, log = TRUE)) + dnorm(0, 0, 1, log = TRUE) + dnorm(0, 0, 1, log = TRUE)
    [1] -203.5273
    > sum(log(dnorm(1:10, 0, 1)*dnorm(0, 0, 1)*dnorm(0, 0, 1))) 
    [1] -220.0682
    • toto? 2010-07-08 (木) 06:42:56
  • あぁ!sumの場所が後ろまでいってしまっていますね!sum(対数尤度)×事前分布ではなく、sum(対数尤度×事前分布)に!すみません、まるっきり気づいていませんでした。それから、cのことですが、少し調子に乗りすぎました。totoさんの指摘で、ガンマ分布は対称ではないのですから、メトロポリスではなくて、メトロポリスヘイスティングス法で、サンプルされやすいところとされにくいところを補正してやらないといけない、と考えました。が、ヤコビは初めて聞きました。自分で勉強せずに聞くので、無礼かもしれませんが、宜しければ一つご教授ください。ヤコビアンを考慮することと、メトロポリスヘイスティングに拡張することは全く別のことですか?とりあえず、「マルコフ連鎖モンテカルロ法とその周辺」にはヤコビが出てこないので、少々戸惑っております。。。と思ったら、一応p183に偏微分の形が出てきます。ううーん、これは残念ですが、すぐにはわからないようです。-- Saito? 2010-07-08 (木) 06:56:12
  • 全く別です.メトロポリスは候補発生の仕組みがランダムウォークなので必ず対称になります p(x, x') = p(x', x).事前分布の設定がガンマだとかいうこととは全く別問題で,MHとも関係ありません.MHは候補発生をランダムウォークではなく任意の独立な分布からでも可能とするときの一般化です.言いたかったのは,分散パラメータもlogをとってからなら他のパラメータと同様にランダムウォークで動かすことができるが,確率密度は元のスケールで比較する必要があるため厳密にはヤコビアンを調整してやる必要があろうということです.その他,上では標準偏差(c)パラメータにガンマの事前分布が設定されているようですが,通常の自然共役な形では,分散(c^2)に"逆"ガンマ分布ないし,分散の逆数(精度)にガンマ分布です.など諸々ツッコミポイントはありますが,お持ちの「マルコフ連鎖モンテカルロ法とその周辺」にすべて書かれているので,まずは熟読されることをお勧めします. -- toto? 2010-07-08 (木) 07:22:57
  • totoさん、ありがとうございました。自分の勉強不足を痛感した次第であります。分散パラメータの推定については、色々調べてから再チャレンジしたいと思います。重ね重ね、本当にありがとうございました。精進致します。と、まとめをしておかないと。以下が分散パラメータ抜きの最終的に完成したコードです。
    set.seed(1)
    iter <- 20000 
    ###真の値###
    a <- 10
    b <- 2
    x <- seq(0.01, 1, length=500)
    y <- b*x + rnorm(500, a, 1) 
    ###正規化定数抜きの事後分布の計算###
    ###マジメにa,b.cの事前分布を設定###
    cost_func2 <- function(a3, b3) { 
    sum(log(dnorm(y, a3 + b3*x, 1))) +
            log(dnorm(a3, a-1, 100)) + log(dnorm(b3, b-1, 100))
    } 
    ###乱数と初期値の設定###
    u <- runif(iter, 0, 1)
    a4 <- b4 <- numeric(iter+1)
    a4[1] <- b4[1] <-5
    lag <- 0.4  
    
    ###メトロポリス法の実行###
    for(i in 1 : iter) { 
    a4_2 <- a4[i] + runif(1, -lag, lag)
    b4_2 <- b4[i] + runif(1, -lag, lag)
    ###a, bは一斉に値を更新するように変更###
    if (u[i] < exp(cost_func2(a3=a4_2, b3=b4_2)-
              cost_func2(a3=a4[i], b3=b4[i]))) {
    a4[i+1] <- a4_2
    b4[i+1] <- b4_2
    } else {
    a4[i+1] <- a4[i]
    b4[i+1] <- b4[i]
     }
    }  
    
    ###a, b, cの事後分布###
    hist(a4[(iter/2):iter])
    hist(b4[(iter/2):iter])
    
    > mean(a4[(iter/2):iter])
    [1] 10.08433
    > mean(b4[(iter/2):iter])
    [1] 1.884697
    分散パラメータが私の実力不足で上手くコードに含めることができなかったのは残念ですが、とりあえず、メトロポリスが何をやっているかは理解できたので初期の目標は達成できました。皆様、そしてtoto様、本当にありがとうございました。-- Saito? 2010-07-08 (木) 07:30:03

地理的加重回帰分析のgwrの予測値

酔鯨? (2010-07-03 (土) 10:33:29)

spgwrの地理的加重回帰分析のgwrの予測値は、XXX$SDFのテーブル出力を見れば、predの項目(厳密には、ヘッダがずれているので、右に1項目ずらす必要がある。)を見ればよいことは判りました。しかし、この関数を使い予測するためには、被説明変数の値が必要です。つまり、何らかの方法で予測しなければなりません。通常の重回帰で予測をするためには、回帰係数と説明変数の値だけで良いです。地理的重回帰分析では、通常の重回帰の予測と同じように、回帰係数と説明変数だけで予測値を得る関数はないのでしょうか?

  • prediction 引数の説明は読みました?
    predictions: default FALSE; if TRUE and no fit points given, return GW fitted values at data points, if fit points given and are a Spatial*DataFrame? object containing the RHS variables in the formula, return GW predictions at the fit points.
    それでは片付かない? -- 河童の屁は,河童にあらず,屁である。? 2010-07-03 (土) 12:30:39
  • 回答ありがとうございます。コロンバス市の犯罪データのCRIMEに空白の欄を設け計算してみました。gwrの前に必要なバンド幅計算のgwr.selで警告が出ました。警告を無視して、gwrでpredictions=TRUEを実行したところ 次のエラーメッセージが表示されました。new data matrix rows mismatch。 -- 酔鯨? 2010-07-03 (土) 14:27:08
  • 言葉足らずだったので説明を追加します。CRIMEは被説明変数で、この値が無いところがうまく予測されるかどうかを試したのですが、エラーとなりました。何らかの方法で被説明変数に予測値を入れれば、gwrがはしり、predで予測値を得られるのですが、もっとよい方法があればご教授願います。当方の環境は、windows XPでRのバージョンは2.11.1です。 -- 酔鯨? 2010-07-03 (土) 15:25:16
  • 「コロンバス市の犯罪データのCRIMEに空白の欄を設け計算してみました。gwrの前に必要なバンド幅計算のgwr.selで警告が出ました。警告を無視して、gwrでpredictions=TRUEを実行したところ」とか色々書いてありますが,具体的にどうしたかがわからないのですよ。
    あなたと一緒に悩んでみようという人にとっては,あなたのやり方に問題があるのかどうかわからない。
    こうすればよいんですよという回答を持っている人も,あなたがやったことを修正して示す方がやりやすいのでは。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-03 (土) 18:52:02
  • 申し訳ありません。predictionsの意味はわかりませんが上のように被説明変数に空白を設けるのではだめだということがわかりました。 -- 酔鯨? 2010-07-05 (月) 21:13:55

Rによるアクセスログ解析

tadashi? (2010-07-02 (金) 15:05:54)

"Rでアクセスログ" と検索してもでてきません。Rでアクセスログ(にかぎらず、ログデータ)の解析をすることはそれほどないのでしょうか?
もし、awstats 等でやっているようなことをRで代替している事例がありましたら、お教えください。

  • 検索語がまずいのね。"R * アクセスログ解析" と,指定してみましょう。アクセスログ解析をやってみよう なんてのも,あったりしますよ。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-02 (金) 15:23:32
  • なるほど参考になります。ABC分析もさがしてみます。 -- tadashi? 2010-07-03 (土) 09:16:53

統計解析関数Tipsのrepeated mesure aonovaのコード

ちゃーぴー? (2010-07-02 (金) 10:04:01)

RjpWiki内の統計解析Tipsにある反復測定分散分析 (Repeated measured ANOVA)(http://www.okada.jp.org/RWiki/index.php?R%A4%CE%C5%FD%B7%D7%B2%F2%C0%CF%B4%D8%BF%F4Tips#content_1_7)を使おうと思い,コードをコピペしようとしました.しかし,print.rep.anovaのコードが,ペーストしている途中でエラーとなります.当方の環境WindowsXP×2,Windows7-64bitでRのバージョンは2.11.0です.なお,64bitマシンでは32bit版,64bit版R両方を使用しています.3台のマシン全てで同様の結果となります.下記のような感じです.どなたか対策をご存知の方いらっしゃいますでしょうか?

+         rownames(ttx)[rownames(ttx)=="Residuals"]<-sub("Error: (.*\)","Error(\\1)",names(tx)[i])
 エラー:  "Error: (.*\)"で始まる文字列の中で '\)' は文字列で認識されないエスケープです


  • どうもすさまじいコピーペーストで,汚い上に余分な部分ばかりあるのでバッサリ切り詰めておきます。必要なのは残した部分のみ。投稿法も読んでおかれると今後のためと思います。
    エラーメッセージを見れば対処法は分かると思います。
    rownames(ttx)[rownames(ttx)=="Residuals"]<-sub("Error: (.*)","Error(\\1)",names(tx)[i])
    とすればよいのでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-02 (金) 10:21:28
  • ご教授ありがとうございました.m(_ _)m 投稿方法を再度確認いたします.申し訳ありません.  -- ちゃーぴー? 2010-07-02 (金) 10:53:24
  • おかげさまで,エラーは回避できたのですが,ひとつわからないことがでてきました.この関数では同時にRyan法で多重比較ができるようですのであわせて使ってみました.使ってみたところ,Bonferroni法で有意差(P<0.01)がみられた組み合わせで有意差がみられない,ということがありました.何度やってみても同じです.Ryan法はBonferroni法以上に保守的になるということがあるのでしょうか? -- ちゃーぴー? 2010-07-02 (金) 20:24:34
  • そういうことがあり得るのかどうかは,たぶん数理的に説明できるものではないかも知れませんねえ。シミュレーションデータを作って,色々な場合について両者で検定してみて,P値がどうなるかを調べてみればよいのかも知れませんね。もっとも,使う関数にバグがないのが前提ですけど。バグがないならば,そういうことが実際にあったというだけで,十分な根拠になるのじゃないでしょうか?
    問題は異なりますが,例えば,同じデータをノンパラメトリックの U 検定とパラメトリックの t 検定で検定したとき,どんなデータでも一方の P 値が他方の P 値よりも小さい(大きい)というような,一致した傾向を示すものではないということも,参考になりますかねえ?
    誰かに聞くというのは最も簡単な方法ですけど,自分で正しい結論を見いだすにはどうすればよいかを知ることも大切なことですね。難しいですけどね。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-02 (金) 20:40:38
  • ご指摘・ご助言ありがとうございます.Ryan法のP値の調整方法は式などをみて確認はしていたのですが,最も厳しい場合でもBonferroniと同値であると思っていました.もう一度一からRyan法を調べなおします.またいくつかの変数でT検定をかけましたが,U検定はやっていませんでしたのでそれもやってみようとおもいます.バグの可能性もあるのかもしれませんが,もう少し格闘してみようかと思います. -- ちゃーぴー? 2010-07-02 (金) 21:54:34

Shaffer法の多重比較

tasosi? (2010-07-01 (木) 18:43:27)

Shaffer法の多重比較に関するパッケージを探しています.
色々調べてみたのですが,ANOVA君を活用するという手段はあったのですが,パッケージでは見つかりませんでした.
多重比較で,paired-t-testのP値を補正するのに用いたいと思っていますが,パッケージとしてはないのでしょうか?

  • なんかね,別のスレッドが紛れ込んじゃって変なので,削除してから,回答しますね~ -- 河童の屁は,河童にあらず,屁である。? 2010-07-01 (木) 20:58:51
  • まずは,コメントアウトしてと
    それなりに用意されているパッケージもあるかも知れないけど,取りあえずは,paired.t.test のオンラインヘルプをご覧いただければと思いますね。
    この関数の paired は,対応のあるデータという意味ではなく,多重比較のということですから,念のため。でも,対応のあるデータの検定も含んでいるのですけどね。
    あ,でも,残念。対応のある場合の Sheffe には対応してないみたいだ。 -- 河童の屁は,河童にあらず,屁である。? 2010-07-01 (木) 21:03:01
  • SheffeではなくShaffer法なのですが,これは対応ありの場合も使えたような気がします.検出力の高い多重比較を探しています.pairwise.t.testでは検出力の高い方法としてBH法なんかがあるかと思います.ただFalse Discovery Rateという考え方がどこまで受け入れられているのかが未知数で二の足を踏んでいます.Bonferroniのように一般的に受け入れられているものとして使って大丈夫でしょうか? -- tasoci? 2010-07-01 (木) 23:07:22
  • ああ。Shaffer でしたね。
    > False Discovery Rateという考え方がどこまで受け入れられているのかが未知数で
    知らない人が「ば〜〜か」ということでよろしいのではないでしょうか。 -- 河童の屁は,もうよぼよぼで,視力も衰えておりまする。? 2010-07-01 (木) 23:21:13
  • ありがとうございます.多重比較は色々な方法があって,諸説ありますよね.統計門外漢の私ではどうも自信がなくて・・・でも結局自分で判断するしかないですよね.ふ〜 -- tasosi? 2010-07-01 (木) 23:40:42

行列におけるNA値を前後の行の値から補完したい

R初心者? (2010-07-01 (木) 14:27:54)

はじめまして。
ネットワークの研究をしている大学院生です。データのグラフ化をしたくて一週間ほど前からRの勉強を始めました。
googleとこのwikiでググってみたのですが、分からなかったので質問させていただきました。
環境はMacOSX 10.5.8
Rのバージョンは2.9.0です。
−−−−−−
やろうとしていることの概要
2つのプログラムからの出力をまとめた欠損値を持つCSVを、欠損値を補完したCSVにして、それをlatticeで線グラフ化する。
補完せずとも、線グラフが切れない手法があればそれでもOKです。
−−−−−−
ネットワークのスループットとRTTをTcpdumpを解析して出力するプログラムを書きましたが、都合上RTTとスループットが別に出力されて次のような形式になっています。

       time, seqnum(シーケンス番号), rtt, throughput
       0.0, 3136068389, 0.0469200000006822,  
       0.0808820000020205, 3136070885, 0.0611399999979767,  
       0.0999999999985448,  ,  , 24960.0~
       0.142041999999492, 3136074629, 0.0901450000019395,  
       0.142041999999492, 3136072133, 0.0699139999996987,  
       0.19999999999709,  ,  , 37440.0
       0.21197000000393, 3136077125, 0.0549669999963953,  
       0.232200999998895, 3136079621, 0.0598790000003646,  
       0.266950000004726, 3136084613, 0.0701439999975264,  
       .....

これをRにCSVとして食わせると、次のようになります。

         time     seqnum      rtt throughput
     1     0.000000 3136068389 0.046920         NA
     2     0.080882 3136070885 0.061140         NA
     3     0.100000         NA       NA      24960
     4     0.142042 3136074629 0.090145         NA
     5     0.142042 3136072133 0.069914         NA
     6     0.200000         NA       NA      37440
     7     0.211970 3136077125 0.054967         NA
     8     0.232201 3136079621 0.059879         NA

このNA値を前後の行の値の中間値となるように補完したいです。
なにかそのような関数はありますでしょうか。
補完のやりかたは
「1,2,NA,4,5」-> [1,2,(2+4)/2=3, 4, 5]
のようなもので、連続した値が抜けた際は
「1,2 NA, NA, NA, 6」-> [1,2,3,4,5,6]
となってもらえるのが理想です。

最初は作ろうかと思ったのですが、既にありそうな気がしたので質問させていただきました。
よろしくお願いします。
−−−−−−
自己解決しました。 Vectorを補完する関数を書いたので、行列を「列で分解、適用、合体」することで補完できると思います。

complementNaVector <- function(vector) {
	posVector <- 1:length(vector)
	naPosVector <- posVector[is.na(vector)]
	notNaPosVector <- posVector[!is.na(vector)]
	
	for (index in naPosVector) {
		lowerVector <- notNaPosVector[notNaPosVector < index]
		greaterVector <- notNaPosVector[notNaPosVector > index]
		
		
		if(length(lowerVector) != 0 && length(greaterVector) != 0) {
			low <- lowerVector[length(lowerVector)]
			high <- greaterVector[1]
			distance <- vector[high] - vector[low]
			stepl2h <- high - low
			stepl2i <- index - low
			vector[index] <- vector[low] + (distance * stepl2i / stepl2h)
		} else {
			vector[index] <- NA
		}
	}
	return(vector)
}

行列の補完

complementNaMat <- function(matrix) {
	iterator <- 2:ncol(matrix)
	mat <- complementNaVector(matrix[, 1])
	for(index in iterator){
		vector <- complementNaVector(matrix[, index])
		mat <- cbind(mat, vector)
	}
	return(mat)
}
## 以下でよさそう
complementNaMat <- function(matrix) {
	for (index in 1:ncol(matrix)) {
		matrix[, index] <- complementNaVector(matrix[, index])
	}
	return(matrix)
}
  • approx というのが stats にある。 -- 河童の屁は,所詮屁である。? 2010-07-01 (木) 15:23:12
  • 4番目と5番目の time の値が同じなのでこれをちょっとずらす。あなたの関数と ap prox 関数の違いは以下の図のようになる。(あなたの関数と同じになるようにもできる) -- 河童の屁は,河童にあらず,屁である。? 2010-07-01 (木) 16:30:06
    d$time[5] <- d$time[5]+0.000001
    plot(d$time, d$rtt)
    lines(d$time, d$rtt, type="l")
    points(d$time, complementNA(d$rtt), col=2) # あなたの関数(赤)
    lines(d$time, complementNA(d$rtt), col=2, lty=3)
    points(d$time, approx(d$time, d$rtt, xout=d$time)$y, col=4) # approx 関数(青)
    lines(d$time, approx(d$time, d$rtt, xout=d$time)$y, col=4, lty=4)
    approx.png
  • 「河童の屁は,所詮屁である。」さん。アドバイスありがとうございます。確かに行列の計算はそっちのほうがスマートですね。あと、補完の際には気付かなかったのですが、時間をx軸でとるならば、yの値は行指向ではなく時間指向で取ったほうが自然ですね。大いに参考にさせてもらいます。ありがとうございました。 -- R初心者? 2010-07-01 (木) 17:53:21

データの重なり

森の熊五郎? (2010-06-27 (日) 01:02:10)

コールセンタに日々大勢の方から電話がかかってきます。1日に何回も、また続けて何日も。そのようなコールセンタにおいて、日々かかってくる電話が何件あって、その電話が何人によってかかっているのか(重複をなくして)。またその結果を、1日単位、1週間単位、1ヶ月単位、一年単位で調べようとしております。本来は電話番号を使って、調べるのですが、個人情報ということもあり、ここでは、仮に下記のような人名が書かれたデータベースがあって、それをもとに調べることとします。
C201004,C201005,C201006
Sato,Sato,Nishihara
Tanaka,Yamada,Sato
Yamada,Kojima,Nishijima
Inoue,Kitano,Inoue
Sato,Shinagawa,Yokosuka
Kitamura,Handa,
Yamamoto,Kitamura,
Ohta,Handa,
Inoue,Nishi,
Kitamura,Yokota,
Kobayashi,Sato,

csvのファイルに上記のようにデータベースがあります。
行方向は日にち、列方向はその日に利用されたお客様のお名前が保存されています。

call=read.csv("call2010.csv",header=TRUE)
call201004=call$C201004
call201004=call201004[!is.na(call201004)]
call201005=call$C201005
call201005=call201005[!is.na(call201005)]
call201006=call$C201006
call201006=call201006[!is.na(call201006)]
length(call201004)
length(unique(call201004))
length(call201005)
length(unique(call201005))
length(call201006)
length(unique(call201006))
Tcall=c(call201004,call201005)
length(Tcall)
length(unique(Tcall))
Tcall=c(Tcall,call201006)
length(Tcall)
length(unique(Tcall))~

というプログラムを作りました。
�今回は3日分しかないので、簡単なのですが365日分だとさすがにベタ書きですと大変なので、BasicでいうところのFor next分みたいな文を作り簡単に処理したいのですが可能なのでしょうか?
�文字列のベクトルの結合はc(X,Y)ではうまくいきません。どうすればよいのでしょうか?
�欲を言えばピボットテーブルのように、お客様毎にいつ何件利用されたのかをしりたい。
コールセンタの利用件数は月に何万件もあって膨大なので、excelでは処理できず、Rに挑戦しているのですが、まだまだ素人なので。お手数をおかけしますがご教示下さい。

  • SQL向きですね。 -- 2010-06-27 (日) 10:46:01
  • 文字列ベクトルの結合ではなく,データフレームの結合 cbind(X,Y) でしょうか。 次のコードが参考になりますか?-- 2010-06-27 (日) 15:34:03
    call <- read.csv("call2010.csv",header=TRUE,as.is=TRUE)
    x <- colnames(call)
    n <- nrow(call) 
    N <- 3
    call.1 <- call.2 <- rep(NA,N*n)
    for (i in seq(1,N)) {
      SEQ <- seq(1+(i-1)*n, i*n)
      call.1[SEQ] <- call[[i]]
      call.2[SEQ] <- rep(x[i],n) }
    call.3 <- data.frame(call.2, call.1)
    unstack(call.3)
    [[1]]
    [1] "C201006" "C201006" "C201006" "C201006" "C201006" "C201006"  # 欠損値に対応
    $Handa
    [1] "C201005" "C201005"
    $Inoue
    [1] "C201004" "C201004" "C201006"
    $Kitamura
    [1] "C201004" "C201004" "C201005"
    $Kitano
    [1] "C201005"
    $Kobayashi
    [1] "C201004"
    $Kojima
    [1] "C201005"
    $Nishi
    [1] "C201005"
    $Nishihara
    [1] "C201006"
    $Nishijima
    [1] "C201006"
    $Ohta
    [1] "C201004"
    $Sato
    [1] "C201004" "C201004" "C201005" "C201005" "C201006"
    $Shinagawa
    [1] "C201005"
    $Tanaka
    [1] "C201004"
    $Yamada
    [1] "C201004" "C201005"
    $Yamamoto
    [1] "C201004"
    $Yokosuka
    [1] "C201006"
    $Yokota
    [1] "C201005"
    
    call.3                # このような一時的データフレームを作っています
        call.2    call.1
    1  C201004      Sato
    2  C201004    Tanaka
    3  C201004    Yamada
    4  C201004     Inoue
    5  C201004      Sato
    6  C201004  Kitamura
    7  C201004  Yamamoto
    8  C201004      Ohta
    9  C201004     Inoue
    10 C201004  Kitamura
    11 C201004 Kobayashi
    12 C201005      Sato
    13 C201005    Yamada
    14 C201005    Kojima
    15 C201005    Kitano
    16 C201005 Shinagawa
    17 C201005     Handa
    18 C201005  Kitamura
    19 C201005     Handa
    20 C201005     Nishi
    21 C201005    Yokota
    22 C201005      Sato
    23 C201006 Nishihara
    24 C201006      Sato
    25 C201006 Nishijima
    26 C201006     Inoue
    27 C201006  Yokosuka
    28 C201006          
    29 C201006          
    30 C201006          
    31 C201006          
    32 C201006          
    33 C201006
    
  • ご教授ありがとうございます。教えて頂いたプログラムを読んで、勉強してみます。1つだけ教えてください。call <- read.csv("call2010.csv",header=TRUE,as.is=TRUE)の文において、「as.is=TRUE」という文は有効なのでしょうか?R-Tipsなど見ますと、read.csvでは「header」 「sep」 「quote」「dec」が引数となっており,「as.is=TRUE」の意味がわかりません。自分で解決するためのマニュアルは何がおすすめでしょうか?read.csvの場合、データに欠損がある場合、読み飛ばす方法はありますか?read.csvの行とは別に、call201004=call201004[!is.na(call201004)]を追加するのがひとつの解と思いますが、1行で済ませる良い方法があればご教示ください。 -- 森の熊五郎? 2010-06-29 (火) 00:00:00
  • help(read.csv)でオンラインマニュアルを調べて見てください。試しに as.is=TRUE を除いて実行すれば結果が違うことが分かるでしょう。これはデータフレームにおける文字列の因子化(文字列の一時的数値コード化)という少々面倒くさい問題に原因があり、as.is=TRUE は文字列をそのまま(as is)で扱うように指示します。例えば「Rプログラミングマニュアル(間瀬茂、数理工学社)」のデータフレーム、因子の章が参考になるでしょうか。データの欠損値(正確には空文字列 "")を途中で除くと call.3 を作る際長さの異なるベクトルを連結することになり、面倒になります。多すぎてメモリー不足になるのでなければ気にしないのが一番簡単と思うのですが。次の様にすれば空文字列を除けます。 -- 2010-06-29 (火) 07:58:48
    call <- read.csv("call2010.csv",header=TRUE,as.is=TRUE)
    x <- colnames(call)
    n <- nrow(call) 
    N <- 3
    call.1 <- call.2 <- NULL
    for (i in seq(1,N)) {
      SEQ <- (call[[i]] != "")            # 空文字列でないかどうかを判定する論理ベクトル
      call.1 <- c(call.1, call[[i]][SEQ])
      call.2 <- c(call.2, rep(x[i],sum(SEQ)) }
    call.3 <- data.frame(call.2, call.1)
    unstack(call.3)
    $Handa
    [1] "C201005" "C201005"
    $Inoue
    [1] "C201004" "C201004" "C201006"
    (以下略)
  • まず,データ構造を改める方が良いと思います。日ごとのクレーマーのリストを1ファイルごとにすると,処理も簡単になるでしょう。必要なファイルを選択して読み込むことも容易になるでしょうし。昔のコンピュータ本に,「データ+アルゴリズム=プログラム」というのがあったような。
    データの処理はアルゴリズムだけではなく,データ構造も重要だと言うことでしょう。
    示されたようなデータ構造だと,年月を経れば巨大なファイルになりますし,列方向の要素数が不定というのは,読み込んだときの無駄なメモリー消費も馬鹿にならないでしょう。
    問題を整理すると,毎日毎日のクレーマーの電話場号を一つのファイルに記録している。その記録を元に,期間(日にち)を指定して,クレーマーごとのクレーム電話の頻度を集計したい言うことでは?違う?
    以下に,テストデータの生成を含めて集計例を示しますが,このようなことではないんですか?ファイル名の管理だけで,table 関数を使うだけで何の問題もないように思いますけど??(質問するときには,適切なデータを生成するプログラムも付け加えておくと,みんなが追試できると思いますよ)
    > # テストデータ作成
    > # 作成されるデータファイル Jun0601 〜 Jun0610 の実際の中身をご覧じろ
    > set.seed(88541)
    > for (i in 1:10) {
    + 	fn <- sprintf("Jun06%02d", i)
    + 	n <- sample(100:500, 1)
    + 	x <- sprintf("%03d-%04d", sample(999, n, replace=TRUE), sample(9999, n, replace=TRUE))
    + 	write(x, fn)
    + }
    > # 以上のデータを使って,色々な集計をしてみる(最終的には,集計範囲を指定する引数を持つ関数にすればよい)
    > # 入力制限せず(全部),全部の集計
    > x <- NULL 
    > for (i in 1:10) {
    + 	fn <- sprintf("Jun06%02d", i)
    + 	x <- c(x, scan(fn, what=""))
    + }
    Read 145 items
    Read 109 items
    Read 169 items
    Read 446 items
    Read 412 items
    Read 283 items
    Read 140 items
    Read 140 items
    Read 199 items
    Read 174 items
    > length(x) # 読み込んだ全部のクレーム電話番号の個数
    [1] 2217
    > table(x) # 集計結果 電話番号のように見えるのは架空のものですからね
    x
    001-0617 001-5112 002-3684 003-1068 003-3291 004-9049 005-4181 005-4319 
           1        1        1        1        1        1        1        1 
      中略
    996-7889 996-9818 997-0618 997-8295 998-9462 999-0492 999-2608 999-3352 
           1        1        1        1        1        1        1        1 
    999-3655 
           1 
    > sum(x=="999-3352") # 999-3352 は 1 件
    [1] 1
    > sum(x=="123-4567") # 123-4567 は 0 件
    [1] 0
    > sum(table(x) >= 2) # このデータにおいて,2 件以上のクレーマーはいない
    [1] 0
    > # などなどなどなどなどなどなどなどなどなどなどなどなどなど
    > ######################################
    > # 任意の入力 Jun0601, Jun0602 のみ
    > x <- NULL
    > for (i in 1:2) {
    + 	fn <- sprintf("Jun06%02d", i)
    + 	x <- c(x, scan(fn, what=""))
    + }
    Read 145 items
    Read 109 items
    > length(x)
    [1] 254
    > table(x) # 集計結果 電話番号のように見えるのは架空のものですからね
    x
    003-1068 006-7349 014-9687 021-9091 023-4157 024-4196 029-7869 035-8444 
           1        1        1        1        1        1        1        1 
       中略
    979-1463 979-8195 984-7011 990-2678 992-4048 997-0618 
           1        1        1        1        1        1 
    意外と,簡単ではないですか?そのうえなにか必要ですか? -- 河童の屁は,河童にあらず,屁である。? 2010-06-29 (火) 21:47:47
  • Rでやるならという意味で回答しましたが、やはりこれは第一回答者のおっしゃるようにデータベースソフトを使うべきケースだと思います。 -- 第二回答者? 2010-06-29 (火) 23:52:12
  • いろいろ、ご教授頂きありがとうございます。「クレーマーごとのクレーム電話の頻度を集計したい言うことでは?違う?」という質問にお答えいたします。「NO」です。確かにクレーマーは毎日電話をかけてきますし、とても困っていますが、調べているのは日々の利用者の推移です。利用者が急激に多くなったときは、市場にて共通の問題が発生していることを意味しており、その推移を注視しております。またフォーキャストを決めるさいにも、需要がどのようになっているのかを調べることが必要になってきます。かけてきた人数、応対した件数をしることで、その応対の品質を見ることが出来ます。出来るだけ、1回の応対で完結出来るように改善を進めるためにも、日々のデータを調べその推移に変化がないかを見ております。 -- 森の熊五郎? 2010-06-30 (水) 01:00:39
  • ↑↑同意します。用途にあった言語がある中で敢えてRを駆使しなくても良いのでは?森の熊五郎さんが素人ならなおさらです(SQLだって素人なんだから)。「データはSQLに入れてRで解析」が実践的で現実的です。 -- 2010-06-30 (水) 07:40:22
  • call.3 までもってこれれば reshapeパッケージのcast()でも「欲を言えばピボットテーブル」ができますね。(個人的にはわざわざSQLは使わなくてもいいと思いますけど、使うならRでもSQLが使えるようになるsqldfもありますよ) -- 2010-06-30 (水) 09:19:30
  • まあ,はっきり強く「NO」と言われたもんだ。クレーマーという単語を使ったのが悪いいかとは思うが,1日ごとの記録を1つのファイルにべた書きしておいて,それを scan して,必要な処理をすればよいでしょうという案も拒絶されるわけですね。少なくとも列に年月日,なんかにすると一日当たりの件数が違うんだから,データ数の下の方は NA で埋めないといけないし。ファイルのメンテナンスがたいへんでしょうねと思っただけです。 -- 河童の屁は,河童にあらず,屁である。? 2010-06-30 (水) 10:13:39
  • 言葉使いが悪くてすみません。ご指摘の通り、コールセンタではコール1件毎に記録をするデータベースを使っております。今回はそのデータベースからコールの利用状況を確認するために、個々のデータを期間を検索パラメータ(例えば今月・今週)にて抜き出し、CSV形式のファイルに落とし、そのファイルを使って分析をすることを検討しております。コールセンタは外部に委託業務をしており、そのインフラを自由に使えない環境にあるゆえ、期間のログファイルを入手し分析をしている次第です。説明が不足し、言葉遣いが悪いこと、お詫び申し上げます。 -- 森の熊五郎? 2010-06-30 (水) 14:43:07

neuralパッケージのインストールについて

hiro? (2010-06-24 (木) 02:54:33)

はじめまして、Ubuntu10.04(64bit)にて、R:2.10.1を使っている者です。
現在、豊田秀樹氏の「データマイニング入門」という書籍を読みながら、Rを学んでおります。

この書籍の第2章の「鉛筆の数え方」のところで、『neuralライブラリ』を用いたサンプルコードが載っているのですが、『neuralライブラリ』をインストールしようにも、install.packages("neural")としても、パッケージを見つけることが出来ないため、インストール出来ずに困っております。

この書籍はそもそもOS:windowsXP、R:2.7.0を前提にして書かれたものなので、neuralライブラリはLinuxには提供されていないライブラリなのでしょうか?

あるいは、neuralライブラリはLinuxにも提供されていたが、古くなったため、今では使われなくなってしまったのでしょうか?

この書籍でRを学びたいので、出来ればneuralライブラリを使いたいのですが、良い解決策をご存知の方がいらっしゃったら、対処方法をご教授下さい。

  • すみません、自己解決しました。 -- hiro? 2010-06-24 (木) 03:10:45
  • http://cran.stat.nus.edu.sg/src/contrib/Archive/neural/にライブラリがありました。ここにアクセスし、neural_1.4.tar.gzをDL&解凍し、出てきたneuron/Rディレクトリをinstall.packages("出てきたRディレクトリ")で読み込んでやれば、インストール出来ました。お騒がせしてすみませんでした。 -- hiro? 2010-06-24 (木) 03:14:01
  • そんな面倒なことをしなくても
    sudo R CMD INSTALL neural_1.4.tar.gz
    でOK -- 2010-06-24 (木) 11:51:00
  • Ver.2.12.2ですがどうしてもインストール出来ません。詳しく御願い出来ませんか? -- M_Saito? 2011-06-10 (金) 11:29:13

R + VIM (Windows)

尼河童? (2010-06-23 (水) 00:12:42)

みなさまこんにちは。
ウィンドウズマシーンで R 2.10.1 を使っています。はい、バージョンアップします。

エディタは昔から vim を使っているのですが、簡単に R コードを vim から R に飛ばす方法を模索しています。ウィンドウズというのがネックになりそうです。

素敵な方法をご存知の方はご教授ください。

png出力の背景透過について

としろう? (2010-06-20 (日) 07:21:25)

plot関数などで作成した図を、png形式で出力する際に、枠やプロットした点以外の背景が透かしのままなのですが、背景を透かしの代わりに白で指定することはできるのでしょうか?
例えば下のプログラムでは、背景が透かしたままで出力されてしまいます。
使用環境はwindows,R-2.11.1です。

plot(1:20)
pp<-recordPlot()
png("test.png",bg="white")
replayPlot(pp)
dev.off()
  • recordPlot したものが透過なのだから,replayPlot したものも透過でしょう。
    png("test.png",bg="white")
    plot(1:20)
    dev.off()
    でできるのは,ちゃんとバックグラウンドが white です。 -- 河童の屁は,河童にあらず,屁である。? 2010-06-20 (日) 09:22:19
  • ご返答ありがとうございます。教えていただいた方法で、背景を白に設定することができました。
    画面に出力を表示させた後にrecordPlot(),replayPlot()を使う場合についても、描画関数を使う時点で背景が白になるように、いろいろ試してみたいと思います。ありがとうございました。 -- としろう? 2010-06-22 (火) 03:40:25

Rで(ハフマン)符号の複合化

R初心者? (2010-06-19 (土) 21:29:59)

各アルファベットが0/1のコードに(ハフマン)符号化されているデータ「0,1,1,0,0,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,0,1,1,0,1,1,1,1,0,0,0,1」があるとします.例としまして,A〜Iのデータが以下の0/1のコードに符号化されている状況を考えます.

文字符号
A01
B111
C110
D101
E001
F000
G1001
H10001
I10000


上記の表でデータを複合化すると「0,1,1,0,0,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,0,1,1,0,1,1,1,1,0,0,0,1」は「AHCAGICBH」に複合化されます.

さて,データを複合化するための方法の1つが,符号を2分木化し,C言語等のポインタで2分探索法で複合化する方法です.9個の葉を持つ2分木は,9 個(種類)の異なる文字を含む文字列を符号化するために用いることができます.このとき,2分木の各葉を各文字に対応させます.各文字の符号は2分木の根から対応する葉へのパスによって決定します.このとき、左へ向かった場合 0,右へ向かった場合 1 とします.

 center

しかし,Rではポインタがなさそうなので,仕方なく以下のような方法で複合化してみました. データをx,上記のリスト(符号,文字)をy,zに格納するプログラムを以下で生成します.

> x <- c(0,1,1,0,0,0,1,1,1,0,0,1,1,0,0,1,     # データ
+        1,0,0,0,0,1,1,0,1,1,1,1,0,0,0,1)     # 結果:AHCAGICBH
> y <- c("01","111","110","101","001",
+        "000","1001","10001","10000")        # ハフマン符号
> z <- c("A","B","C","D","E","F","G","H","I") # 対応する文字

次に,データを1文字ずつ読み込み,リストyの要素のいずれに合致しているかをチェックし,合致していたらその符号に対応する文字をresultに格納する,というものです.

> result <- c()                       # 複合結果
> tmp  <- ""                          # バッファ
> for (i in 1:length(x)) {
+   tmp <- paste(tmp, x[i], sep="")   # データから1文字読み込み
+   j   <- 1                          # 複合化:yのどの値に該当するかチェック
+   for (j in 1:length(y)) {          # 
+     if (y[j] == tmp) {              # yのj番目の値に該当した場合
+       result <- c(result, z[j])     # zに複合化した結果(j)を格納
+       tmp    <- ""                  # バッファを初期化
+       break                         # 繰り返し文から抜ける
+     }
+   }
+ }
> result
[1] "A" "H" "C" "A" "G" "I" "C" "B" "H"

(1) 上記のプログラムでは,文字の種類が増えてくると計算速度が遅くなってしまいます.Rで,木構造を扱うようなことは出来るのでしょうか.
(2) Rで,C言語のポインタのようなことは出来るのでしょうか.
ご教示戴けますと幸いです.

grep("c",list(c("","")) の値が 1 になる問題

松田紀之? (2010-06-18 (金) 10:04:51)

Mac OS-X (10.5.8)でR2.11.1で文字列処理を試みているうちに,題名にあげた問題が見つかりました.以下,幾つか確認できたことです:
(1) patternの文字が"c"以外のアルファベットなら正常に動く.
(2) 参照されるlistの内容が c("") と単一の場合も正常に動く.
(3) listではなく,grep("c",c("","")) なら正常に動く.
プログラム全体の都合上,list() を対象にしています.何故この問題が起こるのか,またその対処法を教えてください.

  • ?grep内のx, testを読んでみてください. grep では文字列ベクトル以外はstructure(as.character(x), names = names(x))で処理(なのでcにマッチ)をしています. どんなデータか判らないので,なんですが, 前処理として, as.character(unlist(list(c("","")),recursive=T)) 渡してみるなどすれば良いのではないでしょうか. -- 2010-06-18 (金) 12:28:06
  • 既出:このページの一番下の記事を読んでみてください。原因は,それと同じことでしょう。「listオブジェクトのgrepについて」 -- 河童の屁は,河童にあらず,屁である。? 2010-06-18 (金) 12:36:28
  • 早速お答え頂き有り難うございました. grep(pattern, x,…) のxがvectorで無い場合,"coerced by as.character to a character vector."と言う説明の意味をいくつかの例で試し,少し理解できるようになりました.unlist( )を施すことで問題を回避できました. 「listオブジェクトのgrepについて」も参考になりました. -- 松田紀之? 2010-06-21 (月) 17:02:40

batch処理でfile名を自動的に生成し、saveしたい

nakamura? (2010-06-17 (木) 19:18:15)

単純な例として装置からの多数のdataをreadで取り込んで、XDR形式などで保存したいのですが、write.tableとsaveのfile名の指定のところで困ってます。" "で変数( fnとかfile.name[i] )を囲むと、文字列として変数が認識されているようで上手く行きません。ご教授お願いします。単純な例は以下です。”plotでのmain titleの指定”を参考にしました。

file.name <- c("map_1.csv", "map_2.csv") # ファイル名のベクトル
par(ask=T)
for (i in 1:2) {
    fn <- file.name[i] 	# ファイル名
    dt <- read.csv(fn , header=T, na.strings="NA")   
#   plot(dt, main=fn) 		# main タイトル付きの描画
    write.table(summary(dt), "fn_sum.txt", quote=F)
    save(dt, file="file.name[i].dat")
}
  • write.table で "map_i_sum.txt", save で,"map_i.dat" のような形式のファイル名を使いたいということでしょうか?そういうことならば,fn が "map_i.csv" なので,前者は file=sub(".csv", "_sum.txt", fn),後者は file=sub(".csv", ".dat", fn) とすればよいでしょう。
    for の制御変数 i を使って,fn <- paste("map_", i, ".csv", sep=""),file=sprintf("map_%d_sum.txt", i) のように,paste や sprintf を使ってもよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2010-06-17 (木) 23:10:00
  • ご回答ありがとうございます。うまくゆきました。追加で伺いたいのですが、csvのdataを入力する"dt"も、"dt_1", "dt_2"のような名前付けをしたいのですが、どのようにすればよろしいのでしょうか。shellですと dt_"$i" とすればできるんでしょうが・・・ お手数をおかけしますが、お願いします。 -- nakamura? 2010-06-18 (金) 13:39:43
  • ?assign -- 2010-06-18 (金) 18:38:20
  • 最初にも書いていたのだけど,「行列にfor文中の変数を含んだ名前をつける」も参照。
    でも,本当にそんなことが必要になることは滅多にないと思うんだなあ。 -- 河童の屁は,河童にあらず,屁である。? 2010-06-18 (金) 20:38:17
  • ありがとうございます。調べ方が不十分で、お手数をおかけしてすみませんでした。 -- nakamura? 2010-06-21 (月) 09:30:09

「0,1」のビットファイルを読み込む方法

R初心者? (2010-06-17 (木) 12:01:56)

「0100101000010101・・・」のように延々と続くファイルがあり,それを1文字(1ビット)ずつ読み込むことを考えております.

> ff <- tempfile()
> cat(file=ff,"01000101000100100101\n")
> read.fwf(ff, widths=rep(1,20))
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20
0  1  0  0  0  1  0  1  0   0   0   1   0   0   1   0   0   1   0   1

(1) ファイルを読み込む際文字数(ビット数)が分からなければ引数widthsを指定するときに困ります….読み込むファイルのサイズや文字数を計算する関数はありませんでしょうか.
(2) 上記では関数read.fwf()で無理やり読み込んでいますが,もっと良い関数があれば教えてもらえませんでしょうか.
どうかよろしくお願いいたします.

  • readBin を調べるとよいのではないかな。readBin(ff, size=1, what="int", n=1000) で整数値 48/49 のベクトル,readBin(ff, what="raw", n=1000) で raw (16 進) 30/31 のベクトルとして読み込めます。n は概算値でよいですが,file.info() を使って size を得ればよいでしょう。改行コードなども読み込まれるので,後で対処。 -- 河童の屁は,河童にあらず,屁である。? 2010-06-17 (木) 13:10:48
  • 早速ご指導いただきましてありがとうございます.以下のような形で実現することが出来ました!
    > ff <- tempfile()
    > cat(file=ff, "01000101000100100101\n")
    > read.fwf(ff, widths=rep(1,20))
      V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20
    1  0  1  0  0  0  1  0  1  0   0   0   1   0   0   1   0   0   1   0   1
    
    > file.info(ff)                              # ファイル情報
                                                              size isdir mode
    C:\\DOCUME~1\\x\\LOCALS~1\\Temp\\RtmpcQhzyb\\file767d7a5a   22 FALSE  666
                                                                            mtime
    C:\\DOCUME~1\\x\\LOCALS~1\\Temp\\RtmpcQhzyb\\file767d7a5a 2010-06-17 15:53:37
    .............................................................................
    
    > file.info(ff)[1]                           # ファイル情報からサイズのみ抽出
                                                              size
    C:\\DOCUME~1\\x\\LOCALS~1\\Temp\\RtmpcQhzyb\\file767d7a5a   22
    > 
    > size <- as.integer(file.info(ff)[1]-2)     # 改行文字の分だけ引き算
    > read.fwf(ff, widths=rep(1,size))           # 読み込み
      V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20
    1  0  1  0  0  0  1  0  1  0   0   0   1   0   0   1   0   0   1   0   1
    
    > readBin(ff, size=1, what="int", n=size)    # 整数値    48/49 のベクトルとして読み込み
     [1] 48 49 48 48 48 49 48 49 48 48 48 49 48 48 49 48 48 49 48 49
    > readBin(ff, size=1, what="raw", n=size)    # raw(16進) 30/31 のベクトルとして読み込み
     [1] 30 31 30 30 30 31 30 31 30 30 30 31 30 30 31 30 30 31 30 31
    
    > readBin(ff, size=1, what="int", n=size)-48 # 整数値    として読み込み -> 0,1に変換
     [1] 0 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 1 0 1
    お忙しいところ本当にありがとうございました.-- R初心者? 2010-06-17 (木) 15:54:30

単語間の距離を求めデンドログラムの構築まで

AKB? (2010-06-15 (火) 23:49:30)

基データ(csv)としてテキスト(301)×単語(1134)のマトリクスがあり,単語間の距離を算出し,デンドログラムの構築までしたいのですが”non-square matrix”と当然返されてしまいます.手順としては

data <-read.csv("C:/RTest/Real Game.csv", header=T, row.names=1)
data # 表示
old.op <- options(max.print=999999)
myCosine <- function(x) {
  ret <- matrix(0, ncol=ncol(x), nrow=ncol(x))
  for(i in 1:ncol(x)) { 
    for(j in 1:ncol(x)) {
      ret[i, j] <- (x[,i] %*% x[,j]) / (sqrt(sum(x[,i]^2)) * sqrt(sum(x[,j]^2)))
    }
  }
  ret
}
myCosine(data)
plot(hclust(as.dist(data)))

です.基のデータから単語間の距離に基づいたデンドログラムを構築する方法で何かうまい方法は無いでしょうか?

  • 何のために myCosine を定義したんですか?
    myCosine(data) をやっても,その結果を使ってないじゃないですか?
    plot(hclust(as.dist(myCosine(data)))) なんじゃないですか?
    デンドログラム、またヒートマップのデンドログラムの高さ調節について」も参照するとよいかも。myCosine 関数の改良案も書いてありますよ。
    投稿法も再度チェックしてください(記事にプログラムを含める方法や,プログラムの書式自体)-- 河童の屁は,河童にあらず,屁である。? 2010-06-16 (水) 09:22:29

データフレームの取り出し

akira? (2010-06-12 (土) 22:53:35)

以下のデータフレームがあったとして

   a b c d e f g
1  q p q 4 6 7 6
2  q p p 5 4 5 4
3  p p p 5 4 5 7
4  q q q 3 5 4 6

a~cそれぞれの値がpに該当する行を取り出す方法を考えていたのですが、どうしても思いつきませんでした。

[a]
  d e f g
3 5 4 5 7
[b]
  d e f g
1 4 6 7 6
2 5 4 5 4
3 5 4 5 7
[c]
  d e f g
2 5 4 5 4
3 5 4 5 7

どなたかお分かりの方、丸投げで申し訳ありませんがご教示頂けないでしょうか?

  • 誰でも分かると思うが,答えてやろうと思う人は少ないのかも。データフレーム名を x とすると,以下のごとし。 -- 河童の屁は,河童にあらず,屁である。? 2010-06-12 (土) 23:31:53
    > subset(x, x[1]=="p")[4:7]
      d e f g
    3 5 4 5 7
    > subset(x, x[2]=="p")[4:7]
      d e f g
    1 4 6 7 6
    2 5 4 5 4
    3 5 4 5 7
    > subset(x, x[3]=="p")[4:7]
      d e f g
    2 5 4 5 4
    3 5 4 5 7
    > x[x[1]=="p",][4:7] # これは余りお勧めしない
      d e f g
    3 5 4 5 7
  • 迅速なご回答ありがとうございます。すみません、質問を間違えていました。1つずつ手で代入せずに一度にx[1]~x[3]までを取り出す方法です。 -- akira? 2010-06-12 (土) 23:53:51
  • てまがかかるなあ。。。lapply(x[1:3], function(y) subset(x, y=="p")[4:7]) でよい? -- 河童の屁は,河童にあらず,屁である。? 2010-06-12 (土) 23:57:56
  • ありがとうございました。lapplyの使い方がいまひとつ理解できていなかったので、勉強したいと思います。 -- akira? 2010-06-13 (日) 00:11:54

配列とGIS(緯度経度)情報の重ね合わせ図

宗二? (2010-06-11 (金) 02:01:30)

シェープファイルと2次元配列から作った、図の重ね合わせ方で悩んでます。
具体的には、日本の海岸線のシェープファイル(ライン)を

plot(シェープファイル, xlim=c(西経度, 東経度), ylim=c(南緯度, 北緯度))

というようにプロットした後、2 次元配列として用意した日本周辺の気温データを、同じ緯度経度の範囲で重ねて作図したいのですが、2次元配列をimage、あるいはcontour関数で作図するときに、x軸とy軸の範囲を緯度経度で指定できないものでしょうか?
配列をプロットするときの軸の範囲が、配列の要素番号と対応するので

image(配列, xlim=c(西経度, 東経度), ylim=c(南緯度, 北緯度))

のようにすると、範囲が大きくずれて何も表示されなくなってしまいます。
なにか良い解決方法ありましたらお願いします。

  • シェープファイルの読み込みはどのライブラリのどのコマンドを使ったのでしょうか。image()を描画してからポリゴンを書かないと、色にαチャンネルを設定しない限り、ポリゴンが覆い隠されてしまいますよ。提示された情報だけではなぜうまくいかないのか分かりません。image()に与える配列のxとyが経度・緯度になっていないのではないでしょうか。 -- 谷村 2010-06-11 (金) 13:48:35
  • ご返答ありがとうございます。シェープファイルの読み込みは、maptoolsパッケージの"readShapeLines?"を使って読み込んでいます。ご指摘いただいた点に関してなんですが、先にimage()を使って配列から作図する際に、配列のxとyを緯度経度で与えるとは、どういう方法をとればよいのでしょうか。xlimとylimで緯度経度の範囲を指定すると、出力される図の枠(軸)には緯度経度が反映されるものの、配列自体に緯度経度の情報が含まれないので、図の枠内が空白になってしまいます。 -- 宗二? 2010-06-11 (金) 18:23:35
  • 「あなたの試みたことを回答者が再現できるような、データ、コード、エラー出力(そして、R のバージョン、使用 OS、使用非標準パッケージ名)を添えることをお勧めします」という注意書きがありますよね。あなたが実際にやっているプログラムを提示するのが一番よいと思いますけどね。 -- 河童の屁は,河童にあらず,屁である。? 2010-06-11 (金) 21:11:48
  • 分かりにくい質問で申し訳ないです。
    当方のR環境はver2.10.0で、Tinn-R1.19.4.7で編集したものをRコンソールにペーストしています。
    シェープファイルは国土交通省のホームページで公開されている「国土数値情報 海岸線データ」
    http://nlftp.mlit.go.jp/ksj/jpgis/datalist/KsjTmplt-C23.html
    のxmlファイルを、ArcGISでまとめてcoastline.shpというファイルに変換しました。
    その上で以下のようなプログラムを試しています。 -- 宗二? 2010-06-12 (土) 00:02:44
    temp0 <- file("...気温のバイナリデータ...", "rb")
    width <- 501   ### 気温データの水平格子数
    height <- 501  ### 気温データの鉛直格子数
    temp <- readBin(temp0,integer(), n=width*height, size=2)
    close(temp0)
     
    temp = temp/10.0  ### データ-->気温への変換式です。
    temp_arr <- matrix(temp,width,height)
    temp_arr = t(apply(temp_arr,1,rev))   ### 地図投影のために配列を回転
    
    image(temp_arr,col=rainbow(300),xlim=c(137,142),ylim=c(36,41),zlim=c(5,30))
    ### 経度137E-142E, 緯度36N-41N, 温度の範囲5-30℃ で指定したいのですが、
    ### このままだと図の枠中が白紙のままです。
    ### 501*501の配列を、0.01度格子で上記の緯度経度に対応させたいのです。
    
    map <- readShapeLines("coastline.shp")
    plot(map,xlim=c(137,142),ylim=c(36,41))
    ### 海岸線のシェープファイルの読み込みとプロット
    ### こちらは図の枠内にちゃんと海岸線がプロットされます。
  • tempにxy座標が入っていないのでそれでは重なりません。ヒントを差し上げますので、考えてみてください。 -- 谷村 2010-06-14 (月) 20:36:09
    a <- list(x=seq(137,142,1),y=seq(36,41,1),z=1:6%o%1:6)
    image(a)
    st20100614-2.png

    この図の描画に続いて
    map <- readShapeLines("coastline.shp")
    plot(map,xlim=c(137,142),ylim=c(36,41),add=TRUE)
    とすれば、重なっていることがわかるはず。coastline.shpがないので検証できませんが。
  • 的確なご指摘ありがとうございました。思いどおりの図が描けました。
    リスト化して配列にxy座標の情報を付加するんですね。勉強になります。 -- 宗二? 2010-06-16 (水) 17:14:27

プログラムの中断・再開

shannon? (2010-06-11 (金) 00:54:55)

プログラム実行を途中で中断・再開させる関数、あるいはコマンドはあるのでしょうか?
WindowsのTinn-R(ver:1.19.4.7)から、ショートカットキーでRコンソール(ver:2.11.0)にプログラム全体を送り実行しているのですが、プログラムの途中で、変数の値を確認するために実行を中断し、確認後に実行を再開させる、ということをやりたいのです。
手動で範囲指定してコンソールに送る、以外でいい方法はないでしょうか?

  • 簡単そうな質問なのに回答がないのは,質問があいまいなのかな?
    「変数の値を確認」というのは,いつも決まった変数の値を確認後実行継続というなら,readLines 関数を使ってみたら?
    > for (i in 1:10) {
    + 	print(paste("i =", i))
    + 	j <- readLines(con=stdin(), n=1)
    + 	if (j == "stop") break # 早めに実行中断したいならこのようなものを入れておく
    + }
    [1] "i = 1"
                    # リターンキーだけ押した
    [1] "i = 2"
    ok
    [1] "i = 3"
    0
    [1] "i = 4"
    stop            # "stop" を入力すると終了
    それとも場合に応じていろいろな変数をチェックすることもあるということ?ならば debug 関数を調べてみたら? -- 河童の屁は,河童にあらず,屁である。? 2010-06-11 (金) 11:26:18
  • ご返答ありがとうございます。 browser()やstopifnot()など他のデバッグ用関数も試してみました。 思い違いでしたら申し訳ないのですが、確かに関数の命令文の中で使うと効果があるんですが、関数の命令文以外の場所では、実行が中断できませんでした。 例えば以下のように、プログラム中で変数の定義をやり直す場合、3行目で一旦実行を中止したいのですが、ここにstop関数やreadLines関数などをさしこんでも、プログラムの実行自体は最終行(5行目)まで行われてしまいます。
    1:  a <- 1
    2:  b <- 2
    3:  #ここで実行を中止したい
    4:  a <- 10
    5:  b <- 20
    示していただいた例文を使って、
    1:  a <- 1
    2:  b <- 2
    3: 
    4:  for (i in 1:2) {
    5:  print(paste("i=", i))
    6:  j <- readLines(con=stdin(), n=1)
    7:  if (j =="stop") break
    8:  }
    9:  
    10:  a <- 10
    11:  b <- 20 
    のようにして実行すると、10行目のa<-10という命令がreadLines関数に渡されて、プログラム実行後のaとbの値は、a=1,b=20になってしまいます。 10行目以降の命令を渡す前に、9行目までで実行を中断したいのですが方法ありますでしょうか。初歩的な勘違いしてたらすみません。 -- shannon? 2010-06-16 (水) 00:50:29
  • > 確かに関数の命令文の中で使うと効果があるんですが、関数の命令文以外の場所では、実行が中断できませんでした
    そのような場合には,全体を { } でくくってやればよいのです。不思議でしょう(^_^;)。例に示された場合には,
    { # これと
    a <- 1
    b <- 2
    cat("Hit any key!\n")
    if (readLines(con=stdin(), n=1) == "stop") stop("中止しました")
    a <- 10
    b <- 20
    } # これ
    こんなところでいかが? -- 河童の屁は,河童にあらず,屁である。? 2010-06-17 (木) 10:37:56
  • 再度のご返答ありがとうございました。教えていただいたやり方で無事(?)中断できました。
    専用の関数がなくとも工夫しだいでなんとかなるんですね。 -- shannon? 2010-06-17 (木) 22:33:32

Rによる日別の時系列分析に関する文献を探しています。

T? (2010-06-10 (木) 16:22:17)

只今卒論のテーマとしてある飲食店の一店舗の様々な日別データをRによって時系列分析しようと考えていまして、日別データを扱った時系列分析に関する本や文献を探しています。
ご存じの方がいらっしゃれば教えていただけると幸いです。

2次元配列の回転

do-san? (2010-06-10 (木) 01:08:00)

2次元のバイナリ(もしくは文字列)配列を、90度、もしくは180度回転させたいのですが、そのような関数はあるのでしょうか?

  • 二次元のバイナリ配列というのは,例えば,画像ファイル(jpeg ファイルなど)のことですか?
    文字列配列というのは要素が文字列であるだけで,数値行列と同じように扱えばよいのでしょう。だとすれば,既出。 -- 河童の屁は,河童にあらず,屁である。? 2010-06-10 (木) 07:50:40
  • ありがとうございます。見落としてました。 -- do-san? 2010-06-10 (木) 15:11:17

filled.contourの 重ね描きについて

vp? (2010-06-06 (日) 21:35:28)

宜しくお願いします。
以下のように filled.contour で描いた図に abline で x=0.5, y=0.5 の線を重ね描きしようと思いましたが、座標が対応しませんでした。

data(volcano)
filled.contour(volcano, color = terrain.colors, asp = 1) # simple

par(new = T)
abline(h = 0.5, xlim = c(0, 1), ylim = c(0, 1))
par(new = T)
abline(v = 0.5, xlim = c(0, 1), ylim = c(0, 1))

何かうまい方法は無いでしょうか?

  • オンラインヘルプの Note の二段落目を熟読玩味。 -- 河童の屁は,河童にあらず,屁である。? 2010-06-06 (日) 23:35:15
    filled.contour(volcano, color = terrain.colors, asp = 1,
                   plot.axes={axis(1); axis(2); abline(v=0.5, h=0.5)})
  • ありがとうございます。余白の使い方がよくわかりました。y=0.5の長さが少し足りませんが、自分で考えてみます。ところで2.54という数値は何に由来するのでしょうか? -- vp? 2010-06-07 (月) 01:03:59
  • 最初に書いたものを修正しました。filled.contour を読んで,対症療法を示したものです。確かに水平線の長さが短かった。
    現在示しているものが正しい対処法です。私自身も,オンラインヘルプの重要性を再認識したところです。 -- 河童の屁は,河童にあらず,屁である。? 2010-06-07 (月) 09:00:57
  • おお!filled.contourに専用の引数が用意されていたのですか。とりあえず低水準作図関数で上書きするクセを改めます。ありがとうございました。 -- vp? 2010-06-07 (月) 21:26:43
  • ここで質問すべきでなかったらすみません。私も同じ問題で悩んでいたので、 上記を参考にさせていただいたのですが、
    filled.contourの引数plot.axesに、例えば以下のようにplot(seq(0,1,by=0.1))を重ね書きするように変更すると、
    data(volcano)
    filled.contour(volcano, color = terrain.colors, asp = 1
                   ,plot.axes={axis(1); axis(2);plot(seq(0,1,by=0.1))})
    下の図のように、左側にあった作図領域が消去されて、
    右のカラーバーに軸を併せてプロットしてしまいます。
    left
    filled.contourにplotを使って重ね書きする場合は、 また別の方法があるんでしょうか? -- ですら? 2010-06-17 (木) 03:50:46
  • plot.axes={par(new=T); plot(seq(0,1,by=0.1))} では? -- 2010-06-17 (木) 10:19:46
  • ご回答ありがとうございます。ご指摘いただいたやり方で、plotを重ねることができたのですが、下図のように軸が微妙ずれてしまいます。
    left
    data(volcano)
    filled.contour(volcano, color = terrain.colors,xlim=c(0,1),ylim=c(0,1),
                   plot.axes={axis(1); axis(2);par(new=T);
                   plot(seq(0,1,by=0.1,xlim=c(0,1),ylim=c(0,1))
                   })
    xlim,ylimで軸の範囲を設定してもずれは直りませんでした。これは何が原因なのでしょうか?-- ですら? 2010-06-18 (金) 10:40:58
  • par(new=T)は単に重ね描きするだけですから、plot.axesの中で描画領域のパラメータを設定する必要があるのでしょう。filled.contourのx/y軸の表示区間はデフォルトで[0, 1]なので、plot.axisの中の点もそれに追随させました。軸の位置がずれることを直す以外に、あなたが何を理想としているか判らないため、あとは自助努力してください。なお、行頭に;や,を書いたり、不要なコメントアウトを入れると、他人は読みにくいです。 -- 2010-06-18 (金) 13:10:28
    data(volcano)
    filled.contour(volcano, color = terrain.colors, 
                   plot.axes = {par(new = T, xaxs = "i", yaxs = "i")
                                plot(seq(0, 1, by = 0.1), seq(0, 1, by = 0.1),
                                     xlab = "", ylab = "")
                                axis(1); axis(2)})
  • ご回答ありがとうございます。parによるグラフィックスパラメータのいじり方が勉強不足でした。
    ご指摘いただいた例を参考にして、目的とする図が描けました。本当にありがとうございました。
    また、読みにくいプログラムを示してしまい失礼しました。前の質問で示したものは、一応修正しておきます。-- ですら? 2010-06-18 (金) 13:25:22

GLMのfamily指定によるEstimateの正負の逆転について

mm? (2010-06-06 (日) 01:59:41)

こんにちは。最近RでGLMに取り組み始めました。
まずは,説明変数が応答変数によって正,負のどちらに影響しているかを調べることが目的です。
この応答変数は,連続変数で正の値を取るため,familyをGammaにしました。
するとEstimateの値が,正規分布を仮定した回帰分析と逆の正,負の関係になってしまい,解釈に困っています。
下の例のように,irisのデータで,familyをgaussianとGammaでGLMを行っても同じ結果です。
指定するfamilyによって,正負の方向が逆転するということはあるのでしょうか?

test <- glm(Petal.Length ~ Petal.Width, data=iris)            
summary(test)

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  1.08356    0.07297   14.85   <2e-16 ***
Petal.Width  2.22994    0.05140   43.39   <2e-16 ***
#################### 
testG <- glm(Petal.Length ~ Petal.Width, data=iris, family=Gamma)         
summary(testG)

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.532340   0.017386   30.62   <2e-16 ***
Petal.Width -0.172682   0.008915  -19.37   <2e-16 ***
  • family=Gamma の場合,link のデフォルトは inverse ですよ。そういわれてもわからないなら,? Gamma してください。闇雲にやっても,ろくなことはありません。 -- 河童の屁は,河童にあらず,屁である。? 2010-06-06 (日) 11:02:30
  • 早速ありがとうございました。返信が遅くなり申し訳ありません。 -- mm? 2010-06-17 (木) 15:12:28
  • 続きです。Gammaしてみました。(link=inverse)Gmma分布について,まだよくわからない部分もありますが,正負の方向を逆転させないためにはlink=logということなのですね。 -- mm? 2010-06-17 (木) 15:21:02
  • 上記入力ミスがありました(link=inverse)としてみたら出力が同じでしたと記入したかっただけですが,途中で送信されてしまいました。つい試行錯誤してしまいますが,よく勉強したいと思います。ありがとうございました。 -- mm? 2010-06-17 (木) 15:26:00

Bland Altman plotについて

sakura? (2010-06-05 (土) 13:13:57)

最近、調べ物をしていたら、Bland Altman plot のことが目にとまりました。信頼性評価に使われるそうですが、馴染みがありません。Rのlibraryに搭載されたものがあるのでしょうか?差分の傾向を知るというのが、ポイントのようですが・・・。ご教示いただければ幸いです。

  • 調べるついでに,google 検索すればよかったですね。
    ResearchMethods? パッケージに入っているようです。 -- 河童の屁は,河童にあらず,屁である。? 2010-06-05 (土) 13:31:37
    BlandAltman {ResearchMethods}	R Documentation
    
    BlandAltman Plot
    
    Description
    
    Using a graphical user interface (GUI) this function performs a Bland Altman
    plot, and allows for manipulation of the variables within the plot.
    
    Usage
    
    BlandAltman(x, y, gui=TRUE, bandsOn=FALSE, biasOn=FALSE, regionOn=FALSE,
                smooth=FALSE, sig=2)
  • 早速のリサーチありがとうございます。 -- sakura? 2010-06-05 (土) 16:06:38
  • > 早速のリサーチありがとうございます
    そんなに,まともに受け取られると,ずっこけるなあ。 -- 河童の屁は,河童にあらず,屁である。? 2010-06-05 (土) 20:54:49
  • Altman Plot についての邦文解説の詳しいのを見つけられません。ものぐさで申し訳ありませんが、ご存知の方いらっしゃいませんか? -- sakura? 2010-06-12 (土) 08:56:55
  • あなたが見つけた,一番詳しい解説はどこにあった,どのようなもの?
    それを聞いておかないと,答えらんねえ。「そんなんじゃだめだ」なんていわれたくないからねえ。 --  ? 2010-06-12 (土) 11:48:47
  • 因みにグーグルすると、以下のような情報に行き当たるのですが、今ひとつ、分かったようで解らないもどかしさを感じるのです。
    2法を繰返しデータの差分として、応用出来そうに思ったりして、とか、迷宮に迷い込んでいます。
    VBA for Excel97による統計ソフト http://www.kms.ac.jp/~clinilab/person/ing/lib/statics/  Bland-Altman Plot(Difference Plot) 欧米の学術誌では、測定法間比較に直線関係式に加えて Bland-Altman Plot を用いる場合が多い。・・・
    3. 系統誤差の有無・種類の確認 http://shimoi.iuhw.ac.jp/reliability_3_systematicbias.html 
    次に, この研究デザインによる結果としての測定値に, 系統誤差が混入しているかどうかを検討する。この検討のための統計学的手法の1つに, Bland- Altman分析(Bland-Altman analyasis, Bland-Altman method)がある。
    Bland-Altman分析とは, 2つの測定値の差(difference, a-b, 以下d)をy軸、2つの測定値の平均値((a+b)/2)をx軸にプロットした散布図(Bland-Altman plot, Bland-Altman graphs, difference plot)を作成し, それら測定値が内包する系統誤差の有無を可視的, あるいは統計学的に明らかにする方法である6)7)。
    つまり、次の座標で示される点AをプロットするとBland-Altman plotが作成できる。・・・
    Bland-Altman分析を用いた継ぎ足歩行テストの検者内・検者間信頼性の検討 http://www.jstage.jst.go.jp/article/rika/23/5/23_625/_article/-char/ja -1- 信頼性-級内相関(ICC)と誤差 �. 信頼性と妥当性 1. 信頼性 .. http://search.conduit.com/Results.aspx?q=Bland%20Altman&start=10&SearchSourceOrigin=3&gil=ja-JP&SelfSearch=1&hl=ja&ctid=CT379674&octid=CT379674 -- sakura? 2010-06-12 (土) 15:03:31
  • 英語が苦手なもので、重い腰が上がらずにいるのです。 -- sakura? 2010-06-12 (土) 15:27:30
  • 英文を探してみると、以下の通り、
    British Journal of Anaesthesia 2007 99(3):309-311; doi:10.1093/bja/aem214
    I. Using the Bland–Altman method to measure agreement with repeated measures http://bja.oxfordjournals.org/cgi/content/full/99/3/309
    この論文のレファレンスでAltmanの論文
    7 Bland JM, Altman DG. Statistical methods for assessing agreement between two methods of clinical measurement. Lancet (1986) (i):307–10.
    8 Bland JM, Altman DG. Comparing methods of measurement: why plotting difference against standard method is misleading. Lancet (1995) 346:1085–7.[CrossRef?][Web of Science][Medline]
    9 Bland JM, Altman DG. Measuring agreement in method comparison studies. Stat Methods Med Res (1999) 8:135–60.[Abstract/Free Full Text] http://smm.sagepub.com/cgi/content/abstract/8/2/135?ijkey=33a8311bd01776b46d28a1ac2e4b6652f09be76d&keytype2=tf_ipsecsha -- sakura? 2010-06-12 (土) 15:40:27
  • もしや、と思い、PubMed?で「altman plot」で検索すると、461件、Free Full Textが95件ヒットしています。梅雨入りと共に大変なりや?! -- sakura? 2010-06-12 (土) 19:41:39
  • Blandのスペルを間違ってBrandとなっていますが,http://phi.med.gunma-u.ac.jp/memo2/20090108.htmlにメモがあります。ご参考まで。 -- 2010-06-15 (火) 11:21:57
  • ありがとうございます。早速拝見させていただきました。新規性という点では基本的なことの工夫で出来ることのようですが、初心者でも容易に理解しやすい点に興味を持っています。英語の不得手なものには難問ですが、しばらく眺めてみたいと思います。 -- sakura? 2010-06-16 (水) 21:23:33
  • MethComp?の最新バージョンはBendix Carstensenのサイトで辿りつけました。インストールは次の説明がついています。ありがとうございました。The latest version (1.1-6) is here as zip file for Windows and tar file. You can install it on Windows by downloading the .zip file to your computer, and then from within R click Packages -> Install package(s) from local zip files.... You will then be asked to point to the .zip file you just downloaded. -- sakura? 2010-06-16 (水) 21:49:07

while のエラー

while? (2010-06-03 (木) 03:44:10)

while を使用し、行列 kara 内に while 内処理を length(mg) 回実行したいのですがエラーが出ます。
(df kara 内の candy, drop という変数(行名)それぞれに対応する colMeans を求め、kara 内に格納する)
エラーは以下のように出ます。

以下にエラー kara[, i] <- g : 
  置き換えるべき項目数が,置き換える数の倍数ではありませんでした 
mg <- c("candy","drop") # データフレーム ame の中の colname を 2 つ選び vector に
kara <-matrix(, length(mg))
i <- 0
while(i <- i+1 <= length(mg)) {
    g <- colMeans(subset(ame, ame[i] == "eat", select = (範囲を指定)))	
    kara[,i] <- g	
}
  • 直しようがないプログラムですね。mg <- c("candy", "drop") で,何行何列の行列ができるのか。そのとき kara[, i] が許されるか。ame[i] とは何を指すのか。subset は何を表すのか。その colMeans は何個の要素を持つのか。などなどを検討しましょう。ようするに「while のエラーではない」ということです。
    もっと R らしい,簡明直截なプログラムを考えるとよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2010-06-03 (木) 08:42:55
  • そうですね。せめて、ame の中身をつけていただければ、妄想のしようもあるのですが、、、 -- asap? 2010-06-03 (木) 23:46:04
  • 説明不足で申し訳ありません。ameの中には数値データ(1~140)が1000行30列のmatrixとして入っています。candy,dropはmatrix ameの中の行の名前(変数)で、変数名を複数選択し、各々の変数に対しcolMeans()処理を行い後に新しい1つのmatrixにまとめるという処理がしたいです。selectの範囲内はame内の30の列変数です。 -- while? 2010-06-04 (金) 15:00:49
  • 言葉だけでは曖昧なので,小さなデータを示せばすぐにわかるものを。
    以下のようなデータフレームでしょうかね。
    > set.seed(123)
    > ame <- data.frame(name=sample(c("candy", "drop", "caramel"), 15, replace=TRUE),
    +                   x1=sample(140, 15, replace=TRUE),
    +                   x2=sample(140, 15, replace=TRUE),
    +                   x3=sample(140, 15, replace=TRUE))
    > ame
          name  x1  x2  x3
    1    candy 126 135  20
    2  caramel  35 127  33
    3     drop   6  97  66
    4  caramel  46 112  38
    5  caramel 134   4 121
    6    candy 125  67   7
    7     drop  97 107  62
    8  caramel  90  31 112
    9     drop 140  45  18
    10    drop  92  33  79
    11 caramel 100  20  29
    12    drop  77  59  18
    13 caramel  84  58 106
    14    drop  41  52 126
    15   candy  21  22  53
    求めるものも,一行でできますよ。
    > sapply(split(ame, ame[,1]), function(d) colMeans(d[2:4]))
          candy  caramel drop
    x1 90.66667 81.50000 75.5
    x2 74.66667 58.66667 65.5
    x3 26.66667 73.16667 61.5
    これでよい?必要に応じ,結果を転置。 -- 河童の屁は,河童にあらず,屁である。? 2010-06-04 (金) 15:14:21
  • 目的次第ですが,ライブラリの有効利用を考えると。library(doBy);summaryBy(.~name, data=ame) -- aa? 2010-06-04 (金) 16:02:07
  • ライブラリの関数を持ち出すのは反則行為だなあ(^_^;)
    aggregate(ame[2:4], ame[1], mean) というのが,一番簡単か。 -- 河童の屁は,河童にあらず,屁である。? 2010-06-04 (金) 16:13:20
    > aggregate(ame[2:4], ame[1], mean)
         name       x1       x2       x3
    1   candy 90.66667 74.66667 26.66667
    2 caramel 81.50000 58.66667 73.16667
    3    drop 75.50000 65.50000 61.50000
  • ありがとうございます。cady,drop,calamelの変数以外にも100程変数があったとして、その中から"cady","calamel"などいくつかの変数名を入れることでそれに当てはまるものだけにcolMeans処理を行いたいのですが… -- while? 2010-06-04 (金) 16:21:56
  • 工夫次第ですよ。 -- 河童の屁は,河童にあらず,屁である。? 2010-06-04 (金) 16:29:13
    > ame2 <- ame[ ame[,1] %in% c("caramel", "drop"),]
    > aggregate(ame2[2:4], ame2[1], mean)
         name   x1       x2       x3
    1 caramel 81.5 58.66667 73.16667
    2    drop 75.5 65.50000 61.50000

Kaplan-Meier 曲線が 1 本だけ

?アロバ? (2010-06-02 (水) 19:29:27)

たびたび皆様にご指導いただきたく、よろしくお願いします。

source("http://aoki2.si.gunma-u.ac.jp/R/src/km_surv.R", encoding="euc-jp")
# 1 は A 群,2 は B 群を表す
group <- c(1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,1,1,1,1,
           1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,1,2,2,1,2)
# 1 は死亡,2 は 生存(打ち切り)を表す
event <- c(1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,
           1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0)
# 生存期間
time <- c(2,84,318,198,198,197,192,306,96,90,88,66,48,264,
          24,5,243,216,42,5,20,0,12,144,48,192,192,228,
          176,180,84,84,123,117,115,267,98,96,86,63,44,41,
          33,20,18,252)
a.group <- group == 1	
km.surv(time[a.group], event[a.group])
library(survival) # survival ライブラリーを使う
dat <- Surv(time[a.group], event[a.group]) # survfit で使うオブジェクトを作る
res <- survfit(dat)

上記にて入力したのですが、Kaplan-Meier 曲線が A 群 1 本だけのグラフになってしまいます。A, B 両群の曲線を一つのグラフに入れたいのですが。。。 よろしくお願いします。

  • plot(survfit(Surv(time, event)~group), col=1:2) でよいでしょう。ついでに,色分け方法も加えておきます。
    survfit.formula のオンラインヘルプを熟読すると,使い方がよくわかるでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2010-06-02 (水) 21:42:34
  • 出来ました、早速”survfit.formula”を読んでみます。ありがとうございました。 -- ?アロバ? 2010-06-02 (水) 23:11:05

行列にfor文中の変数を含んだ名前をつける

lo? (2010-05-31 (月) 00:05:13)

for (i in 1:10){
の中で
計算結果を行列に格納する工程を書いた後
i番目の結果を格納した行列(仮にkekkaという名前とします)に、新たに、
hogeとi(1から10までの値をとる)をくっつけた、hogeiという名前をつけたいです。
この場合、
hogei<-kekka
とやっても、hoge1とならずに、hogeiとなってしまいます。
paste("hoge",i)<-kekkaとやると、エラーになります。
このような、ループの回数に応じた連続した名称をつけるには、どのようにしたらよいのでしょうか?

val.prob{Design}のexampleコードに関する質問

vi? (2010-05-27 (木) 19:22:41)

質問です。Designパッケージの説明ページ
http://bm2.genes.nig.ac.jp/RGM2/R_current/library/Design/man/val.prob.html
において、Examplesとして、実際に使用するときのコードが載っています。
この中の、後半部分$Survival analysis examples 中に

# Survival analysis examples
# Generate failure times from an exponential distribution
set.seed(123)              # so can reproduce results
n <- 2000
age <- 50 + 12*rnorm(n)
sex <- factor(sample(c('Male','Female'), n, rep=TRUE, prob=c(.6, .4)))
cens <- 15*runif(n)
h <- .02*exp(.04*(age-50)+.8*(sex=='Female'))
t <- -log(runif(n))/h
label(t) <- 'Time to Event'
ev <- ifelse(t <= cens, 1, 0)
t <- pmin(t, cens)
S <- Surv(t, ev)

# First validate true model used to generate data
w <- val.surv(est.surv=exp(-h*t), S=S)
plot(w)
plot(w, group=sex)  # stratify by sex

上記のような記載があるのですが、私は、est.survというのが、時間tにおける各ケースの計算上の生存率であると理解しています。その場合、

w <- val.surv(est.surv=exp(-h*t), S=S)

の部分の、exp(-h*t)は、比例ハザードを用いて、(時間tにおけるbaseline hazard)^exp(h)とするのが正しいのではないかと疑問に思っています。そうはいっても実際に試すと、きれいなキャリブレーションプロットがかけるのですが。私のest.survの解釈自体が間違っているのでしょうか?どなたか、引数est.survとSについての解釈を教えていただけると幸いです。

  • コメントに有るように、これは比例ハザードモデルではなく、指数分布のパラメトリックモデルです -- surg? 2010-05-29 (土) 09:29:01

デンドログラムの葉の並び替え

jun? (2010-05-25 (火) 22:57:47)

クラス "dendrogram" に対するメソッドで葉を並べ替える
reorder(x, wts, ...)
というものがありますが、使い方がよくわかりません。

葉をV1、V2、V3、V4・・・・と昇順に並べたいのですが。
昇順に並べても枝は絶対にクロスしないような距離行列とクラスタリング結果になっています。

wtsとは重みと書いてありましたが何の重みですか?
よろしくお願いします。
使用環境はR version 2.10.0 (2009-10-26)でWindowsVista?です。

1からV1への距離は存在しないので過度に大きな数として99.00を使っています。その他の99.00も同じ意味です。
クラスタリングを単連結で行うため結果に影響は及ぼさないと考えてそのようにしました。

> r
      V1     V2     V3     V4     V5     V6     V7     V8     V9
1 99.000  0.045 99.000 99.000 99.000 99.000 99.000 99.000 99.000
2  0.045 99.000  0.071 99.000 99.000 99.000 99.000 99.000 99.000
3 99.000  0.071 99.000  0.042 99.000 99.000 99.000 99.000 99.000
4 99.000 99.000  0.042 99.000  0.037 99.000 99.000 99.000 99.000
5 99.000 99.000 99.000  0.037 99.000  0.059 99.000 99.000 99.000
6 99.000 99.000 99.000 99.000  0.059 99.000  0.111 99.000 99.000
7 99.000 99.000 99.000 99.000 99.000  0.111 99.000  0.071 99.000
8 99.000 99.000 99.000 99.000 99.000 99.000  0.071 99.000  0.091
9 99.000 99.000 99.000 99.000 99.000 99.000 99.000  0.091 99.000
> plot(hclust(as.dist(r),method="single"))
  • 本当によく分からない関数ですね。以下のようにすると希望する並べ替えはできます。 -- 河童の屁は,河童にあらず,屁である。? 2010-05-25 (火) 23:53:37
    par(mfrow=1:2)
    hc <- hclust(as.dist(r),method="single")
    plot(hc, hang=-1, main="", sub="", xlab="")
    hc2 <- reorder(as.dendrogram(hc), c(1,2,3,4,5,13,7,8,20))
    plot(hc2)
    reorder.png
  • ありがとうございます。ただ他のデータも同じようにしていかなければならないので c(1,2,3,4,5,13,7,8,20) の部分の解説をお願いできませんでしょうか。 -- jun? 2010-05-26 (水) 21:37:23
  • str(hc)で構造がわかるようですね。勉強になりました。 -- MIKU? 2012-02-15 (水) 16:40:38

既定値つきの引数

ms? (2010-05-25 (火) 20:56:33)

RjpWikiの『Rの関数定義の基本』を参考にさせて頂き、関数定義で変数を既定値にしているのですが、結果を見ると、既定値になっていないようです。
x[2]+x[3]=1 としたいのですが、この書き方ではだめなのでしょうか?

ご意見頂きたくよろしくお願い致します。
使用環境は R2.10.1, XPです。

fr <- function(x, y=1) {
  
  LL <- 0 
  
  pp <- x[4]*(x[2]*(Data[, 19])^x[1] + x[3]*(Data[, 21])^x[1])^(1/x[1])
  dp <- x[4]*(x[2]*(Data[, 20])^x[1] + x[3]*(Data[, 22])^x[1])^(1/x[1])
  y <- x[2] + x[3]

  Ppp <- exp(pp) / (exp(pp) + exp(dp))
  Pdp <- exp(dp) / (exp(pp) + exp(dp))
  
  Ppp <- (Ppp != 0)*Ppp + (Ppp == 0)
  Pdp <- (Pdp != 0)*Pdp + (Pdp == 0) 
  
  Cpp <- Data[, 4] == 1
  Cdp <- Data[, 4] == 0

  LL <- sum(Cuchi*log(Puchi) + Csoto*log(Psoto))
  return(LL)
}
  • 何を計算しようとしている関数なのか理解できません。何を計算していようがかまわないのだけど,やっていることが何のためにやっているのか分からない。関数が返す LL は return の前にある式で計算され,その計算式で引用される変数はそれ以前のどこにも出てこない(それ以前の計算式は何のために何を計算しているの?)
    「x[2]+x[3]=1 としたい」というのも,よくわからない。x の要素は 4 個?で,x[2] と x[3] を足すと 1 になるような関係式がある?そもそも,x はベクトルで引き渡さないといけないようにも見えない。いちいち x[1] みたいに引用しないといけないし。4 つの要素を x1, x2, x3 x4 として引き渡せば,function(x1, x2, x3=1-x2, x4, y) とすれば,少なくとも x3 は 1-x2 という規定値を持つことにはなるでしょう。x[2]+x[3] が 1 になるような組み合わせは無限にあり,規定値になり得ない。(x2+x3=1 になるような解を求めるというような場合もありますが,そのような場合は「規定値」ではなく,「制約条件」という。概念がまるで違う)。
    ついでながら,引数で渡される y は規定値 1 を持つが,にもかかわらず他の計算に使われる前に y <- x[2] + x[3] と代入されてしまう。これはあなたが言っている 「x[2]+x[3]=1 としたい」というのとは,まるで違う。引数で渡された x[2], x[3] の値を足して,それを y という変数に代入しているだけ。それによって,x[2] や x[3] の値が別のものになるということではない。-- 河童の屁は,河童にあらず,屁である。? 2010-05-25 (火) 21:30:01
  • 不勉強で申し訳ありません。
    LL <- sum(Cpp*log(Ppp)+Cdp*log(Pdp)) の間違いです。計算したかったことは対数尤度を計算したのち、optim(初期値,fn,method,…)で関数の最大化を行いたかったのです。そこで、ヘッセ行列を用いるため、x[1]としています。x[2]+x[3]=1というのは、制約条件として入れたいのですが、このような場合、どのようにすれば、この条件を満たす答えが出るか教えて頂ければ幸いです。お手数掛けます。 -- ms? 2010-05-25 (火) 22:15:02
  • x[2]+x[3]=1 が制約条件なら,x[3] を求めなきゃ良い。計算の途中で x[3] のところを (1-x[2]) とすればよいだけでは?つまり,求めるパラメータは x[1], x[2], x[4] の 3 個だけということ(順序はつめればよいが)。 -- 河童の屁は,河童にあらず,屁である。? 2010-05-25 (火) 22:26:14
  • もし x[1],x[2] 等にさらに正値等の条件が付くなら、線形不等式制約下での最適化関数 constrOptim がよいかもしれません。RjpWiki 中に解説がありますのでキーワード検索。 -- 2010-05-26 (水) 22:26:14
  • ありがとうございます。コメント頂いたとおり、x[2]x[3]は正の条件が付きます。optimで行う方法はありますでしょうか?constrOptimには、hessian はないですよね?質問ばかりですみませんが、よろしくお願いします。 -- ms? 2010-05-28 (金) 18:32:13
  • ありがとうございます。コメント頂いたとおり、x[2]x[3]は正の条件が付きます。optimで行う方法はありますでしょうか?constrOptimには、hessian はないですよね?質問ばかりですみませんが、よろしくお願いします。 -- ms? 2010-05-28 (金) 18:43:07
  • constrOptim のソースコードの optim を呼ぶところに hessian=TRUE を加える。 -- 河童の屁は,河童にあらず,屁である。? 2010-05-29 (土) 09:24:05

lme関数出力のvariance componentの標準誤差

aor? (2010-05-21 (金) 11:28:09)

いつも勉強させてもらっています。
nlmeパッケージ、lme関数を使用してマルチレベル分析の勉強をしています。
この出力のうち、 VarCorr?関数を使うと分散が出力できますが、その標準誤差を求めたいと思っています。よい方法をご存知の方がいらしたら教えていただけないでしょうか。

小野寺先生らが訳された「基礎から学ぶマルチレベルモデル」 (ナカニシヤ出版) や、石田先生らが訳された「RとS-PLUSによる多変量解析」などで勉強していますが、標準誤差を求める方法はわかりませんでした。
上記の書やインターネットでの検索をすると、「標準誤差はあまり意味がないから信頼区間を使おう」という意見があり、標準誤差の出力方法を記載しているものは見当たりませんでした。
ですが、その意見はその意見として、勉強のため標準誤差の出力方法も知りたいと考えています。
標準誤差を出力するRの方法、あるいは計算式などについて記載されている書籍やサイト (日本語か英語) についてでもお教えいただければ助かります。
どうぞよろしくお願いします。
環境はR2.11.0, Windows Vistaです。

# サンプル (lmeのヘルプから) 
library(nlme)
fm2 <- lme(distance ~ age + Sex, data = Orthodont, random = ~ 1)
summary(fm2)
VarCorr(fm2)
intervals(fm2)

行列の要素の比較について

yosshiii? (2010-05-20 (木) 16:28:42)

連続で質問です。質問ばかりですみません。
行列で

	01.txt	02.txt	03.txt
A	10	3	7
B	1	0	0
C	10	3	7

の行列があり、”A”という単語がテキスト01に10回, テキスト02に3回, テキスト03に7回出ているという意味の行列です。
そこで「A」と「C」の各テキスト毎の出現回数が等しいとき, 「A, C」をペアとして抽出するプログラムを作りたいんですけど、効率的なやり方が思い浮かびません。意見お願いします。

  • データ及びプログラムの仕様がはっきりしないのですけど,行も列ももっとたくさんあって,そのうち行方向の要素が同じ行をリストアップしなさいということでしょうか。行方向の要素が同じ行も2行とは限らず,3行以上の場合もあるし,一種類と限るものでもない,ということ?
    「効率的なやり方が浮かばない」だけで,非効率かも知れないプログラムは書けているのでしょうか?プログラムの仕様はプログラムを見れば分かるので,そのようなプログラムがあるなら,データ例と共に提示した方が,期待通りのプログラムについてのヒントが得られると思いますよ。 -- 河童の屁は,河童にあらず,屁である。? 2010-05-20 (木) 17:05:29
    以下のようなプログラム(テストデータ生成を含む)はいかが?
    #-----------テストデータ作製開始
    set.seed(12347)
    a <- data.frame(matrix(sample(3, 30, replace=TRUE), 10))
    colnames(a) <- sprintf("%02d.txt", 1:3)
    rownames(a) <- LETTERS[1:10]
    a
    #-----------テストデータ作製完了
    # 同一行の抽出
    dup <- rownames(a[duplicated(a),])
    for (i in dup) {
    	rows <- logical(nrow(a))
    	for (j in 1:nrow(a)) {
    		rows[j] = all(a[j,] == a[i,])
    	}
    	if (sum(!is.na(rows))) {
    		cat("-------------\n")
    		print(a[rows,])
    		a <- a[!rows,,drop=FALSE]
    		if (nrow(a) < 2) break
    	}
    }
    作られるデータフレーム a は以下の通り
      01.txt 02.txt 03.txt
    A      3      2      3
    B      2      1      1
    C      3      2      1
    D      3      1      1
    E      1      1      1
    F      3      1      1
    G      1      1      1
    H      3      2      1
    I      2      1      1
    J      1      1      1
    実行結果は以下の通り
    -------------
      01.txt 02.txt 03.txt
    D      3      1      1
    F      3      1      1
    -------------
      01.txt 02.txt 03.txt
    E      1      1      1
    G      1      1      1
    J      1      1      1
    -------------
      01.txt 02.txt 03.txt
    C      3      2      1
    H      3      2      1
    -------------
      01.txt 02.txt 03.txt
    B      2      1      1
    I      2      1      1
    同一行の抽出部分を以下のようにすれば,
    # 同一行の抽出
    a <- a[order(a[,1], a[,2], a[,3]),] # ここは,列数分書いてね
    n <- nrow(a)
    dup <- logical(n)
    dup[1] = all(a[1,] == a[2,])
    dup[n] = all(a[n,] == a[n-1,])
    for (i in 2:(n-1)) {
    	dup[i] = all(a[i,] == a[i-1,]) || all(a[i,] == a[i+1,])
    }
    a[dup,]
    以下のような結果になります。同じ内容を持つ行がまとめられて配置し直されます。
      01.txt 02.txt 03.txt
    E      1      1      1
    G      1      1      1
    J      1      1      1
    B      2      1      1
    I      2      1      1
    D      3      1      1
    F      3      1      1
    C      3      2      1
    H      3      2      1
  • •おぉ!!テストデータの作り方まで親切に教えて下さってありがとうございます^^また、今度からもっと具体的にプログラムの例などを載せようとおもいます^^ありがとうございました^^ -- yosshiii? 2010-05-21 (金) 17:18:00

データフレームの作成

yosshiii? (2010-05-19 (水) 12:44:00)

フォルダ内全てのテキストファイルからテキストファイル毎に固有表現の出現頻度をカウントしデータフレーム化を実装したいと思っています。以下にイメージしている実行例を載せます。
フォルダ「test」に01.txt, 02.txt, 03.txtのテキストファイルがありそれぞれ「”アリ” “スズメ”」「”アリ” “リス”」「”アリ” “ハチ”」という固有表現が書かれていたとします。これをデータフレーム化すると

	01.txt	02.txt	03.txt
アリ	1	1	1
スズメ	1	0	0
リス	0	1	0
ハチ	0	0	1

のようにしたいと思っています。
そして今現在「count」というリストにcount1?=(1 1 0 0), count2?=(1 0 1 0), count3?=(1 0 0 1) の数値をいれる所まで出来ているのですが、このリストの「count」を上記のようにデータフレーム化したいです。よって、フォルダ内のテキストファイル数が幾つであっても良いように実装したいので、意見お願いします。

  • > リストにcount1?=(1 1 0 0), count2?=(1 0 1 0), count3?=(1 0 0 1) の数値をいれる所まで出来ているのですが
    付け加えろといわれても,その部分がどのようにできあがっているのかによるので,一応全体的な例を,
    l <- list.files(pattern="*.R") # R プログラムを対象に
    n <- length(l) # 対象ファイルの個数
    res <- matrix(0, 4, n) # 行列にしておく。行数(例では4)はキーワードの種類の数
    colnames(res) <- l # 列名をファイル名に
    for (i in 1:n) { # 各対象ファイルを処理
    	x <- readLines(l[i]) # 読み取って
    	a <- c(any(grepl("function", x)), # キーワードがあれば TRUE,なければ FALSE
    		any(grepl("plot", x)), # 最終的には 1/0 になる
    		any(grepl("sqrt", x)),
    		any(grepl("print", x)))
    	res[, i] <- a # i 番目のファイルの結果は i 列へ
    }
    (res <- data.frame(res)) # データフレームに変換
    こんな風にもできるということで。 -- 河童の屁は,河童にあらず,屁である。? 2010-05-19 (水) 13:30:24
  • ホンマに助かりました!!!!^^ -- yosshiiii? 2010-05-19 (水) 14:41:07

ループを用いたPSファイルの自動生成

だいもん? (2010-05-19 (水) 12:05:32)

以下のコマンドをループでまわすことで、ポストスクリプトファイルを自動的に生成しようと試みています。(sheet, ddがループの変数に依存して替わります。)

postscript(sheet, horizontal = FALSE, paper = "special", height = 6, width = 6,colormodel="rgb")
levelplot(dd[, 4] ~ dd[,1]*dd[,2], , color=TRUE)
dev.off()

まずこのコマンドをループを遣わずに実行すると、X11()デバイスにはカラーで表示されるものが白黒のポストスクリプトファイルしか作成されません。

さらにループで複数回まわすと、全てのPSファイルが白紙(ファイルサイズ=5kb)になってしまいます。この問題については、recordPlot(), replayPlot()を用いたコードを試してみても同じ結果でした。(ただしこちらではカラーで出る。)

当方の環境はWindows XPで、R2.11.0を利用しています。お知恵を拝借できれば幸いです。

  • ループの中だけ見ても分からないのですが、Xが立ち上がるということは、コードミスなのでしょう。lapply(paste(1:10,"ps",sep="."),function(x){postscript(x);plot(1:10);dev.off()})はちゃんと出力できますか? -- akira? 2010-05-19 (水) 12:37:47
  • latticeは癖があるので, 例えば postscriptの代わりに, trellis.device を使って, -- 2010-05-19 (水) 13:28:40
    library(lattice)
    ps.options(onefile=F, paper = "special", height = 4, width = 4)
    trellis.device(postscript, color=T, file="hoge.eps")
    mm <- matrix(rnorm(8^2), 8, 8)
    levelplot(mm)
    dev.off()
    なんかかなぁ.
  • latticeを入れてみました。確かに、動作が変ですね。私の環境には負荷が大きいようで、ループとpostscriptの組み合わせはPCが不安定になりました。キレイなグラフですが、私には荷が重いみたいです。 -- akira? 2010-05-19 (水) 16:34:20
  • 白紙になるのはループ内では, plot(levelplot(mm))とかみたいにtrellisオブジェクトを明示的にplotする必要があります. -- 2010-05-19 (水) 18:06:11
  • 例えば,levelplot のオンラインヘルプの Values の項に,以下のように書かれています。
    The update method can be used to update components of the object and the print method (usually called by default) will plot it on an appropriate plotting device. -- 河童の屁は,河童にあらず,屁である。? 2010-05-19 (水) 20:24:45

ラベルに文字列+式

N/A? (2010-05-19 (水) 12:02:00)

ラベルで
coefficient β[i]
としたい場合どのようにすればよいでしょうか?

ylab="Regression function expression(beta)[i]"
ylab=parse( "Regression function",expression(beta),"[i]" )

でもできなくて案がつきました・・・
お手数をおかけしますがよろしくお願いします。

  • plot(1, ylab=expression(paste(coefficient, " ", beta, group("[", i, "]")))) -- 2010-05-19 (水) 12:34:09
  • demo(plotmath)でお勉強を -- 2010-05-19 (水) 12:44:25
  • 解答ありがとうございます! -- N/A? 2010-05-19 (水) 16:01:42
  • 良い勉強材料ありがとうございます!Rの作図に詳しくなりたかったのでちょうど良かったです -- N/A? 2010-05-19 (水) 16:03:15

R version 2.11.0のsummary.survfit関数

nene? (2010-05-17 (月) 16:54:23)

Design, Hmisc, survival,cmprskの各パッケージを読み込んだ、R 2.11.0で、とあるコード(R2.3.1で動作確認されているようです)を読み込んで実行すると、関数 "summary.survfit" を見つけることができませんでした、と表示されてしまい、うまく動きません。RSiteSearch?("summary.survfit")を行ってみると、summary.survfit関数はきちんと存在するようなのですが、現在は仕様が変わって別の関数になっているのでしょうか?R2.3.1のころの仕様変更歴なども調べてみたのですが、特に記載がありません。お手数をおかけしますがよろしくお願いします。

  • 「とあるコード」なんて,もったいぶらないで,そのコードが参照できるリンクなりを示してください。そうしないと,エラーが再現できないのでしょう?そうしないと,解決方法を探ってやろうという人も困るでしょうし。あなたがやったことを再現できるように具体的に質問することをお勧めします。
    一般的には,summary(survfit の返すオブジェクト)のように使うわけで,どうしても summary.survfit という関数を使いたい(見たい)ときには,survival:::summary.survfit とすればよいです。 -- 河童の屁は,河童にあらず,屁である。? 2010-05-17 (月) 17:04:03
  • お返事頂ける環境にないのかもしれませんが,元のコード(プログラム)の summary.survfit(xxx) となっているところを,summary(surrvfit(xxx)) と変更してやってみたらどうなるんでしょうかね?やってごらんみそ! -- 河童の屁は,河童にあらず,屁である。? 2010-05-17 (月) 21:38:09

クォート内の文字列処理

BURBUR? (2010-05-15 (土) 11:55:27)

フォルダ内のファイルを検索したい関数を実装したいのですが

> test3 <- function(x) {
	file<-list.files(path="./x")
	return(file)
}
> test3(フォルダ名)

と実行するとpath名をクオートのでくくっているため

list.files: './x' は読めないディレクトリです
というエラーメッセージが出ます。~
これを防ぐ方法を教えて下さい。~
  • なぜ,path に与えるときに "./x" としないといけないと思ったのでしょう?x は,引数でしょう?フォルダ名を渡して,そのフォルダ内にあるファイル名の文字列ベクトルを返したいのですか?
    > test3 <- function(x) {
    +     file <- list.files(x)
    +     return(file)
    + }
    > test3("foo")
     [1] "bar"     "bar2"     "bar3" ...
    とすればよいでしょう。test3 に与えるパスの指定方法はご存じのことと思いますので省略。 -- 2010-05-15 (土) 12:54:11

ディレクトリ内のファイル処理

ヨッシ? (2010-05-14 (金) 16:17:19)

perlではディレクトリ内のファイルを取得する場合
opendir my $dir, "ディレクトリのパス" or die "$!";

	while(my $name = readdir $dir){
		if($name =~ /.*\.sgml/){   #ディレクトリ内のファイルの名前
			open F1, "ディレクトリのパス/$name" or die "$!";
			my @lines = <F1>;
			
				}
			}
		}
	}
	closedir $dir;
  • 本当にごめんなさい。またまた全部書く前に投稿してしまいした。上記のperlのプログラムでは”}”の数がおかしいので申し訳ないんですが、perlでのopendir.readdir,closedirの処理と同じ動きをするRのコマンドはないのでしょうか? -- ヨッシ? 2010-05-14 (金) 16:23:52
  • ?dir -- 2010-05-14 (金) 17:09:06
  • setwd("ディテクトリのパス"); list.files()では如何? -- 2010-05-14 (金) 18:45:42
  • 助かりました^^ 貴重な意見ありがとうございます^^ -- よっし? 2010-05-15 (土) 10:22:04

2つの箱ひげ図を1つのグラフに

アロバ? (2010-05-12 (水) 09:45:56)

par(mfrow=c(1,2))
x<-c(1.12,0,6.82,23.9,17.66,2.67,6.09,0.13,5,0.36,2.07,3.1,10.79,57.29,5.14,
     107.91,80.05,0,21.66,45.33,0,57.51,103.7,40.62,110.27,77.03,203.22,85.15)
boxplot(x, names=c("x")) #箱ひげ図
y<-c(0,1.74,5.36,0,1.12,7.7,0.85,26.52,4.52,0.33,42.44,37.23,2.55,2.65,61.59)
boxplot(y, names=c("y")) #箱ひげ図
par(mfrow=c(1,1))

2種類のデータxとyを上記で入力したところ、1つのファイルの中に別々に箱ひげのグラフが出来てしまいます。
質問1;この2つのグラフを共通の縦軸のグラフにするにはどのようにすれば良いか?
質問2;それぞれのグラフの下に"x"、"y"と名前を入れる事は可能でしょうか?

ご多忙のところ大変恐縮です、よろしくお願いします。
使用環境は下記です。

R version 2.11.0 (2010-04-22) 
i386-apple-darwin9.8.0 

locale:
[1] ja_JP.UTF-8/ja_JP.UTF-8/C/C/ja_JP.UTF-8/ja_JP.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base
  • mfrowを変えずに
    boxplot(list(x=x, y=y))
    ということで良いのでしょうか? -- 2010-05-12 (水) 10:47:56
  • うひょ!、出来ました。ほんとにありがとうございました。 -- アロバ? 2010-05-12 (水) 17:12:25

Kaplan meier 生存曲線から任意の時間における生存率

jb3? (2010-05-11 (火) 21:58:13)

2つ質問があります。
datatableに

time  event group
55    0     1
23    1     1
61    1     1
12    1     1
90    0     1

以下同様に200行の生存時間timeと、イベントeventに関するデータがあるとします。
これを、読み込んで、<- datasetとして、Rの解説の本に書かれていたのを真似て、

> fitteddata <- Surv(dataset$time, dataset$event)
> sf <- survfit(fitteddata~group, data = dataset)
> plot(sf)

と実行すると、kaplan meier 生存曲線を描くことはできたのですが
質問1
もともと1グループしかないので、群分けはいらないと思い、上式の~groupを消すと

Survfit requires a formula or a coxph fit as the first argument

というエラーが出ます。単一群の生存曲線を描くのに、~groupは常に設定が必要でしょうか?
質問2
任意の時間における、kaplan meier法による生存率を計算する関数というのはあるのでしょうか?

Rを覚えたてで、2冊の解説書をみながら悪戦苦闘しています。
よろしくお願いします。

  • 質問1に対して:いつの頃からか,そのような場合には,survfit(fitteddata~1, data = dataset) のように書かなきゃなんなくなったようで。
    既出でしたね。survfitが使えませんを参照。
    解説書は古い場合もあるので,挙動が違う場合は,最新の R を使用して,オンラインヘルプをチェックすることをお勧めします。 -- 河童の屁は,河童にあらず,屁である。? 2010-05-11 (火) 22:57:50
  • 質問2に対しては,おそらくそのような関数は用意されていないでしょう. -- surg? 2010-05-12 (水) 11:21:23
    群分けをしない場合は,河童の屁は,河童にあらず,屁である。氏の指摘通り,
    sf <- survfit(fitteddata ~ 1, data = dataset)
    とすると,sf$timeが経過期間,sf$survが生存率となります.階段関数を返す関数stepfunを使うと,求める関数sは以下のように導くことができます.
    s <- stepfun(c(0, sf$time), c(1, 1, sf$surv))
    群分けをした場合は,群ごとに経過期間と生存率を切り出してから同様にすればいいでしょう.
  • ありがとうございました。質問1,2とも解決しました。ご提示いただいたとおり入力して、s(任意の時間)として実行すると、思った通りの生存率が出ます。本当にありがとうございました。 -- jb3? 2010-05-13 (木) 11:46:46

Rコマンダーでの層別化

mtk? (2010-05-09 (日) 20:52:56)

MS Windows XP sp3上でRcmdrを使っています。
ver.2.8.0では変数をcharacterに変更するだけで層別化の因子と認識されていました。
ver.2.11.0でRcmdr 1.5-4を起動したところ,これでは認識されませんでした。そこで

データ → アクティブデータセット内の変数の管理 → 数値変数を因子に変換

で指定したところ認識されました。これは仕様の変更なのかトラブルなのか分かりません。
もし仕様の変更なのでしたら層別化の便利な使い方があれば教えてください。

  • > 層別化の便利な使い方があれば
    というのは,「今まで(R-2.8.0)のようにもっと簡単な指定法はありませんか」ということですか? -- 日本語は難しい? 2010-05-10 (月) 20:59:15
  • そういう意味です。ところで「デーセットの編集」画面で日本語が文字化けしていることと関係があるのでしょうか? -- mtk? 2010-05-10 (月) 21:02:50
  • お騒がせしましたが,上記の情報は誤りで,ver.2.8.0でも数値変数を因子に変換しなければ層別化はできません。SPSSか何かと混同していました。すみませんでした。 -- mtk? 2010-05-11 (火) 18:16:44

R commderの適合性検定

sousou? (2010-05-07 (金) 15:55:04)

Rcmdrで適合性検定を行いたいですが、どうやってもうまく行かなかったんですが、どなたが助けていただけませんか?
操作手順は分かりますが(統計量→要約→頻度分布→カイ2乗適合度検定)、例えば、AとBの選択者が同じかとうかを検討することとしますが、Aの選択者は127名で、Bの選択者は71名です。Rcmdrでどのように操作するのかを教えていただければありがたいですが、よろしくお願いします。

  • どのようにやってうまくいかなかったのか分かりませんね。分析対象の変数を指定するウインドウで「カイ2乗適合度検定」にチェックを入れて OK ボタンをクリックし,次の画面の"Hypothesized pobabilities: に確率(分数でよい)を入れて,OK ボタンを押すだけで,結果は出ますけど? -- 河童の屁は,河童にあらず,屁である。? 2010-05-07 (金) 15:57:44
  • 素早く返事いただき、ありがとうございます。おそらくデータの入力が間違っているかもしれませんが、私の場合はval1(character型)のところにA,Bを入力し、var2(numeric型)のところにそれぞれ127と71を入力しましたが、Chi-squared approximation may be incorrectというメッセージが出てきました。どこが間違っているのでしょうか?教えていただければ幸いです。 -- sousou? 2010-05-07 (金) 16:19:42
  • 使い方が間違っているのでは?
    あなたのデータでは,
    X-squared = 15.8384, df = 1, p-value = 6.899e-05
    となるはず。以下の例をご覧じろ。 -- 河童の屁は,所詮屁である。? 2010-05-07 (金) 16:20:28
    example999.png
  • なるほど、つまり私の例だと、val1のところにAを127回、Bを71回を入力すればいいですよね。ありがとうございました。ただもう1つお伺いしたいですが、SPSSではval1(character型)のところにA,Bを入力し、var2(numeric型)のところにそれぞれ127と71を入力して、最後にvar2のデータの重み付けをすれば同じく結果が出ますが、Rcmdrではこのような使い方はありますでしょうか? -- sousou? 2010-05-07 (金) 17:04:02
  • > val1のところにAを127回、Bを71回を入力すればいいですよね
    A, B の個数が分かっているときは,そんな面倒なことは誰もしませんよね。それに Rcommander なんかも使う必要はなく,chisq.test(c(127, 71), p=c(0.5, 0.5)) ですむ話です。chisq.test を binom.test にすれば,正確な検定もできることですし。-- 河童の屁は,河童にあらず,屁である。? 2010-05-07 (金) 18:02:08
  • ご親切でありがとうございました -- sousou? 2010-05-07 (金) 18:24:24

シェルスクリプト上でRによる解析

まさお? (2010-05-07 (金) 15:51:27)

シェルスクリプト上でRによるさまざまな処理を行うには,どうしたらよいのでしょうか?

#!/bin/csh
R 
でRは起動するんですけれど,そこで止まってしまいます.R内のコマンドはシェルスクリプト内でどのように書けばよいのでしょうか.

  • シェルスクリプトに書かなくてもよいということならば,以下のようにすれば同じことができるのではないでしょうか。 -- 河童の屁は,所詮屁である。? 2010-05-07 (金) 16:30:36 やりたいこと(R プログラムを書いておく)
    foo [11] > cat script
    x <- 0
    for (i in 1:5) x <- x+sqrt(i)
    print(x)
    それを動かす
    foo [12] > R --vanilla --silent --fiile=script
    > x <- 0
    > for (i in 1:5) x <- x+sqrt(i)
    > print(x)
     [1] 8.382332
    出力は,ファイルに出したりする方がよいでしょうけど。
  • ヒアドキュメントが書きたいんでしょうかね。 2行目のEOFから最後のEOFの間にRスクリプトを入れます。
    #!/bin/bash
    R --slave --vanilla << EOF
    jpeg("plot.jpg")
    plot(sin, xlim=c(0,2*pi))
    EOF
    詳細は高階さんの『プログラミングR』を買いましょう。 -- 2010-05-08 (土) 07:33:39
  • Rscriptを読まれて、さらにgetoptパッケージを導入されると、シェルスクリプトまたはRスクリプトの幅が広がると思います。シェルスクリプトの場合は、Rscriptのeオプションのあとにコマンドを書いていけばOKです。sedなどと同じ感覚で使うことが出来ます。また、Rスクリプトの場合だと、例えば先頭に#!/usr/bin/Rscriptと書いて実行ファイルにするのもありです。 -- 谷村 2010-05-10 (月) 13:58:45

linuxでR

さっこ? (2010-05-07 (金) 12:07:39)

linux(GNU)にRを無事make installできたのですが(suで,/usr/local/r-2.10.1/に),RとタイプしてもRが起動しません(自分のusernameで).cshrcなどに何らかのパスを通す必要があるのでしょうか?

  • /usr/local/r-2.10.1/R とやって起動するようなら,パスが通っていないのでしょう。
    パスを通してもよいし,既にパスの通っているところからシンボリックリンクを張るなど。 -- 河童の屁は,河童にあらず,屁である。? 2010-05-07 (金) 15:12:21
  • どうもありがとうございました。 -- さっこ? 2010-05-07 (金) 15:36:56

Rでのファイル操作と繰返し文

きりんさん? (2010-05-04 (火) 11:17:02)
 Rで統計解析を行い,その結果をそれぞれの物質名ごとのファイルに格納するちょっとしたツールを作成しています.
これにループ処理を用いて,完成させたいのですがdir.create(“Ala”)などの「“”」に囲まれた部分を配列に置き換えるなどの操作が出来ずに困っています.
 他のプログラミング言語を用いずにRのみで行う方法はないでしょうか?
 拙い質問ではありますが,ご教授のほどを宜しくお願い致します.

データフレーム(ROC_table1.csv)
	Ala	Ethanolamine phosphate	Hypotaurine	Pro	Uridine	Glycolate
C	551.6935	29.13754	16.681	    173.8867	45.10912	50.05477
C	607.481	        0	13.91893	168.1533	42.37981	84.32064
C	506.6699	28.35182	16.64904	159.7178	43.60009	299.7703
C	530.9984	20.93959	11.42694	236.6067	42.33055	0
C	466.6074	19.3733	    14.7419	    176.2133	41.44249	180.9834
C	532.253	    18.66473	12.15251	172.6138	40.66632	181.5452
C	449.6792	9.951401	11.69104	130.8715	47.65735	0
C	403.2724	19.33708	0	    155.0835	47.37078	230.7595
C	423.5579	19.48771	11.05998	140.1291	38.48613	238.7741
C	463.7251	23.312	        0	126.3421	43.01137	248.8566
C	465.0218	28.58722	10.97927	137.6295	37.42445	177.0466
C	485.2845	35.14039	7.268277	143.0229	37.97251	223.5736
D	707.1228	25.1555	    11.25501	237.0575	37.70653	278.061
D	658.9739	31.52341	14.1557	    197.7347	33.66692	312.7555
D	475.4444	31.67994	11.48172	132.5917	41.70935	545.9441
D	613.6305	23.5282	    12.38427	164.597	    41.24212	63.77056
D	545.5581	33.57919	21.21189	174.7159	43.30637	419.7285
D	848.2421	32.92102	16.18306	248.8493	30.06797	402.9233
D	507.675	    25.12478	17.90848	185.7012	36.81457	315.3726
D	528.8479	20.10386	17.13785	196.1179	40.02536	126.3903
#データの読み込み
x <- read.csv("ROC_table1.csv", header=T)
data.frame(x)

#ROCソースコード
source("http://aoki2.si.gunma-u.ac.jp/R/src/ROC.R", encoding="euc-jp")

#患者群データを格納
Dise <- (x$X=="D")
disease.x <- x[Dise,"Ala"]

#健常者群データを格納
Cont <- (x$X=="C")
normal.x <- x[Cont,"Ala"]

#物質名のフォルダを作成
dir.create("Ala")

#新規フォルダへのディレクトリ変更
Direct <- getwd()
Direct1 <- paste(Direct,"Ala",sep = "/")
setwd(Direct1)

#フォルダに計算結果を格納
RR <- ROC0(disease.x, normal.x)
write.table(RR, file="Ala.data", sep="\t", row.names=FALSE, quote=FALSE)

#フォルダに図を格納
bmp(filename = "Ala.bmp", width = 480, height = 480)
ROC0(disease.x, normal.x)
dev.off()

#ディレクトリを元へ戻す
setwd(Direct)
  • eval と parse 関数を調べると良いでしょう。以下のようなプログラム片が参考になると思います。 -- 河童の屁は,河童にあらず,屁である。? 2010-05-04 (火) 20:25:32
    Name <- "Ala"
    eval(parse(text=paste("dir.create('", Name, "')", sep="")))
  • 関数の使用例まで教えて頂き,ありがとうございます.おかげさまで,Rの新たな記述法を知ることが出来ました. -- きりんさん? 2010-05-05 (水) 18:12:00

新しい目盛りとかぶる

さつまいも? (2010-05-03 (月) 20:23:20)

初めにヒストグラムを作ってから、X軸の目盛りを変えると最初の目盛りとかぶってしまいます。
どうしたら最初の目盛りを消すことができますか?

  • よく状況が分かりませんが,最初にヒストグラムを描くときに,hist(x, xaxt="n") として,x 軸のラベルを描かないようにしておけばよいのではないでしょうか。 -- 河童の屁は,河童にあらず,屁である。? 2010-05-03 (月) 21:25:31
  • 状況の説明不足申し訳ありません。河童の屁は,河童にあらず,屁である。さんのおっしゃる通りにやったところ最初の目盛りを消すことができました!!ありがとうございます。 -- さつまいも? 2010-05-03 (月) 21:39:41

英語でテキストマイニングをする方法。語の頻度,形態素について

ピースケ? (2010-04-29 (木) 17:51:37)

英語でテキストマイニングをする方法を探しています。。語の頻度,形態素について分析するパッケージはありますでしょうか。

  • いっぱいあると思うんですけど。関連する教科書(書籍)もたくさん出ていますよね?R本リスト -- 河童の屁? 2010-04-29 (木) 20:56:07
  • ※コメントありがとうございます。日本語は,書籍が見かけたのですが,意外に英語のものがないです。※情報過多の時代なので,良質な情報をヒットさせることが,難しい時代ですね。 -- ピースケ? 2010-04-29 (木) 22:01:30
  • http://bit.ly/azDxgi -- 2010-04-30 (金) 10:00:21
  • コメントありがとうございます。誠に感謝致します。 他にもありましたら,大歓迎です。 -- ピースケ? 2010-04-30 (金) 14:20:28
  • ↑↑のリンクのCRAN Task View: Natural Language Processingにほとんど必要な物ははいってると思うよ -- 2010-05-01 (土) 07:10:20
  • アドバイスありがとうございます。 -- ピースケ? 2010-05-02 (日) 13:53:26

R-2.11.0でtcltkウィジェットの日本語が文字化け

せーだ? (2010-04-29 (木) 12:19:03)

Win7 Pro/WinXP Pro SP2を使っています。
R-2.11.0で両方とも再現しましたので投稿します。

以下のサンプルは、R-2.10.1までは問題なく動作していました。
しかし、2.11.0では、コンボボックス内の日本語だけが文字化けします。

require(tcltk)
tclRequire("BWidget")
tt <- tktoplevel()
tkgrid(tklabel(tt,text="好きな果物は?"))
fruits <- c("林檎","蜜柑","バナナ","梨")
comboBox <- tkwidget(tt,"ComboBox",editable=FALSE,values=fruits)
tkgrid(comboBox)

OnOK <- function()
{
    fruitChoice <- fruits[as.numeric(
          tclvalue(tcl(comboBox,"getvalue")))+1]
    tkdestroy(tt)
    msg <- paste(fruitChoice,"は美味しいよね",sep="")
    tkmessageBox(title="Fruit Choice",message=msg)
}
OK.but <-tkbutton(tt,text="   OK   ",command=OnOK)
tkgrid(OK.but)
tkfocus(tt)

2.11.0の新機能説明の項目の中に

Package tcltk now sends strings to Tcl in UTF-8: this means
that strings with a marked UTF-8 encoding are supported in
non-UTF-8 locales.

とあったので、これが影響しているのでしょうか。
また、このような文字化けは、BWidgetやTktable等、Tcl/Tkの拡張ライブラリに由来するウィジェット全般に発生しているのではないかと思います(Tktableでも、2.11.0ではセル中の日本語が化けました)。

もし対処法をご存知の方がいらっしゃれば、ご教示頂きたく存じます。
宜しくお願い致します。

  • 51862以降は直ってるはず -- 2010-04-30 (金) 12:16:03
  • ありがとうございます。対応するR-2.11.0patがリリースされたら確認したいと思います。 -- せーだ? 2010-04-30 (金) 13:48:57
  • r51867をDLし、直っていることを確認しました。御礼申し上げます。 -- せーだ? 2010-05-01 (土) 12:19:01

エラー処理

josephine? (2010-04-28 (水) 18:34:02)

大量のデータをS-W検定するスクリプトを作っています。
不適当な標本データが原因のS-W検定のエラーを上手く処理して結果をファイルに出力させたいのですが、try()では上手くゆきませんでした。

入力が適切な例

> a
[1] 0 0 0 1 0 0 0
> try(shapiro.test(a), silent=TRUE)

        Shapiro-Wilk normality test

data:  a 
W = 0.453, p-value = 4.136e-06

> s_shapiro_a <- try(shapiro.test(a), silent=TRUE)
> s_shapiro_a

        Shapiro-Wilk normality test

data:  a 
W = 0.453, p-value = 4.136e-06

入力が不適切な例

> b
[1] 0 0 0 0 0 0 0
> s_shapiro_b <- try(shapiro.test(b), silent=TRUE)
> s_shapiro_b
[1] "Error in shapiro.test(b) : all 'x' values are identical\n"
attr(,"class")
[1] "try-error"

try-errorの場合にはNAをs_shapiro_bに代入したいのですが、恐れ入りますが、アドバイスを頂けないでしょうか?よろしくお願いいたします。

  • おそらくここここが参考になるのでは?あと、とても醜いので整形してね -- akira? 2010-04-28 (水) 19:19:50
  • 別解として,Shapiro.Wilk.test <- edit(shapiro.test) として,3箇所ある stop("...") を return(NA) に書き換える。1箇所の stopifnot(...) を if (!is.numeric(x)) return(NA) にする。
    この方法だと,無駄な出力(タイトルとかデータの表示とか)をしないようにすることもできる。 -- 河童の屁? 2010-04-28 (水) 22:10:35
    > Shapiro.Wilk.test(letters) # 数値データでない
    [1] NA
    > Shapiro.Wilk.test(c(1, 2)) # 少なすぎるデータ
    [1] NA
    > Shapiro.Wilk.test(c(1, 1, 1, 1, 1, 1)) # 全部同じデータ
    [1] NA
    > Shapiro.Wilk.test(rnorm(10000)) # 多すぎるデータ
    [1] NA
    > Shapiro.Wilk.test(c(1, 4, 3, 6)) # 妥当なデータ
    
    	Shapiro-Wilk normality test
    
    data:  c(1, 4, 3, 6) 
    W = 0.9984, p-value = 0.995
  • ご親切に教えて頂きありがとうございます。取り合えずはs_shapiro_b <- tryCatch(shapiro.test(b),error=function(e) "NA")として事が足りそうです。関数自体を書き換える方法もあるとは大変勉強になります。どうもありがとうございました。 -- Josephine? 2010-05-10 (月) 08:43:02

contourplotを白黒で書きたい

orange? (2010-04-26 (月) 16:32:03)

グラフィックス参考実例集にあるcontourplot("Cube Root Ozone (cube root ppb)"と同様な等高線図を,色付き(赤←→緑)ではなく,白黒で描きたいのですが,どのようにすればよいでしょうか.どなたかお教え頂けないでしょうか.よろしくお願いします.

  • ?contourplotでcol.regionsが答えでは? -- akira? 2010-04-26 (月) 19:54:48
  • すみません.素人なもので.col.regions = trellis.par.get("regions")$col) どのように修正すればいいのか.よろしくご教授お願いします. -- orange? 2010-04-26 (月) 20:35:42
  • そうですね〜。カラーで書かれた図をお絵かきソフトで読み込んで,モノクロ化するのが宜しいのでは(^_^;)。モノクロプリンタで印刷しても良いだろうし。モノクロ・ゼロックスしても良いかな。
    まあ,意地悪だと思われるのも業腹だから,contourplot の example の最後の例で,以下のようなしてみればいかが。
    require(stats)
    attach(environmental)
    ozo.m <- loess((ozone^(1/3)) ~ wind * temperature * radiation,
           parametric = c("radiation", "wind"), span = 1, degree = 2)
    w.marginal <- seq(min(wind), max(wind), length.out = 50)
    t.marginal <- seq(min(temperature), max(temperature), length.out = 50)
    r.marginal <- seq(min(radiation), max(radiation), length.out = 4)
    wtr.marginal <- list(wind = w.marginal, temperature = t.marginal,
            radiation = r.marginal)
    grid <- expand.grid(wtr.marginal)
    grid[, "fit"] <- c(predict(ozo.m, grid))
    contourplot(fit ~ wind * temperature | radiation, data = grid,
                cuts = 10, region = TRUE,
                xlab = "Wind Speed (mph)",
                ylab = "Temperature (F)",
                main = "Cube Root Ozone (cube root ppb)",
                col.regions=gray(seq(0, 1, by=0.01))) # これを加える之事よ gray もオンラインヘルプでね
    detach()
    前の人の回答は,あなたに対して「オンラインヘルプで contourplot の col.regions 引数について調べたらいかがでしょ?」と言っているわけですよ。それに対して「素人でなもので〜」はないでしょう(^_^;) -- 河童の屁? 2010-04-26 (月) 22:43:02
  • akiraさん,河童さん,ありがとうございました.河童さんに教えて頂いた通りに入力したらできました.お手数おかけして申し訳ございませんでした.親切にアドバイスして頂きまして本当にありがとうございました. -- orange? 2010-04-26 (月) 23:37:26

計算結果の抽出方法

uribo? (2010-04-25 (日) 22:43:10)

forループで計算を1000回繰り返したのですが、その計算結果の最後の値だけを1000個分抽出する式をつくりたい場合どうすればよいでしょうか?
恐らく意、はじめのforループ計算の値の最後の値のみを出す式を1000回繰り返すとはおもうのですがその最後の値の抽出方がわかりません。もしよろしければどなたかご教授お願いいたします。

  • よく分かりませんが,for の最後の答えを取り出すのは,for の毎回の答えをスカラーに格納していれば,for の最後の答えはそのスカラーに格納されているものでしょう。そのようなことを何回か繰り返すのは replicate を使えばよいでしょう。 -- 河童の屁? 2010-04-25 (日) 23:01:46
    > func <- function(n)
    + {
    + 	for (i in 1:n) {
    + 		x <- rnorm(1)
    + 	}
    + 	return(x)
    + }
    > replicate(100, func(sample(10, 1)))
      [1]  0.19487424  1.39857201  0.97981611 -0.45801807  0.36414608
      [6] -0.95167954 -1.96734801  1.77910267 -0.51803260  0.91834117
              途中省略
     [91]  0.76621199  0.66828262  1.04878517  0.12996552 -0.81528159
     [96]  2.47874580 -0.39178534  0.73668553  1.81568251  1.36909985
  • スカラーというのは[]のことでしょうか?replicateですか、なるほど。 -- uribo? 2010-04-25 (日) 23:59:57
  • ふつうの変数のこと(例では x)ですよ。 -- 河童の屁? 2010-04-26 (月) 10:47:10

多次元項目反応理論のパッケージ

totoro? (2010-04-24 (土) 00:33:22)

Rで多次元項目反応理論(多次元IRT)または多次元カテゴリカル因子分析をしたいのですが、パッケージはありますでしょうか?

解析例などを示しているページがありましたら、教えていただけると幸いです。

  • MCMCpackの中にMCMCirtKd? というK次元IRTがあるのを見つけました。MCMCではなく、周辺最尤法で推定できる関数はないでしょうか? -- totoro? 2010-04-24 (土) 01:56:32

latticeで縦軸目盛の位置を左にそろえたい

itok? (2010-04-19 (月) 20:46:34)

VistaでR-2.8.0を使っております。最近latticeを勉強しております。
教科書の例題に以下のようなヒストグラムがありました。

data(Chem97, package = "mlmRev")
library(lattice)
histogram(~gcsescore | factor(score), data = Chem97)


出力をみると、縦軸目盛が、1行目では右に、2行目では左についています。
他の例題をみても、このように互い違いになるのが標準設定のようです。
希望としては、両方の行で、縦軸目盛を左に統一したいのですが、可能でしょうか。
ヘルプを読んでみましたが、どのパラメータを設定すればよいのかわかりませんでした。
どうかよろしくおねがいいたします。

  • わたしは,lattice なんて嫌いで,使ったこと殆どないけど。
    histogram(~gcsescore | factor(score), data = Chem97, scales=list(alternating=FALSE))
    scales パラメータの alternating 要素についての説明をご参照ください。
    このような出力でよろしいんですよね? -- 河童の屁? 2010-04-19 (月) 21:04:22
    henokappa.png
  • ありがとうございました!そうです。そのとおりです。scales勉強してみます。 -- itok? 2010-04-19 (月) 21:48:04

主成分分析のスコアプロットでグループごとに色分けできますか?

にわか? (2010-04-18 (日) 00:35:23)

主成分分析のスコアプロットで、データのグループごとに色分けして表示させたいのですが、可能でしょうか?
irisで
.PC <- princomp(~PL+PW+SL+SW, cor=TRUE, data=iris)
scoreplot(.PC,labels="names",cex=0.7,col=2)
このようにラベル表示はできるのですが、グルーピングが分かりやすいようにデータの1:50と51:100、101:150を色分けして表示できるとありがたいのです。
どなたかご教示頂けたら助かります。
よろしくお願いします。

  • scoreplot ってどのパッケージにあるんだろうか。また,PL だの PW だのの略語は分からないことはないけど,どのパッケージで有効な略語なんだろう。。「よく見るひと」がクレーム付けるかもしれんけど(よく見ているなら,たまには答えてあげればよいのにね),追試できるように書いてね。まあ,col=rep(1:3, each=50) のようにすればよいわけです。つまり,描画色もベクトルで指定できると言うこと。plot で指定できる大部分が,ベクトルで指定できるんですよ。 -- 河童の屁も一日中垂れ放し? 2010-04-18 (日) 19:37:49
  • 回答頂き有難うございました。変な省略形で書いてしまい申し訳ありません。察しのとおりirisのデータ項目のPertal.Lengthなどのことです。 また、scoreplotはパッケージplsのもののようです。pls解析で使っていて、そのままprincompのオブジェクトにも使ってしまって作図ができたものですから、意識せずに使えるものと思いこんでいました。申し訳ありませんでした。 plotのベクトル指定、大変勉強になりました。有難うございました。 -- にわか? 2010-04-20 (火) 22:29:49

GLMでLSMEANの計算

Kita? (2010-04-14 (水) 15:33:17)

SASの場合、GLM解析を行った場合、Least Square Mean(LSMEAN)が計算されるとしていますが、RでLSMEANを求めるためにはどうすればいいのですか?

よろしくお願いします。

  • 残差平方和のことですね?残差は出るので、それを二乗して出せばよいかと思います。-- Saito? 2010-04-14 (水) 16:01:11
    > a <- rnorm(100)
    > b <- rnorm(100)
    > res <- glm(b ~ a)
    > summary(res)
     Call: glm(formula = b ~ a)
     Deviance Residuals:
          Min        1Q    Median        3Q       Max
      -2.41666  -0.58843   0.03412   0.62652   1.93350   
    Coefficients:    
                  Estimate Std. Error t value Pr(>|t|)
    (Intercept) -0.04376    0.09761  -0.448    0.655
    a            0.07966    0.10726   0.743    0.459 
    (Dispersion parameter for gaussian family taken to be 0.9520184)     
        Null deviance: 93.823  on 99  degrees of freedom
    Residual deviance: 93.298  on 98  degrees of freedom
    AIC: 282.85
    Number of Fisher Scoring iterations: 2  
    > names(res) 
    [1] "coefficients"      "residuals"         "fitted.values"     
    [4] "effects"           "R"                 "rank"              
    [7] "qr"                "family"            "linear.predictors"
    [10] "deviance"          "aic"               "null.deviance"    
    [13] "iter"              "weights"           "prior.weights"    
    [16] "df.residual"       "df.null"           "y"                
    [19] "converged"         "boundary"          "model"            
    [22] "call"              "formula"           "terms"            
    [25] "data"              "offset"            "control"          
    [28] "method"            "contrasts"         "xlevels"          
    > sum(res$residuals^2)
    [1] 93.2978
  • Residual deviance: 93.298 というところに出ているのが,知りたい数値では?
    glm が返すオブジェクトの deviance 要素に入っています。上の実行例では res$deviance -- 屁の河童? 2010-04-14 (水) 16:29:42
  • ご返事ありがとうございます。Residual devianceとは違います。SASでのLSMEANというのは、一般化線形モデルで計算する際、説明要因どうしの交互作用を表すものです。 -- Kita? 2010-04-14 (水) 19:51:36
  • あぁ、よく考えたら残差平方和は"Sum of Square"でしたね。知りたいのは交互作用の項なのですか?だとすれば、
    > a <- rnorm(100)
    > b <- rnorm(100)
    > c <- rnorm(100)
    > res <- glm(b ~ a*c)
    > summary(res)
    
    Call:
    glm(formula = b ~ a * c)
    
    Deviance Residuals: 
         Min        1Q    Median        3Q       Max  
    -2.26867  -0.54240  -0.08402   0.54603   2.49951  
    
    Coefficients:
                Estimate Std. Error t value Pr(>|t|)
    (Intercept)  0.03420    0.08595   0.398    0.692
    a           -0.12119    0.09144  -1.325    0.188
    c            0.06217    0.08400   0.740    0.461
    a:c          0.04987    0.08823   0.565    0.573
    
    (Dispersion parameter for gaussian family taken to be 0.7136645)
    
        Null deviance: 70.126  on 99  degrees of freedom
    Residual deviance: 68.512  on 96  degrees of freedom
    AIC: 255.97
    
    Number of Fisher Scoring iterations: 2
    これで交互作用項a*cが出ています。-- Saito? 2010-04-14 (水) 20:25:55
  • 既出でしたね。ここにありますよ -- 河童の屁? 2010-04-14 (水) 22:20:31
  • 河童の屁さんから教わったところで問題解決しました。どうも有難うございました。 -- Kita? 2010-04-15 (木) 23:55:41

すでにCRANから消えたパッケージをインストールする方法について

Saito? (2010-04-08 (木) 23:03:40)

下のほうで、adapt関数以外で重積分をする方法についてで質問した者です。
少し前の話ですので、新しく質問をさせていただきました。

あれから色々と勉強して、以下のようなサイトを見ながらやっていたのですが、どうにも巧くいきません。
http://www.okada.jp.org/RWiki/?RcmdrPlugin%C4%B6%C6%FE%CC%E7
http://www.okada.jp.org/RWiki/?%BB%E4%C5%AA%A5%D1%A5%C3%A5%B1%A1%BC%A5%B8%BA%EE%C0%AE%CB%A1
http://www.okada.jp.org/RWiki/?Windows%A4%C7R%A4%CE%A5%D1%A5%C3%A5%B1%A1%BC%A5%B8%A4%F2%BA%EE%C0%AE%A4%B9%A4%EB

まず今回はすでにあるtarファイルを使いますので、最初から作る必要はないと考え、adaptパッケージのtarファイルをこのサイトから直接C直下にダウンロードしました。そしてコマンドプロンプトに

cd c:\
R CMD INSTALL adapt_1.0-4.tar.gz

としましたが、以下のようなメッセージが出てしまい先に進めません。

c:\>R CMD INSTALL adapt_1.0-4.tar.gz
* installing to library 'C:\Users\Saito\Documents/R/win64-library /2.11'
* installing *source* package 'adapt' ...
** libs
  DLLフャ...
x86_64-w64-mingw32-gfortran     -O2  -c adapt.f -o adapt.o
make: x86_64-w64-mingw32-gfortran: Command not found
make: *** [adapt.o] Error 127
   ... ョケ
ERROR: compilation failed for package 'adapt'
* removing 'C:\Users\Saito\Documents/R/win64-library/2.11/adapt'
* restoring previous 'C:\Users\Saito\Documents/R/win64-library /2.11/adapt'


これはフォートランの命令が読めない、というメッセージなのでしょうか?文字化けも気になるのですが・・・。ちなみにPathは、

c:\>Path
PATH=c:\Rtools\bin;c:\Rtools\perl\bin;c:\Rtools\MinGW\bin;
C:\Program  Files (x86)\HTML Help Workshop;
C:\Program Files\R \R-2.11.0alpha-x64\bin;
C:\Program Files (x86)\MiKTeX 2.8\miktex \bin;
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;
C:\Windows\System32\WindowsPowerShell\v1.0\

となっています。

ちなみにOSはWindows7、Rのバージョンは、R-2.11.0alpha-x64となっています。何か64bit版特有のことをしないといけないのでしょうか。fortranは持っていませんので、買えと言われても少し困ってしまいます。
自分では手詰まりになってしまって、解決できませんでした。もし何か解決策をご存知でしたら、教えていただけると幸いです。

どうぞよろしくお願いいたします。

  • 早速の回答ありがとうございました。(あれ?消えてしまいました?)
    すぐにコンパイルで調べたら他にもこのようなサイトも発見することができました。ありがとうございます。
    しかし、あり得ないことだと思うのですが、教えていただいたサイトやここに書いてあるようにこのサイトからmingwの最新版をダウンロードして解凍を行っても、binファイルが存在しません。
    要はexeファイルが見つかればいいのかと思い、解凍したフォルダの中も漁ったのですが、見落としただけなのか本当にないのかわかりませんが、見つけられませんでした。
    ちなみにperlやgccはRtoolに入っていますし、64bit版だと新しくインストールしなければならないとは調べた限り書いていないので大丈夫だと思うのですが・・・。
    ちなみに今のPathは
    c:\>Path
    PATH=C:\mingw\mingw-w64-crt;C:\mingw\bin;C:\msys\1.0\bin;c:\Rtools\bin;c:\Rtools\perl\bin;
    c:\Rtools\MinGW\bin;C:\Program Files (x86)\HTML Help  Workshop;C:\Program Files\R\R-2.11.0alpha-x64\bin;
    C:\Program Files (x86)\MiKTeX 2.8\miktex\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;
      C:\Windows\System32\WindowsPowerShell\v1.0\
    と、少しづつ汚くなってきています…。

もし何かお気づきの点がありましたら、ご助言いただけると幸いです。 -- Saito? 2010-04-09 (金) 00:12:37

  • Command not found って、x86_64-w64-mingw32-gfortranてのが無いんだけど?って言ってるのでは?手でたたけば出てきますか? -- のざわ? 2010-04-14 (水) 09:08:28
  • ご助言ありがとうございます。手でたたくとは、具体的にどのようなコマンドのことを指しますか?ちなみに、上記パスにある、
    c:\Rtools\MinGW\bin
    の中にはgfortranというファイルは置いてあるのですが…。試しに、x86_64という名前のフォルダをC直下に作って、w64というフォルダをさらにその中に作り、そしてmingw32をその中に作ったあと、c:\Rtools\MinGW\binの中にあった、gfortranを持ってきたのですが、それでもダメでした。もちろんパス設定を変えて再起動したあとです。
    PATH=C:\x86_64\w64\mingw32;C:\mingw\mingw-w64-crt;C:\mingw\bin;C:\msys\1.0
    \bin;c:\Rtools\bin;c:\Rtools\perl\bin;c:\Rtools\MinGW\bin;C:\Program Files
    (x86)\HTMLHelp Workshop;C:\Program Files\R\R-2.11.0alpha-x64\bin;C:\Program  
    Files (x86)\MiKTeX 2.8\miktex\bin;C:\Windows\system32;C:\Windows;C:\Windows
    \System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\
    すみません、いまだに解決していません。まだ何かお気づきの点がありましたら、ご助言ください。 -- Saito? 2010-04-14 (水) 14:34:13
  • コンソールのプロンプトに対して gfortran と入力したらどうなりますか。また、R と入力して R が立ち上がりますか。 -- やってみました河童の屁? 2010-04-14 (水) 15:39:59
  • ご助言ありがとうございます。Rは立ち上がります。以下がその様子です
    C:\Users\Saito>R
    
    R version 2.11.0 alpha (2010-04-06 r51611)
    Copyright (C) 2010 The R Foundation for Statistical Computing
    ISBN 3-900051-07-0
    
    RヘAゥRネ\tgEFAナAuョSノウロリvナキB
    フノ]ヲホAゥRノアトzzキアニェナォワキB
    zzフレラノヨオトヘA'license()'「ヘ'licence()'ニヘオトュセウ「B
    
    Rヘスュフv」メノ、ッvWFNgナキB
    レオュヘ'contributors()'ニヘオトュセウ「B
    ワスARRフpbP[Woナィナpキロフ`ョノツ「トヘ
    'citation()'ニヘオトュセウ「B
    
    'demo()'ニヘキホfンアニェナォワキB
    'help()'ニキホICwvェoワキB
    'help.start()'ナHTMLuEUノwvェンワキB
    'q()'ニヘキホRIケオワキB
    
    > rnorm(10)
     [1] -0.8424220 -0.4483672 -1.2258821  0.1038380 -0.8283102 -0.5972562
     [7]  0.1248794 -1.9883918  0.2761847  1.2740648
    >
    ただ、gfortranとやると、
    C:\Users\Saito>gfortran
    gfortran: no input files
    と出てしまいます。Pathがうまくつながっていないのでしょうか? -- Saito? 2010-04-14 (水) 15:45:19
  • no input files というのは、コマンドの後にコンパイルすべきファイルの指定がないというだけのことですから、ちゃんとパスも通っていますね。R にもパスが通っているので、問題ないでしょう。
    私の場合,Rtools をインストールし,path に R へのパスを追加し,adapt_1.0-4.tar.gz を普通にダウンロードして(ダウンロードディレクトリに入った),コンソールを開き,Downloads ディレクトに行って,R CMD INSTALL adapt_1.0-4.tar.gz で,以下のようにインストールできましたけど。
    64ビット版を作ろうとしているのでしょうか?そうであったとしても,まずは Rtools のインストールをやり直して(パスなども弄らずに),新たにやってごらんになるとよいのかも知れませんね。
    なお,実行例2行目にも書いてありますが,adapt.dll は,マイドキュメント>R>win-library>2.10>adapt>libs の中にできます。 -- 河童の屁? 2010-04-14 (水) 15:57:09
    install-adapt.png
  • ご助言ありがとうございます。しかし、何度も再起動、アンインストールを繰り返したのですがなんだかダメダメです…。以下がエラーメッセージです。
    C:\Users\Saito\Downloads>R CMD INSTALL adapt_1.0-4.tar.gz
    * installing to library 'c:/PROGRA~2/R/R-210~1.1/library'
     G[F  G[FfBNgヨフCXg[ツェワケ  'c:/PROGRA~2 /R/R-210~1.1/library'
    一応河童の屁さんの言うとおり、Rtoolsを再インストールして、パスはいじらずに(ただし以下のPathのように自動生成される分は放置)、ダウンロードに移動して、R CMD INSTALL adapt_1.0-4.tar.gzと命令したのですが…。
    ひょっとしたら64bitに入れるのがそもそもムリなんじゃないかと思い、現在はR-2.10.1で試していますが、文字化けエラーしか出てきません。しかし、2.11.0 alphaのときとはエラーメッセージが違うことはわかりました。
    以下が現在のパスです。もちろんRやgfortranと打てば、上記のようにちゃんと動作しています。
    PATH=c:\Rtools\bin;c:\Rtools\perl\bin;c:\Rtools\MinGW\bin;c:\Program Files 
    (x86)\R\R-2.10.1\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;
    C:\Windows\System32\WindowsPowerShell\v1.0\
    環境はWindows7なのですが、もしよろしければうまく行った動作環境を教えていただけませんか? -- Saito? 2010-04-14 (水) 20:13:44
  • 失礼しました,Saito さんは x64 R-2.11.1 Pre-release にインストールしようとしているんですか。x64 でなくてはならないですか。 -- 屁の河童? 2010-04-14 (水) 20:49:55
  • いえいえ。動作確認していただいて本当にありがとうございます。できれば64bit版にインストールしたいと思っています。なくてはならないですかと言われると、
    将来的にはやはり(私個人の利用する範囲で)なくてはならないことになるのではと予測しております。お手数をおかけしております。どうぞよろしくお願いいたします。 -- Saito? 2010-04-14 (水) 20:55:51

相関行列からクラスタ解析

KM? (2010-04-07 (水) 16:28:46)

相関行列を類似度行列としてクラスタ解析したいと考えています。
hclust()にas.dist(x)という形で読み込みたいのですが、hclustに入力する距離行列は非類似度行列(値が小さい因子から統合される)とのことです。
−1x相関係数を非類似度として読み込んでみましたが、hang=-1にすると因子ラベルが0に揃ってしまいます。

以下の2点いずれかができれば解決すると思うのですが、いかがでしょうか?
・類似行列のクラスタ解析ができる方法を実行
・hclustでラベルを揃える位置を0以外の位置に指定する

よろしくお願いします。

  • 相関係数行列をクラスター分析に用いるには,相関係数行列を距離行列にすればよいわけで,それは 2*(1-r) でしょう。これは,平方距離なので,必要なら平方根をとってね。 -- 河童の屁? 2010-04-07 (水) 16:33:57
    > (r <- cor(iris[,1:4]))
                 Sepal.Length Sepal.Width Petal.Length Petal.Width
    Sepal.Length    1.0000000  -0.1175698    0.8717538   0.8179411
    Sepal.Width    -0.1175698   1.0000000   -0.4284401  -0.3661259
    Petal.Length    0.8717538  -0.4284401    1.0000000   0.9628654
    Petal.Width     0.8179411  -0.3661259    0.9628654   1.0000000
    > (d <- as.dist(2*(1-r)))
                 Sepal.Length Sepal.Width Petal.Length
    Sepal.Width    2.23513957                         
    Petal.Length   0.25649245  2.85688021             
    Petal.Width    0.36411775  2.73225187   0.07426914
    > plot(hclust(d), hang=-1)
    r-cluster.png
  • すばやい、丁寧なご説明ありがとうございます。試してみたところ上手く表示できました。初歩的な質問で、とても申し訳ありませんが、Aii=1が保障されている類似行列A=A[ij]は一般的にdij^2=2(1-Aij)で距離行列に変換できるのでしょうか? -- KM? 2010-04-07 (水) 17:09:25
  • 相関係数だからですよ。相関係数の定義と距離の定義を考えてみればよいでしょう。 -- 河童の屁? 2010-04-07 (水) 17:16:23
  • ありがとうございます。勉強になりましたm(_ _)m -- KM? 2010-04-07 (水) 17:40:30

optim関数について

あ〜る? (2010-04-07 (水) 11:19:57)

Rのoptim関数と同じ関数をjavaで計算したく、javaのlibraryで探しています。
また、javaで完結しているコード(他の言語を呼び出したりしない)を探しています。

実際に計算したいのは、L-BFGS-B法ですが、javaのlibraryでは見つけられませんでした。

もしご存知の方がいらっしゃったらご教示ください。
よろしくお願いいたします。

maptoolsを使った地図グラフ作成について

kojiro_i619? (2010-03-31 (水) 13:50:28)

お世話になります。中澤先生の本から、以下

gnm <- readShapePoly("gunma.shp")
gnmdata <- gnm$att.data
gnmpoly <- map2SpatialPolygons(gnm, region.id=att(gnm, "region.id"))
## <−これがうまくいきません。
gunmadata <- gnmdata
gunmapoly <- gnmpoly
aged <- read.delim("agedprop.txt")
gunmadata <- merge(aged, gunmadata, sort=F, by="JCODE")
DD <- gunmadata$AP2006
classes <- cut(DD, seq(min(DD), max(DD), length=5), include.lowest=T)
cols <- topo.colors(4)
plot(gunmapoly, col=cols[ordered(classes)], xlab="", ylab="", axes=F)
legend(max(x)-0.3*(max(x)-min(x)), min(y)+0.1*(max(y)-min(y)),
       legend=names(table(classes)), cex=0.6,fill=cols)
title("群馬県市町村の65歳以上高齢者割合4区分(2006年)")
text(x, y, gunmadata$CITY1, cex=0.5, pos=1, offset=0)

などと、作ったのですが、途中の命令が、ないようです。
見本のコードでも、教えていただければ、幸いです。

  • すみません。maptoolsのバージョンアップにより,以前あったいくつかの関数が消えてしまったようです。代替コードは現在検討中です。 -- 中澤? 2010-03-31 (水) 17:00:26
  • 最低限の代替コードと説明を書籍のサポートサイトに付記しました。 -- 中澤? 2010-03-31 (水) 19:00:04

forループの高速化

rbegginer? (2010-03-30 (火) 21:27:26)

いつも勉強させていただいております。
以下のプログラムについて、高速化のコツ、ヒントなどをいただけないでしょうか。

以下のようなプログラムで、1千万の母集団から5サンプルの抽出を1000回行い、外れ値を除去して平均値を計算する、ということを行っております。
5サンプルが終わったら6,7,8...100とサンプルサイズを変えてまた平均値を計算...というようにしています。さらに基準や数値を変えて実行しようと思っています。

実はサンプル抽出を1000回ではなく10000回行いたいのですが、このプログラムが大変時間がかかり、5000回でやってみると50分程度かかります。
時間がかかっていると部分、高速化できるような書き方がありましたら教えていただけないでしょうか
こちらのTipsでforは時間がかかるという記述を読みましたが、sapplyにする方法も思いつかず悩んでおります。
どうぞよろしくお願いします。環境はWindowsVista?, R2.10.1です。

pop <- round(rnorm(10000000, mean=300, sd=20)+(300*rexp(10000000)))
ssz <- c(5,6,7,8,9,10,15,20,25,35,50,100) # 抽出するサンプルの数
nrecv <- 0
nremv <- 0

for(j in 1:length(ssz)) {
   for(i in 1:1000){
      svct <- sample(pop, ssz[j])
      gmean <- mean(svct)
      gsd <- sd(svct)
      cfv.u <- gmean+(3*gsd) # 外れ値のカットオフポイント設定
      cfv.l <- gmean-(3*gsd) # 外れ値のカットオフポイント設定
      tmp <- svct
      tmp[tmp>cfv.u] <- NA # 外れ値除去
      tmp[tmp<cfv.l] <- NA # 外れ値除去
      svct.el <- tmp
      nrecv[i] <- mean(svct.el, na.rm=T) # 外れ値除去後サンプルの平均
   }
   nremv[j] <- mean(nrecv) # 1000個の平均値の平均
}
  • covct3 の値はいかほど? -- 河童の屁? 2010-03-30 (火) 21:45:22
  • 申し訳ありません。修正ミスでした。"3"に修正しました。実際はそこもベクトルにしていて、上述の「基準を変えて」とはgsdに乗算する値を変えるという意味です。後からの情報で申し訳ありません。 -- rbigginer? 2010-03-30 (火) 22:05:47
  • 他の記事でも書きましたけど,for が apply や sapply などより遅いわけではありません。アルゴリズムを考えた方が良いでしょう。あなたのプログラムの場合,母集団 pop はかなり大きな有限母集団が設定されており,毎回のシミュレーションでそこから標本抽出していますね。サンプルサイズが小さい場合(殆どの場合ですが)非常な無駄のようです。無限母集団からの抽出ではマズイですか?無限母集団からの抽出でも良いならば,サンプルサイズ×繰り返し回数の大きさの標本を作ることにより,計算時間は大幅に短縮できます。また,列ごとの平均値 gmean と標準偏差 gsd は colMeans, sd を使うことにより for ループの中に含めなくてもベクトル計算できます(もっとも,これを for ループの中でやっても,計算時間は大差ありません)。ということで,以下のようなプログラムだと,10秒前後で答えが得られるのではないかと思いますけどどうでしょう。 -- 河童の屁? 2010-03-30 (火) 23:21:03
    prog3 <- function()
    {
    	set.seed(666)
    #	pop <- round(rnorm(10000000, mean=300, sd=20)+(300*rexp(10000000))) これを止める
    	ssz <- c(5,6,7,8,9,10,15,20,25,35,50,100) # 抽出するサンプルの数
    	n <- length(ssz)
    	m <- 5000
    	nrecv <- numeric(m)
    	nremv <- numeric(n)
    	covct3 <- 1
    	for(j in 1:n) {
    		pop <- matrix(round(rnorm(ssz[j]*m, mean=300, sd=20)+
                          (300*rexp(ssz[j]*m))), ssz[j]) # こっちにする
    		gmean <- colMeans(pop)
    		gsd <- sd(pop)
    		cfv.u <- gmean+(covct3*gsd) # 外れ値のカットオフポイント設定
    		cfv.l <- gmean-(covct3*gsd) # 外れ値のカットオフポイント設定
    		for (i in 1:m) {
    			svct <- pop[,i]
    			svct <- svct[cfv.l[i] < svct & svct < cfv.u[i]]
    			nrecv[i] <- mean(svct)
    		}
    		nremv[j] <- mean(nrecv) # m 個の平均値の平均
    	}
    	return(nremv)
    }
    
    > system.time((ans <- prog3()))
       ユーザ   システム       経過  
         7.881      0.127      8.041 
    > ans
     [1] 527.4018 530.2227 530.0385 530.0244 528.1573 530.5734
     [7] 525.2133 524.3569 523.8537 520.2583 518.8018 516.8923
  • 河童様、大変素晴らしいコードをありがとうございます。無限母集団からの抽出という考えに至らず、とりあえず母集団は大きくしておこうという浅い考えでした。
    河童様のコードで実行していこうと思います。また、関数の形にしてくださり、「基準を変えて…」という計画にもとても使いやすくなりました。
    心から感謝いたします。 -- rbegginer? 2010-03-30 (火) 23:47:04
  • Rのcompilerがありますが既にお使いですか? -- のざわ? 2010-04-01 (木) 17:22:56
  • compilerは使っていません。のざわ様のレスで初めてそれを知り、wiki内を検索しました。L. Tierney 氏の R バイトコンパイラー、というのですよね?余裕ができたら調べてみます。ありがとうございました。 -- rbegginer? 2010-04-01 (木) 22:37:13
  • cranにないんですね>compiler。というかwindows用がないんですね。さらに繰り返しが多いシミュレーションを行うので使おうと思ったのですが、残念 -- rbegginer? 2010-04-01 (木) 22:46:21
  • 行儀が悪くても良いならcompilerの中身はRのスクリプトなので、winでも、そのまま貼り付ければ動きます。winでも綺麗に使いたいなら、少し整形すればlibrary()で呼ぶことが出来ます。 -- のざわ? 2010-04-02 (金) 09:32:12
  • compilerは、ループが、だいたい3倍早くなります。それ以上の高速化は並列ライブラリが必要。また出来るだけループにせずにベクタで処理するのが基本です。 -- のざわ? 2010-04-02 (金) 09:34:21
  • 河童さまのプログラムをcompilerに掛けてみました。 user system elapsed が 8.328 0.118 8.761だったのが7.916 0.095 8.336 と、僅かに改善されただけ。やったのが cprog3 <- cmpfun(prog3) だけですが。 -- のざわ? 2010-04-02 (金) 18:33:06
  • のざわ様、わざわざありがとうございます。そうするとやはりおっしゃるようにまずベクタ処理できるようにしていく、ということですね。恥ずかしながら、初心者で、コンパイラをwinで使えるようにする、整形してlibrary関数で呼び出す、またforループをベクタ処理に修正する、というご示唆も全てこれからググったりwiki内を検索したり自分で検証したりする段階です。アドバイスをすぐに活かせないで申し訳ないですが、もっと勉強してみます。 -- rbegginer? 2010-04-02 (金) 22:16:52

岡田昌史編 The R Book CD-ROM について

kojiro_i619? (2010-03-29 (月) 13:10:05)

CD−ROMの内容をロードするWEBサイトがありましたら、教えてください。

  • CD−ROMは手に入りました。Rmapがなぜかzipファイルからインストールできないのですが?なぜでしょうか? -- kojiro_i619? 2010-03-30 (火) 13:36:42
  • 現行RではRmapは使えないことが、わかりました。 -- kojiro_i619? 2010-03-30 (火) 13:55:48
  • Rmapじゃなくてmaptoolsを使いましょう -- okinawa 2010-03-30 (火) 15:07:10
  • maptoolsをインストールして、library(maptools)としても、関数 "read.shape" を見つけることができませんでした、となります -- kojiro_i619? 2010-03-30 (火) 15:22:50
  • winVistaでR2.10.1を使っています。 -- kojiro_i619? 2010-03-30 (火) 15:42:12
  • Q&A (初級者コース)/11の「関数 read.shape が使えません」を参照なさるとよいかも。対策も書いてあるようですよ。 -- 河童の屁? 2010-03-30 (火) 15:47:45
  • 私も見つけました。金先生の「maptoolsのクラス・オブジェクト」の稿を見ていただきたいのですが、その中のS3のクラス作成関数(read.shape)がなくなりS4クラス作成関数(readShapePoly??)だけになったようです。(S4クラスの方が何かと使いやすいので今後はそちらを使ってみてください。) -- kojiro_i619? 2010-03-30 (火) 16:30:01
  • > Ola$att.data<-cbind(Ola$att.data,high.low)で、属性情報の中の変数high.lowを参照するため、Ola$att.data$high.lowと表記するのにエラーになるようです。 -- kojiro_i619? 2010-03-30 (火) 16:35:46
  • get.Pcent( ),Map2polyの両方とも、最新のmaptoolsには使えないようです。 -- kojiro_i619? 2010-03-31 (水) 13:44:06

anova(lm(count~spray))でdim(X) must have a positive length エラー

にわか? (2010-03-28 (日) 00:06:36)

winXPでR2.10.1を使っています。
線形モデルの結果にaov、anovaを用いた分散分析を行うと、anova行うとエラーがでます。aovではでません。
いろんな所(たとえばhttp://www1.doshisha.ac.jp/~mjin/R/15.html)に、anovaで行う事例が載っていますので、当方の何かに問題があると思うのですが、見当がつきません。
漠然とした質問で恐縮ですが、どのようなところに問題ありそうでしょうか。
よろしくご教示いただけたら幸いです。

  • count, spray は InsectSprays? にあるやつですか?だとすれば,anova(lm(count~spray, data=InsectSprays?)) のように,data 引数を指定しないとまずいのでは?
    以下のようにすれば,エラーは出ませんけどね? -- 河童の屁? 2010-03-28 (日) 00:20:15
    > anova(lm(count~spray, data=InsectSprays))
    Analysis of Variance Table
    
    Response: count
              Df Sum Sq Mean Sq F value    Pr(>F)    
    spray      5 2668.8  533.77  34.702 < 2.2e-16 ***
    Residuals 66 1015.2   15.38                      
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
  • 河童の屁さん、有り難うございます。まず、attach(InsectSprays?)ではダメだったんですね。それと、当方の基本的なミスで、読込関数の中に同名のものを使っていました。こんなことでお手を煩わせてしまい恐縮です。お陰でクリアに解決しました。有り難うございました。 -- にわか? 2010-03-28 (日) 12:09:39

mac osx 10.6.2 で RPostgreSQLパッケージをロードできません。

jiro? (2010-03-25 (木) 23:11:55)

OS: mac osx 10.6.2( intel mac core 2 duo )
R ver: 2.10.1(32bit、64bit ともにインストール)
PostgreSQL ver: 8.3.1

上記の環境にて、R言語からPostgreSQLに接続しようとしています。
DBIのver 0.2-5 を install.package(DBI) コマンドにてインストールし、シェルからコマンドをたたき、RPostgreSQL をインストールしました。

$> sudo R CMD INSTALL RPostgreSQL_0.1-6.tar

途中、

rawToChar(magic[1:5])中で警告がありました:
文字列をnullに切り詰めました: 'Rpo\0\0'

という警告がでたもののインストールには成功したようです。
さて、Rのコンソールから、

> library( RPostgreSQL )

と実行すると下記のメッセージが表示され、パッケージのロードに失敗します。
64ビット版で失敗しているようなので、この問題の解決方法か、32bit 版の RPostgreSQL のインストール方法をお教え頂けないでしょうか。

よろしくお願いします。

Error in dyn.load(file, DLLpath = DLLpath, ...) : ~
  共有ライブラリ '/Library/Frameworks/R.framework/Resources/library/RPostgreSQL/
     libs/x86_64/RPostgreSQL.so' を読み込めません 
 dlopen(/Library/Frameworks/R.framework/Resources/library/
     RPostgreSQL/libs/x86_64/RPostgreSQL.so, 6):
     Symbol not found: _PQbackendPID
 Referenced from: /Library/Frameworks/R.framework/Resources/library/
     RPostgreSQL/libs/x86_64/
   RPostgreSQL.so
 Expected in: flat namespace
in /Library/Frameworks/R.framework/Resources/library/RPostgreSQL/libs/x86_64/RPostgreSQL.so 
エラー:  'RPostgreSQL' に対するパッケージもしくは名前空間のロードが失敗しました
  • 自分でやってみたわけではないので恐縮ですが、 http://code.google.com/p/rpostgresql/wiki/MacOSXInstallFinkPostgresql とかはいかがでしょうか? -- surg? 2010-03-27 (土) 10:00:29
  • やってみましたが進展なしでした。埒があかないのでRpgSQLを入れてみようと思います。ありがとうございました。 -- jiro? 2010-03-27 (土) 23:15:19

PLS回帰用のNIRデータの構造(再)

にわか? (2010-03-24 (水) 16:07:09)

標記の題名で11でお世話になった者です。
クリアに解決しましたので、投稿しておきます。
説明変数がマトリックスの場合には、protect関数(?) のI()を使えば、yarnのデータ構造のように、列毎に別々に変数を指定せずにまとめることができ、しかもデータフレームとしておけるようです。
例)

y <- c(2, 4, 6)
z <-matrix(1:12, 3, 4)
mydata <- data.frame(Y=y, Z=I(z))

以上、お世話になりました。

  • mydata<-data.frame(Y=y) ; mydata$Z<-z でもいいようです。 -- にわか? 2010-03-24 (水) 20:30:28

コンソールの内容を保存するコード

rbeginner? (2010-03-20 (土) 14:07:10)

いつも勉強させていただいています。

コンソールに表示される命令と出力を全て保存する関数はあるのでしょうか?
メニューからファイル -> ファイルを保存 を選ぶとlastsave.txtというファイルとして保存されますが、これをコードで行いたいと考えています。
理想はsink(... append=T, split=T) のように逐一保存したいのですが、sink関数だと出力しか保存されないようです。

どうぞよろしくお願いいたします。

  • このサイト内の「R出力の記録」ページが参考になる? -- 2010-03-26 (金) 01:02:56
  • 申し訳ありません。環境を伝え忘れておりました。WindowsVista?, R2.10.1です。そのページはもちろん見ましたが、Unixではtee命令というので可能なようですが、Windowsでの方法は記載されてないように思います。やっぱり方法はないのでしょうかね… -- rbegginer? 2010-03-27 (土) 10:10:21
  • キーワード "yatee" でネット検索。Windows で Unix の tee 命令を実現する試みはいくつもあるようです。 -- 2010-03-27 (土) 11:52:05
  • ご回答ありがとうございます。コマンドプロンプトからRを使う、ということは経験がなく四苦八苦している状況ですがもう少しがんばってみます。ありがとうございました。 -- rbegginer? 2010-03-29 (月) 23:39:32

GLMによる予測値の予測区間の求め方

saka? (2010-03-19 (金) 13:29:49)

GLMでガンマ分布とlogリンク関数を使って,将来の魚の漁獲量の予測値とその予測値の予測区間を求めたいのですが,予測区間をどのように求めたら良いのか分かりません。

推定値の信頼区間ではなく,それより広い範囲になることが多い予測区間の方です。

来年の予測漁獲量は○トンくらいだけど,95%の確率で○〜○トンの範囲になるということを知りたいのです。

GLMで解析するデータは下のようなものです。

これに,例えば新たに説明変数1,2,3がそれぞれ(12,5,1500)が得られたときに,予測漁獲量を「predict」を使って求めるところまではできるのですが,予測区間の求め方を教えてください。
よろしくお願いします。

目的変数 説明変数1 説明変数2  説明変数3
  7553       11.1       0.6        2240
 14897       13.0       1.6        1292
 30957       12.6       6.2         972
 35056        9.7      26.2        2655
 17436       11.4       9.4         547
  4656       14.0       0.2         820
  6879       12.3       0.0        1223
 41853       13.9       4.4        2043
 16308       12.1       4.8        1875
 11293       11.8       3.0        1363
  3964       10.2       9.8         236
  7993       13.1       0.5        1236
  6748       11.5       0.2        2144
  3522       12.2       0.0         758
 15395       10.5       7.6        1601
  7567       11.3       6.0        1175
  5823       10.7       4.4         880

以上です。

  • 管理者の方へ、投稿内容をきれいに整理していただき、ありがとうございました。 -- saka? 2010-03-20 (土) 07:27:39
  • surg? 2010-03-20 (土) 16:01:46
    > data <- data.frame(
    + 	y = c(7553, 14897, 30957, 35056, 17436, 4656, 6879, 41853,
    + 		16308, 11293, 3964, 7993, 6748, 3522, 15395, 7567, 5823),
    + 	x1 = c(11.1, 13, 12.6, 9.7, 11.4, 14, 12.3, 13.9, 12.1, 11.8, 
    + 		10.2, 13.1, 11.5, 12.2, 10.5, 11.3, 10.7),
    + 	x2 = c(0.6, 1.6, 6.2, 26.2, 9.4, 0.2, 0, 4.4, 4.8, 3, 9.8, 
    + 		0.5, 0.2, 0, 7.6, 6, 4.4),
    + 	x3 = c(2240, 1292, 972, 2655, 547, 820, 1223, 2043, 1875, 
    + 		1363, 236, 1236, 2144, 758, 1601, 1175, 880)
    + )
    > 
    > data.glm <- glm(y ~ x1 + x2 + x3, family = Gamma(log), data = data)
    > 
    > data.prd <- predict(data.glm, newdata=data.frame(x1=12, x2=5, x3=1500), 
    + 	se.fit=TRUE)
    > 
    > exp(data.prd$fit)
           1 
    13082.80 
    > exp(data.prd$fit - 1.96 * data.prd$se.fit)
           1 
    10336.17 
    > exp(data.prd$fit + 1.96 * data.prd$se.fit)
           1 
    16559.29
  • surgさん、回答を有難うございました。大変申し訳ないですが、1点だけ確認させて下さい。(推定値±1.96*標準誤差)は推定値の信頼区間で、予測値の予測区間とは別のものだと思っていたのですが、間違いでしょうか。単回帰ではpredictでinterval="confidence"と"prediction"が選べて、それぞれ信頼区間と予測区間だと思っていたので、GLMでもそれぞれ別の値があるはずだと思っています。間違いでしょうか。お手数ですが、ご教示いただければ幸いです。 -- saka? 2010-03-20 (土) 17:33:10
  • > 管理者の方へ、投稿内容をきれいに整理していただき、ありがとうございました。
    そんな編集は,投稿者がやるべき事です。管理者がやったものでもない。たんなるお節介がやっただけのことで,あなたがやるべき事なんです。どういう風にやったらよいかというのは,あなたが自分で学ぶべき事です。学べなければ,ずっと駄目な投稿者とうことになるのかな?
    それと,あなたがやるべきことは,データだけを示すことではなく,そのデータをどういうプログラムで解析したかを示すこと(データも示さないよりはましだけど)。あなたがやったことを,回答者に推測させることではない。 --  ? 2010-03-20 (土) 22:09:20
  • 説明不足の投稿内容で申し訳ありませんでした。また、投稿の書式も悪くお手数をおかけしたことをお詫びします。上手く投稿できるように学んでいきたいと思っていますので、よろしくお願いします。 -- saka? 2010-03-21 (日) 06:28:23
  • 質問投稿にプログラムがなくてすみませんでした。データを読み込んでから、data.glm<-glm(y~x1+x2+x3,family=Gamma(link=log),data=data)、でGLMを計算し、data.prd<-predict(data.glm,newdata=data.frame(x1=12,x2=5,x3=1500),se.fit=T)、で線形予測値を計算し、exp(data.prd$fit)、で予測値を計算するところまではsurgさんに教えていただいたものと同じようにできてです。しかし、そこから先の予測区間を求める部分は、手も足も出ず本やネットで調べている状態です。 -- saka? 2010-03-21 (日) 07:02:09
  • だれだか知りませんが、たしなめる言葉もいい加減にしないと、ただの老害ですよ -- よく見るひと? 2010-03-21 (日) 10:12:18
  • この投稿で不愉快な思いをさせてしまった方には本当に申し訳ありません。もしよろしければ、GLMの予測値の予測区間の求め方についてお教え願います。今のところ私は推定値の信頼区間とは別のものと思っていますが、それほど自信があるわけではありません。 -- saka? 2010-03-21 (日) 14:52:30
  • 質問の意図を取り違えておりました。線形モデルでは残差の分布として正規分布を仮定しているので、標準偏差から信頼区間を単純に導くことができます。しかし一般化線形モデルではそうはいかないため、簡単に信頼区間を導くことはできません。一方で推定値の信頼区間に関しては、中心極限定理により正規分布を仮定できるので単純に導くことができるのです。 -- surg? 2010-03-21 (日) 21:27:14
  • surgさん、追加の説明をありがとうございました。GLMの場合、推定値の信頼区間は教えていただいたプログラムで導けるが、予測値の信頼区間(予測区間)は容易に求められないと言うことですね。ありがとうございました。 -- saka? 2010-03-22 (月) 11:26:13

対応のある比率の検定?

にわか? (2010-03-17 (水) 23:31:15)

ある植物を植えたときに、処理Aと処理Bで活着率に差があるかどうかを、時期を変えて調べた次のようなデータがあります。
各時期に処理A,Bとも30株ずつ植えたうち、表の株数が活着し、残りは枯死しました。

<各30個体を植えたときの活着した株数>
      時期1  時期2  時期3  時期4
処理A   14株   13株   10株   15株
処理B   15株   14株   13株   16株

この場合、処理A、Bのどちらが活着に有効かを検定する場合、各時期ごとには活着の成功か失敗かという問題だと思うので、
prop.test(c(10,19),c(30,30))
というように比率の検定をすればいいと思うのですが、
全体で見る場合、単に合計で 52/120 と 58/120 の比率の検定をするのか、時期を反復と見て対応のあるt検定を行ってよいのか悩んでいます。
あるいは、「対応のある比率の検定」のようながあるのでしょうか。
どなたかご教示下さい。
よろしくお願いします。

  • 時期を層と考えて Mantel-Haenszel で活着のオッズ比が有意かどうか検定してみては。?mantelhaen.test ただ時期によって活着のオッズ比が違うことを示したいんだったら話は別だけど。 -- 2010-03-18 (木) 03:49:29
  • X1 を処理、X2 を時期、Yは活着したかどうか、としてロジスティック回帰でどうでしょう。 -- 横浜? 2010-03-18 (木) 08:26:22
  • ご教示、有り難うございます。マンテル・ヘンツェルの方、やってみました。ロジスティック回帰の方はこれから調べてみます -- にわか? 2010-03-18 (木) 22:37:25
  • ところで、活着株数あるいは活着率の数字を使って、対応のあるt検定で検定することは間違いでしょうか? -- にわか? 2010-03-18 (木) 22:41:11
  • t 検定を使う上での仮定(独立,母集団は正規分布)はクリアできていますか?でもきっとどの方法でも有意差はでないので間違えても無害ではあります. -- 横須賀? 2010-03-18 (木) 23:34:49
  • 有り難うございます。どちらも独立性も正規性も検定すると棄却されませんが、こういう比率の問題でt検定というのがしっくりこないところです。さりとて、活着率などは何回も反復をしてどれくらいその率がばらつくかを知りたいところで、比率の検定では反復が生きてこないのではないかと悩んでいたところです。みなさん、有り難うございました。 -- にわか? 2010-03-20 (土) 15:23:26

adapt関数以外で重積分をする方法について

Saito? (2010-03-13 (土) 15:10:03)

あちこち調べ、自分でも試したのですが、わからなかったので質問させてください。

最近(といっても数ヶ月前)にCRANからadaptパッケージが消えたようです。
今まで重積分をするときにはadaptを使って積分していたので、消えた後も過去のRのバージョンのlibraryからadaptを持ってきて使っていました。

しかし、2.10.0以降になると以下のようにre-installを求められます。

> library(adapt)
エラー: package 'adapt' was built before R 2.10.0: please re-install it


re-installしようにもCRANにないのでできません。そこで仕方なく他の方法で重積分ができないか探したのですが見当たりませんでした。

どなたか、解決策をご存知でしたらご教授願えないでしょうか。
なお、環境はWindows 7、x64 R-2.11.1 Pre-releaseです。

  • 2.10.0より古いRを使えばいいと思います。 -- 2010-03-13 (土) 19:46:56
  • 回答ありがとうございます。確かに、現在はそうしているのですが…。できれば、他の重積分方法をご教授いただければ幸いに思います。ごめんなさい、どうぞよろしくお願い致します。 -- Saito? 2010-03-14 (日) 09:44:47
  • 新しいバージョンのRに対するバイナリがないだけなので、自分で作ればいいのです。このサイト内のどこかにある記述に従って、Rtoolsをインストールし(検索すればすぐわかる)、http://cran.md.tsukuba.ac.jp/src/contrib/Archive/adapt/ からソースをDLして、Rcmd INSTALL adaptするだけです。 -- 2010-03-14 (日) 10:09:28
  • 回答ありがとうございます。
    やり方を聞く限りでは今までやったことがないことのようです。少し勉強してみます。 -- Saito? 2010-03-14 (日) 12:18:39

prcompを用いた固有値・固有ベクトルの計算について

初心者? (2010-03-10 (水) 00:24:41)

prcompを使用して固有値・固有ベクトルを算出しているのですが、どうも結果が意図したものと異なってしまいます。
・Rの出力

> A <- matrix(c(0, -4, 4, 1, 4, -3, 1, 2, -1), nrow=3)
> A
     [,1] [,2] [,3]
[1,]    0    1    1
[2,]   -4    4    2
[3,]    4   -3   -1
> prcomp(A, scale=F, center=F)
Standard deviations:
[1] 5.579673e+00 9.312648e-01 1.184667e-16

Rotation:
            PC1        PC2        PC3
[1,] -0.7093545 -0.6210515 -0.3333333
[2,]  0.6431273 -0.3767530 -0.6666667
[3,]  0.2884500 -0.6872788  0.6666667

・参考にしたURL
http://www004.upp.so-net.ne.jp/s_honma/urawaza/eigenvector.htm
このページによると固有値は0,1,2となるはずなのですが、何か使い方等で間違っているのでしょうか?
Windows XPで R2.8.1 を使用しています。

  • さきほどの初心者です。すみません、投稿が汚いですね。取り消し方がわからないので、このままにさせていただきます。 -- 初心者? 2010-03-10 (水) 00:26:21
  • 整形しました -- 他の初心者(下の質問者)? 2010-03-10 (水) 00:34:01
  • eigen(A)でリンク先と同等の結果になると思います。 -- 2010-03-10 (水) 01:23:11
  • 蛇足ですが解説しておきましょうか。質問者が得た結果は,行列 A から計算された積和行列の固有値の平方根と固有ベクトルになっています。固有値・固有ベクトルの計算に prcomp を使ったのが敗因ですね。 -- 河童の屁? 2010-03-10 (水) 10:02:16
    > # prcomp(A, scale=F, center=F) で実行されること
    > A <- matrix(c(0, -4, 4, 1, 4, -3, 1, 2, -1), nrow=3)
    > B <- t(A)%*%A/(nrow(A)-1)
    > ans <- eigen(B)
    > sqrt(ans$values) # Standard deviations:
    [1] 5.579673e+00 9.312648e-01 2.267999e-08
    > ans$vectors # Rotation:(列単位で符合は任意)
               [,1]      [,2]       [,3]
    [1,]  0.7093545 0.6210515 -0.3333333
    [2,] -0.6431273 0.3767530 -0.6666667
    [3,] -0.2884500 0.6872788  0.6666667
  • 質問者は、prcompというより主成分分析をどういうものかを理解していないようですね。商用であろうとフリーであろうと、ブラックボックスは怖いなぁ、という感想。 -- ooki? 2010-03-10 (水) 14:59:08
  • 固有値・固有ベクトルを求めるために主成分分析を使うという発想はなかなか出てこない。出てきても,prcomp についてのオンラインヘルプを見れば,それによって固有値・固有ベクトルが求まるわけではないことは明らか。prcomp の引数についての説明で,xは a numeric or complex matrix (or data frame) which provides the data for the principal components analysis。オンラインヘルプがあるのだから,prcomp はブラックボックスではない。「○○をブラックボックスにするのは利用者」 -- 河童の屁? 2010-03-10 (水) 15:55:58
  • だからprcompが何をするのか知っての質問だと思い、最終目的は固有値等ではないと...。ぐすん;; prcompがブラックボックスだ、と書いた訳ではないのだが...。ぐすん;; -- ooki? 2010-03-10 (水) 17:25:16
  • 「prcompを用いた固有値・固有ベクトルの計算」とあるわけで -- 河童の屁は今日は打ち止め? 2010-03-10 (水) 22:45:24
  • 素早いご返信ありがとうございました。あまり内容を知っていなかったので、大変勉強になりました。 -- 初心者? 2010-03-11 (木) 00:28:26

Rの正規表現について

初心者? (2010-03-10 (水) 00:04:04)

Windows VistaのR-2.10.1です.(Rの他のバージョン,他のOSでもうまく動いて欲しいです)

例えば,「何章」や「何節」もしくは「番号のみ」(いずれも1〜2桁で,全角の数字の可能性もあります)から番号だけにするようなとき,

section <- c("1", "23", "4部", "56部", "7章", "89章")
section <- c(section, "1", "23", "4節", "56節")
sub("([[:digit:]]{1,2})[^[:digit:]]?", "\\1", section)

でしてみましたが、結果が

 [1] "1"    "23"   "4部"  "56"   "7章"  "89"   "1"   "23" "4節" "56"

のようになってしまいました.
どのようにしたら,うまく番号だけ抜き出せるのでしょうか? また何が原因なのでしょうか?? 宜しくお願いいたします.

  • chartr("[0-9]","[0-9]",gsub("^([0-90-9]+).*$", "\\1", section)) あたりでしょうか, : digit : は全角数字(もちろん漢数字を初め各言語の○○数字<-沢山ありますが)には対応しません. tre-regexpの0.7? が現在のRの正規表現なのですが, いまひとつです. 今度(2.11.x)は0.8になりますが, やっぱりいまひとつです. (他のOSでもと言う意味ですが...) -- 2010-03-10 (水) 02:20:38
  • chartr関数って知りませんでしたので,とても良いものを教えていただきました.tre-regexpがいまひとつというのは,マルチバイトの処理がいまひとつという意味でしょうか?
    私は言語を勉強したことがないので,内部に何が使われているかなど全く知りませんでしたので,とても参考になりました.
    [:digit:]というのは,私が試した結果は全角数字は対応しているように思えるのですが・・・
    ありがたくコード使わせていただきます.ありがとうございました. -- 初心者? 2010-03-10 (水) 20:06:43
  • CSIで4byte使うような環境の事を全く考えて無いんです(それがわかった時点でがっくりするんですが). さっと斜めに見ただけなのであれですが, サロゲートペアも無視してたように思います. 正規表現は非常に良く取っ替えられます. 安定性よりとにかく速度が優先されてます. -- 2010-03-11 (木) 11:41:31
  • ありがとうございます。知らない用語もありましたので調べてみましたが,文字コードって複雑ですね・・・ -- 初心者? 2010-03-13 (土) 10:59:36

listオブジェクトのgrepについて

R初心者? (2010-03-09 (火) 10:36:33)

R-2.10.1をWindows Vistaで使用しています。

mylist <- list(alph=letters, Alph=LETTERS, num=as.character(0:9))
grep("A", mylist, ignore.case=FALSE) # (1)
grep("C", mylist, ignore.case=FALSE) # (2)
grep("c", mylist, ignore.case=FALSE) # (3)

ここで、(1)と(2)などpatternが(3)の "c" 以外のgrepの挙動は私の望んだものとなっています。
しかし、(3)のgrepの挙動がおかしい(私が望んでいるものではない)です・・・。
本来ならば 1 が帰ってきて欲しいのですが、 c(1,2,3) が帰ってきてしまいます。
1 と帰ってくるような手立てはございますでしょうか? また、これはバグなのでしょうか?
grep以外の関数での解決方法でも結構です。よろしくお願いいたします。

  • こんなので良い? listはstructureした文字列になるのでc("A","B"...)となり, 当然cにマッチします. -- 2010-03-09 (火) 11:22:51
    lgrep<-function (pattern, x, ignore.case = FALSE, extended = TRUE, perl = FALSE,  
        value = FALSE, fixed = FALSE, useBytes = FALSE, invert = FALSE)  { 
        unlist(lapply(mylist, function(x) !(!length(grep(pattern,  
            x, ignore.case, extended, perl, value, fixed, useBytes,  
            invert))))) }
    lgrep("c",mylist,ignore.case=FALSE)
    alph  Alph   num 
    TRUE FALSE FALSE
  • 戻り値を整えて,以下のように -- 河童の屁? 2010-03-09 (火) 12:12:38
    > lgrep<-function (pattern, x, ignore.case = FALSE, extended = TRUE, perl = FALSE,  
    +     value = FALSE, fixed = FALSE, useBytes = FALSE, invert = FALSE)  { 
    +     unname(which(sapply(mylist, function(x) length(grep(pattern,  
    +         x, ignore.case, extended, perl, value, fixed, useBytes,  
    +         invert)))==TRUE)) }
    > #
    > lgrep("A", mylist, ignore.case=FALSE) # (1)
    [1] 2
    > lgrep("C", mylist, ignore.case=FALSE) # (2)
    [1] 2
    > lgrep("c", mylist, ignore.case=FALSE) # (3)
    [1] 1
  • ご返信ありがとうございます!
    structureしたというのがまだよく分かりませんが,属性がセットされているようですね。
    試しにlistの中にdeta.frameを入れて、data.frameなどでgrepしてみましたが、こちらは問題ないですね。
    まだ,structureした後、なぜcが全部にひっかるのかわかりません・・・。c以外にもこの可能性がある文字があるのかどうか・・・。
    しかしながら、皆さまのお陰で、期待する動作を得ることができました。ありがとうございましたm(_ _)m -- R初心者? 2010-03-09 (火) 12:52:05
  • ああ、「c(...)」全体が検索対象なんですね。「\\(」でもひっかかりましたし、grepのオプションvalue=TRUEにして、やっと仰っておられる内容が理解できました。
    本当にありがとうございました。 -- R初心者? 2010-03-09 (火) 14:07:25
  • 1行なら
    sapply(mylist,function(x,y) length(grep(y,x))>0,y="A")#上の場合
    seq(mylist)[sapply(mylist,function(x,y) length(grep(y,x))>0,y="A")]#下の場合
    とか。でも、length(grep(y,x))>0は美しくないね。 -- akira? 2010-03-09 (火) 16:04:30
  • ありがとうございます! 皆さまのコードを拝見するとなるほどとは思いますが、自分で思いつきそうもありません・・・。
    以下、本来の目的にあったものではありませんが、grepで引っかかった場所を返してくれる関数を作りました(少し汎用的に作ってみました)。
    a <- c("A", "B", "CD")
    y <- 3:9
    x <- data.frame(a=(1:4), b=c("a","b","c","d"), value=c(TRUE, FALSE, FALSE, TRUE))
    x <- list(a=a, num=y, data=x)
    
    # 関数の定義
    lgrep <- function(pattern, x, ...,
                      classes = "ANY", deflt = NULL,
                      how = c("unlist", "replace", "list" )) {
      rapply(x, function(x, pattern, ...) grep(pattern, x, ...),
             classes=classes, deflt=deflt, how=how, pattern=pattern, ...=...)
    }
    
    lgrep("\\<A\\>", x, how="list", deflt=NA)
    structureですが、やっぱりよくわかりません・・・。なぜ、data.frameは data.frame(...) 全体が検索対象にならないのか・・・。なぞが深まりました。 -- R初心者? 2010-03-09 (火) 20:25:04
  • 1行で頑張るなら、
    lapply(x, function(x,y) apply(as.matrix(x),2,function(x,y) grep(y,x),y=y), y="A")
    こんな感じかな。もっと入れ子構造ならrapplyを使うのでしょうか? -- akira? 2010-03-10 (水) 07:52:08
  • ありがとうございます! 私はapply系関数を自分でうまく使いこなせません^^;
    できることは、他人様のコードを見て、自分なりに少し修正するくらいです。(論理的な思考ができていないんでしょうね;;)
    英語も全くできないので、マニュアルも苦労しながら読んでいる状態です。
    apply系関数の中に、apply系関数をいれるなんてことは完全に私の能力を超えてますが、 ありがたくapply系関数の勉強にも使わせていただきます!
    ありがとうございました。 -- R初心者? 2010-03-10 (水) 19:59:23

添付ファイル: fileplot3d.png 1534件 [詳細] filejhin2.png 1564件 [詳細] filest20100614-2.png 1570件 [詳細] filemiss_filled_contour2.jpg 1458件 [詳細] filehenokappa.png 1509件 [詳細] filetree.gif 1319件 [詳細] filesamplelengtherror.xls 1059件 [詳細] filer-cluster.png 1541件 [詳細] filemiss_filled_contour.jpg 1531件 [詳細] filescatterplot3d2.R 1132件 [詳細] fileomega-alpha.png 1383件 [詳細] fileexample999.png 1398件 [詳細] fileglid.png 1506件 [詳細] filesampleperlerror.xls 1034件 [詳細] fileeval-parse.png 1453件 [詳細] filevennDiagram2.png 1269件 [詳細] fileapprox.png 1396件 [詳細] filejhin.png 1384件 [詳細] filematplot.png 1423件 [詳細] filetest.txt 293件 [詳細] filereorder.png 1438件 [詳細] fileinstall-adapt.png 1538件 [詳細] filevennDiagram.png 1487件 [詳細] filescatterplot3d.png 1532件 [詳細] file3dplot.png 1421件 [詳細] fileimage.png 1353件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Google
WWW を検索 OKADAJP.ORG を検索
Last-modified: 2015-03-01 (日) 01:15:59 (1634d)