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

スレッド

Q&A (初級者コース) 過去の目次


●● 目次 ●●


svmでplotした結果からsupport vectorを取り除き等高線のみにしたい

ひろ? (2013-02-17 (日) 23:00:54)

kernlabパッケージのksvmを使用した下記コードを実行してplotすると確立分布図が現れますが,その図からサポートベクター(SV)(○・●,△・▲のプロット)を取り除く方法はありますでしょうか?(e1071パッケージでもoKです)

library(kernlab)
# number of data points
n <- 150
# dimension
p <- 2
sigma <- 2  # variance of the distribution
meanpos <- 0 # centre of the distribution of positive examples
meanneg <- 3 # centre of the distribution of negative examples
npos <- round(n/2) # number of positive examples
nneg <- n-npos # number of negative examples
# Generate the positive and negative examples
xpos <- matrix(rnorm(npos*p,mean=meanpos,sd=sigma),npos,p)
xneg <- matrix(rnorm(nneg*p,mean=meanneg,sd=sigma),npos,p)
x <- rbind(xpos,xneg)
# Generate the labels
y <- matrix(c(rep(1,npos),rep(-1,nneg)))
# Train a nonlinear SVM with Gaussian RBF kernel and default parameters
svp <- ksvm(x,y,type="C-svc",kernel='rbf')
plot(svp,data=x)

scatter3dの軸の設定ができない

rkoma? (2013-01-11 (金) 20:22:54)

R初心者です。よろしくお願い致します。
Rで作成する3次元散布図 (scatter3d)では、軸タイトルなどへのExpression関数への適用や、軸の最大・最小値の設定や、軸を対数目盛にすることは可能でしょうか?
Rcmdr の「3次元散布図」で作ったグラフをひな型にして、スクリプトウィンドウに追加して修正を行っています。具体的には、Rコマンダーから3次元散布図を作成して、

scatter3d(x軸の値, y軸の値, z軸の値, surface=FALSE,
          residuals=TRUE, bg="white",
          axis.scales=TRUE, grid=TRUE, ellipsoid=FALSE,
          xlab=" ", ylab=" ", zlab=" ")

となったところに log="x", log="z", xlim=c(0.1,100), zlim=c(0.1,100) およびExpression関数によるx,y,zlabのテキストの修正(上付き、下付き文字の追加)を加えています。特にエラーメッセージは出ないのですが、できませんでした。
2次元散布図では可能です。また、plot3d()では、最大値、最小値の設定はできたのですが、対数軸への変更はできませんでした。
 R初心者、プログラミング初心者なので、全く原因がわかりません。単純に機能がないというだけでしょうか?Help()やRjpWikiの過去の質問なども含め、できるだけ調べてみたのですが、よくわかりませんでした。
 また、scatter3d()やplot3d()に限らず、「最大値・最小値を設定できて軸を対数目盛りにできる3次元散布図」を作成する方法がありましたら、教えていただけると助かります。
OSはWindows2003、Rはver.2.15.2、Rcmdrはver.1.9-2を使用しています。
ちなみに、類似の質問をYahoo知恵袋にも投稿しています。そちらで解決しましたら、その旨ご報告します。
恐縮ですがご回答よろしくお願い申し上げます。

  • > 特にエラーメッセージは出ないのですが、できませんでした。 2次元散布図では可能です。
    scatter3d というのは,そもそも,あなたが指定したような引数を持たないのでは?エラーメッセージが出ないのは,scatter3d が ... 引数を持つからで,あなたが与えた想定外の引数を「まあ,... なんだろうなあ」といなされているためでは。
    そもそも scatter3d というのがどのパッケージに入っているのか分からなかったのだけど,わざわざ調べたら car パッケージにあるやつでしたか?出自が分かれば library(car) のあと ? scatter3d とやってオンラインヘルプを見てみれば,確かにあなたの指定したような引数は「ありません」ねえ。つまり,そのようなことはできないと言うことがはっきりしたと思いますが。
    > R初心者、プログラミング初心者なので、全く原因がわかりません。
    ということですが,私も Rcmdr については初心者以下(ほとんど使ったことがない)なので,何ともね。ブラックボックスというのはこわい。ブラックボックスに訳の分からない要求をしたら,何が起こるか分からないけど,なんにも起こらなかっただけでよしとしましょうか。
    > 軸を対数目盛りにできる3次元散布図
    軸目盛りの表記は違ったものになるけど,元の変数の対数を取ってから使えば実質的にはあなたの意図するグラフになるでしょう。d -- 河童の屁は,河童にあらず,屁である。? 2013-01-11 (金) 21:09:28
  • 河童の屁は,河童にあらず,屁である。 様 大変わかりやすく速やかなご回答、どうもありがとうございました。できないことがはっきりしたので、助かりました。 -- rkoma? 2013-01-11 (金) 22:48:03

大学でパッケージがインストール出来ない

taipapa? (2013-01-11 (金) 18:21:30)

某大学のパソコン(マック mountain lion)にR 2.15.2をインストールしました.その後にパッケージを色々入れようとすると,どのパッケージでも,以下の様なメッセージでうまくいきません.

URL 'http://essrc.hyogo-u.ac.jp/ 省略 /pls_2.3-0.tgz'
    を試しています 
Content type 'text/html' length 182 bytes
開かれた URL 
==================================================
downloaded 182 bytes
エラー:  ファイル ‘/var/folders/5j/省略/pls_2.3-0.tgz’
                は OS X バイナリパッケージではありません 
追加情報:   警告メッセージ: 
'tar' がゼロでない終了コード 1 を返しました  
tar: Unrecognized archive format
tar: Error exit delayed from previous errors.

なにをしても182バイトしかダウンロードしてくれません.

大学のネットワーク管理者に確認してもプロキシは使用していないとのことですので,プロキシの問題ではないと思います.また,幾つかのcranのミラーサーバーを試してみましたが,全てダメです.Bioconductorのパッケージをインストールしようとしても同様の症状です.マックのユーザーインターフェースの一つであるRパッケージインストーラでは,パッケージの一覧の取得は可能です.ですから,サーバーにはつながって中身も見えています.なのに,選択してインストールしようとすると上記のエラーでことごとくダメです.自宅ではなんの問題もなくR packageのインストールができているだけに,ほとほと困っております.うちの大学側のネットワーク絡みの問題なのでしょうが,かなり調べても同様の報告に行き当たることができず,こちらに相談する次第です.どなたかアドバイスいただければありがたいです.

  • > Content type 'text/html' length 182 bytes
    というところは,本来は
    Content type 'application/x-gzip' length xxx bytes (yyy Kb)
    となるべきなので,明らかにへんですね
    といっても,どこをどうすればよいかわからないのですが,管理者にそこを指摘すると何らかの解決の道が開けるのかも知れませんね。確か,MIME とかいうもので,ダウンロード対象によってダウンロードのモードを設定するんだったと思うけどその設定がおかしい(あるいは,設定されていない)のでは?がんばってください。 -- 河童の屁は,河童にあらず,屁である。? 2013-01-11 (金) 21:35:22
  • tarで詰まっている(らしい)ということは、アーカイブファイルのダウンロードは先に行なっておいてR CMD installとかしてもダメなのでしょうかね…?「自宅では」というのは「他の端末で」ということでしょうか? -- 2013-01-11 (金) 21:36:38
  • 皆様,アドバイス有難うございます.管理者に上記の事を相談してみます.tarで詰まっているというより,そもそも182バイトしか落とせてないことが問題なんだと思います.自宅というのは文字通り,私の家です.こちらでは何ら悩むことなくスムーズにインストールできています.解決したらまた報告いたします. -- taipapa? 2013-01-11 (金) 22:44:09
  • 依存関係に悩みたくないので,他に方法がない限りR CMD installはやりたくないんですよね.Rパッケージインストーラ,楽なんですよ...(^^;;; -- taipapa? 2013-01-11 (金) 22:49:50
  • へぇ、Rパッケージインストーラというのは、install.packages関数のGUIラッパーなだけかとおもってました。それ以外の依存関係解決なんかもしてる、ということなんですね。そうでなければ、単純にアーカイブファイルだけ先にR外で保存しておいて、それをR CMDなりinstall.packagesなりでインストールすればいいわけで(本当に「落とせてないことが問題」なのであれば)。それから「自宅では」について聞いたのは、「ご質問の『某大学のパソコン』というのがラップトップ機であり、まったくおなじ端末を自宅で使うと」ということなのか、それとも「自宅から他のMac端末を使うと」ということなのかを確認したものです。「大学のパソコン」という表現はなんとなく据置機に聞こえたので、「自宅では」というのはそれとは別の端末の話なのかな、と邪推したまでです。 -- 2013-01-11 (金) 23:43:16
  • 困っている度合いによりますが、自宅でUSBメモリにいれて大学に持参すればとりあえず解決しますよ。install.packages()でrepos=NULLを指定して下さい。個人情報保護法や研究倫理がうるさくなってネットワークに接続しないPCでRを使うこともよくありますよ。 上のコメントの方へ。?install.packageで分かるようにinstall.packages()は何年か前から依存関係の面倒を見てくれるようになりました。-- 2013-01-11 (金) 23:55:30
  • いや、だからダウンロードが問題なら、ファイルだけ保存しておいてinstall.packagesでローカルからインストールすれば、といっているのでは?要点は「R CMD INSTALL使え」ではなく「先に保存したローカルファイルからインストールすればいい(そのとき使うのはR CMDだろうがinstall.packagesだろうが好きにすればいい)」ということでしょう。それに、install.packagesが依存関係の面倒をみてくれることは当たり前で、「*Rパッケージインストーラ*がそれ(install.packages)がする以外の依存関係解決なんてしているのか?」と聞いています。 -- 2013-01-12 (土) 13:08:08
  • 元質問者です.皆様,色々なアドバイス有難うございます.仰るようにアーカイブのダウンロードを別にやってそこからインストールすればよいわけですね.問題は,大学からは,wgetなどで落とそうとしても同じく182バイトしか落ちないことです.そこで,現在自宅で2.15のパッケージ・ディレクトリごと落としている際中です.あ,自宅は大学とは別の端末を使用しております.こちらで落としたものを職場に持って行くつもりです.ただ,今後のことを考えると,大学の端末からも落とせるようにならないといろいろ困ると思うので,連休明けにネットワーク管理者ともう一度相談してみます.それと,install.packageが依存関係を見てくれるようになったことは知りませんでした.この情報も助かります.いやぁ,ここはいいところですね.皆様,重ねて有難う御座いました.ネットワークの問題が解決したら,また,報告させてもらいます. -- taipapa? 2013-01-12 (土) 20:13:57
  • 本日,念の為に,大学の端末にてRを起動しパッケージのインストールを試みたところ,何も設定など変更していないのにもかかわらず,何ら問題なくスムーズにインストールできるようになっておりました.ネットワーク管理者に相談してみたところ「現在ダウンロードできてしまっているということであれば、今から 何が原因であったか切り分けを行うのは難しい」とのことでした.ということで,勝手に問題のほうで消滅してくれました.ただ,皆様のアドバイスに従って落としたアーカイブからのインストールをやってみたところ,さすがにローカルから入れると早い,早い,一瞬で出来ます.何はともあれありがとうございました.原因不明のままで申し訳ありませんが,とりあえずご報告まで. -- taipapa? 2013-01-15 (火) 20:54:11

コードがハイライトされた状態で印刷したい

たく? (2013-01-11 (金) 11:21:32)

エディタでコードを色づけしてくれるものはいろいろありますが、ハイライトされた状態のカラーのまま印刷できるエディタや方法をご存じでしたらどなたかお教えいただけないでしょうか。環境はWin7を常用しています。

  • シェアウェアですがEmEditor? Proなんてどうでしょうか? -- 通りすがりの仮面ライダー? 2013-01-11 (金) 12:24:19
  • 表示されたままに印刷できないなんて考えられないですが。Windows ではそういうこともあるんだろうか。まさか、モノクロ印刷しようとしているとか,カラープリンターでないなどというオチはないでしょうね。 -- 2013-01-11 (金) 12:56:29
  • レドモンドOSのエディタだと、デフォルト設定のままでは、自動pretty printが印刷に反映されないものもあった気がしますね。少なくとも考えられなくはない。 -- 2013-01-11 (金) 15:52:39
  • highlightを使うとソースをSVG画像やrtfファイルに変換できますよ。あとPygmentsもRに対応していた気がする -- 2013-01-12 (土) 00:08:43
  • ありがとうございます。EmEditor?は10年以上前に使っていましたができそうですね。highlightは使い方にコツがいりそうで尻ごみしていたのですがrtf出力がんばってみます。Pygmentsも便利そうです。助かりました。 -- たく? 2013-01-15 (火) 20:11:09

年次別に違うプロットマーカーを使用したい

Montecarlo? (2013-01-07 (月) 03:15:01)

何度か試行錯誤を重ねてみましたが、うまくいかなかったため皆様のお知恵を拝借したく投稿します。
よろしくお願いいたします。

セッションインフォメーションは以下の通りです。

> sessionInfo() 
R version 2.15.2 (2012-10-26)
Platform: x86_64-w64-mingw32/x64 (64-bit)

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     

今したいことは題名にもあります通り、年次別に違うプロットマーカーを使用したいと思っています。
現在は以下のプログラムを走らせています。

year <- c(rep(2008, 10), rep(2009,10), rep(2010, 10), rep(2011,10))
x <- rnorm(40)
y <- rnorm(40)
data <- data.frame(year, x, y)

plot(data$x, data$y, type = "n")

temp <- subset(data, data$year == 2008); points(temp$x, temp$y, pch = 0)
temp <- subset(data, data$year == 2009); points(temp$x, temp$y, pch = 1)
temp <- subset(data, data$year == 2010); points(temp$x, temp$y, pch = 2)
temp <- subset(data, data$year == 2011); points(temp$x, temp$y, pch = 5)

しかし、最後の4行を関数化しようと思い以下の通り変更してみましたが、すべてのデータが全てのプロットマーカーで上書きされていくだけで思い通りにいきません。

point.add <- function (year) {
   temp <- subset(data, data$year == year)
   if (year == 2008) { pch = 0 }
   else if (year == 2009) { pch = 1 }
   else if (year == 2010) { pch = 2 }
   else if (year == 2011) { pch = 5 }
   points(temp$x, temp$y, pch =pch)
}

point.add(2008)
point.add(2009)
point.add(2010)
point.add(2011)

うまくいかない原因がわからないので、どなたかご教授いただけないでしょうか。
よろしくお願いいたします。

  • うまくいかない原因は,意図したのとは異なるプログラムになっているからとしかいいようがないですね。
    関数の中で,たとえば year が 2008 の場合に temp <- subset(data, data$year == 2008) と書いた場合と temp <- subset(data, data$year == year) と書いた場合は結果が異なるということです(これはちょっと説明が面倒くさい。下の方の「subsetの仕様について」に説明が書いてありますね。取りあえずは,data の要素の year と 引数の year の混同が原因ということで,引数の year の方を別に year2 とでも書き分ければ期待通り動くでしょう)。
    しかし,今回はもっと単純に以下のように書けばよいということにしておきましょう。
    year <- c(rep(2008, 10), rep(2009,10), rep(2010, 10), rep(2011,10))
    x <- rnorm(40)
    y <- rnorm(40)
    data <- data.frame(year, x, y)
    plot(data$x, data$y, pch = c(0, 1, 2, 5)[data$year-2007])
    余計なことも不要だし,目的通りのことが実現できます。 -- 河童の屁は,河童にあらず,屁である。? 2013-01-07 (月) 10:12:11
  • 河童の屁は,河童にあらず,屁である。 様 ご回答ありがとうございました。 ご指摘の通りにしましたら、うまくいきました。 大変ありがとうございました。 -- Montecarlo? 2013-01-07 (月) 23:14:36

巨大なcsvファイルの一部を読み込みたい

HIROi? (2013-01-04 (金) 02:48:26)

初めて質問させていただく初心者です。read.csvを使って、カラム数23,行数600万件程度のcsvファイルを読み込もうとしたら、memory sizeの限度らしく失敗しました。実行結果(一部省略)は以下の通りです。

EQ <- read.csv("VeryLargeData.csv")
エラー:  サイズ 45.4 Mb のベクトルを割り当てることができません 
追加情報:   14 件の警告がありました (警告を見るには warnings() を使って下さい) 
> warnings()
警告メッセージ: 
1: In scan(file, what, nmax, sep, dec, quote, skip, nlines,  ... :
  Reached total allocation of 1535Mb: see help(memory.size)
 # 中略・・・全く同じメッセージの繰り返し
9: In type.convert(data[[i]], as.is = as.is[i], dec = dec,  ... :
  Reached total allocation of 1535Mb: see help(memory.size)
 # 後略・・・全く同じメッセージの繰り返し、14.まで。

使用したいカラムは「キーとなるコード1カラム+倍精度小数2カラム=合計3カラム」のみなので、「列を間引いて」読み出せれば用は足ります。しかし、最も柔軟にファイルを読み込めると聞くscanのヘルプを見ても、「最初の数行を間引く」方法はあっても、「カラムのうちいくつかだけを読み出す」方法というのはどうも見当たらないように思われます。どなたかご助言をお願いいただけないでしょうか。何卒よろしくお願いします。
投稿における注意事項

  • このような処理は R には不適と思いますが,どうしてもというなら,以下のようなプログラムが参考になるかも知れませんね。 -- 河童の屁は,河童にあらず,屁である。? 2013-01-04 (金) 08:15:41
    con <- file("iris.csv")
    open(con)
    repeat {
    	a <- readLines(con, 1) # 1 行ずつ読んで,
    	b <- as.numeric(unlist(strsplit(a, ","))[1]) # 自分でパースする
    	if (length(b) == 0) break
    	print(b)
    }
    close(con)
  • 早速コメントいただき、ありがとうございます。なるほど、これはやはりRにとっては苦手な処理なのですね。早速試してみたいと思います。今度は処理時間の点で非実用的になりそうですが・・・一昼夜くらいでなんとかなることを祈ります。 -- HIRO? 2013-01-04 (金) 10:31:38
  • その程度の大きさならば64bit版を使うだけで解決するんでは? -- 2013-01-04 (金) 12:41:32
  • 確かに。Mac 64bit 版の R で,ちゃんと読めました。 -- 河童の屁は,河童にあらず,屁である。? 2013-01-04 (金) 13:18:07
  • 別解として、csvファイルから必要なカラムを抜き出して新たにcsvファイルを作成し、そのファイルをRに読み込むという方法もあると思いますよ。 -- 2013-01-04 (金) 14:58:39
    例えば、cutコマンドが使える環境(MacOSXやLinuxなど)なら、2番目、5番目、11番目のカラムが欲しいとき、
    $ cut -f2,5,11 -d"," 元.csv > 新.csv
    として、新.csvを作成してこれをRに読み込む。 PerlでText::CSVを使ってもOK。 cutを使ったときの処理時間は、下記の程度。
    $ wc -l test.csv
    6000001 test.csv
    $ time cut -f2,5,11 -d"," test.csv > test_new.csv
    real	0m8.175s
    user	0m7.460s
    sys	0m0.688s
    さらに、これをRの中で行うと、もう少し時間がかかる。
    > system.time(system('cut -f2,5,11 -d"," test.csv > test_new.csv'))
       ユーザ   システム       経過  
         7.492      0.640     10.167 
  • > csvファイルから必要なカラムを抜き出して新たにcsvファイルを作成し
    だから,そのようなことをするのは R は不得意ということ。 -- 2013-01-04 (金) 15:04:40
  • 1行ずつでなく、一気に読み出しても(メモリサイズ上)問題のない行数を計算し、その行数ごとの読み出しを何回か繰り返しつつ必要な列だけ切り取っていけば、非現実的な処理時間になることはないかとおもうのですが。 -- 2013-01-04 (金) 15:47:03
  • 例えば,gawk が使えるなら,R コンソールで以下のようにすれば,あっという間ですよ。
    上の cut の方がスマートですね。
    いずれにしろ,R はこのようなことは不得意ということ。 -- 河童の屁は,河童にあらず,屁である。? 2013-01-04 (金) 16:01:00
    system("gawk 'BEGIN{FS=\",\"; OFS=\",\"};{print $2, $5, $6}' VeryLargeData.csv > extract.csv")
  • 上のcutを提示した者ですが、一部のカラムだけを読み込む関数を作成してみました。 -- 2013-01-04 (金) 17:08:20
    read.columns.csv <- function(file, columns = NULL, ...){
      if(cmd <- system2("which", args = "cut")) stop("'cut' is not found.")
      if(!missing(columns)){
        out <- tempfile()
        cols <- paste(columns, collapse = ",")
        args <- paste("-f", cols, "-d','", file, ">", out)
        system2("cut", args = args)
        on.exit(file.remove(out))
      }else{
        out <- file
      }
      return(read.csv(out, ...))
    }
    使用例:
    2番目、5番目、11番目のカラムを指定するとき(本番ではhead()はもちろん不要です)、
    > head(read.columns.csv("test1.csv", columns = c(2, 5, 11)), 2)
    /usr/bin/cut
              x1         x4       x10
    1  0.1703623 -0.5631763 -0.734945
    2 -1.4075415 -0.5450647 -1.758273
    カラムを無指定にするとread.csv()と同じ挙動(本番ではhead()はもちろん不要です)。
    > head(read.columns.csv("test1.csv"), 2)
    /usr/bin/cut
      id         x1        x2         x3         x4         x5        x6        x7
    1  1  0.1703623 0.2198511 -1.1616084 -0.5631763 -0.7652493 1.0642631 1.0568743
    2  2 -1.4075415 0.5162073 -0.7501079 -0.5450647 -1.5637246 0.8976396 0.6194357
             x8          x9       x10         x11         x12         x13      x14
    1 1.6138930  0.41030405 -0.734945  1.13511914  0.77816141  0.04144169 0.262109
    2 0.3551278 -0.08129068 -1.758273 -0.05866285 -0.09313449 -1.39641638 1.064553
             x15        x16        x17        x18         x19        x20        x21
    1  1.1631931 -0.6981225 -0.4869349  0.2129322  0.04856178 -0.2846752 -0.9029536
    2 -0.9422174  0.7154750  0.7995136 -1.6102600 -2.92610442 -1.0668136 -1.8331052
             x22        x23
    1  0.6818277  0.4078844
    2 -1.1319291 -1.0523440
    cutコマンドがない環境でも、SQLiteがある環境ならsqldfパッケージのread.csv.sql()を使える模様(驚くほど短時間で600万行を読み込めた)。なお、R-ForgeにはColByColというテキストファイルの一部だけ読み込む専用パッケージもあるみたい(未検証)。
  • 自分の環境を充分に説明しないままのマナー違反な質問にも関わらず丁寧化コメントを多数いただきありがとうございました。申し遅れましたが当方はウインドウズ732bit版しか手元にない素人なのですが、それでも「なにくそ」と挑戦する気になるのに充分過ぎるほどのヒントがいただけました。解決は遠そうですが、御礼申し上げます。 -- 2013-01-05 (土) 00:02:57
  • colbycol というライブラリでは読込列の指定ができますが試されましたか? -- yoro? 2013-01-06 (日) 17:14:03

R言語での多クラス(マルチクラス)分類 boostingについて

tomo? (2013-01-02 (水) 13:00:50)

閲覧ありがとうございます。

私はR言語で学習をしている初心者です。
その中で、irisデータを用いてコマンドの学習をしているのですがエラーが出てしまい先に進めなくなってしまいました。
以下にコマンドを載せますものが私の用いたものです。

library(rpart)
library(adabag)
data <- iris
ndata <- nrow(data)
#乱数指定
set.seed(101)
#学習データ(data.learn)とテストデータ(data.test)に分ける
ridx <- sample(ndata, ndata * 0.5)
data.learn <- data[ridx,]
data.test <- data[-ridx,]
#3-fold crossvalidation、弱識別器の数を10とし、
#学習データに対しboostingを行ったものをdata.adaCvに代入
data.adaCv <- boosting.cv(Species ~ .,data = data.learn,v=3, mfinal = 10)
#テストデータに学習データを照らし合わせる。
resultPredict <- predict(data.adaCv, newdata = data.test, type="class")

というコマンドですが「predict」を行った際に

以下にエラー UseMethod("predict") : 
'predict' をクラス "character" のオブジェクトに適用できるようなメソッドがありません

というエラーが出てしまい、ネットや参考文献を見てもわからず投稿させていただきました。
このエラーの解決方法がお分かりのかたがいらっしゃいましたらよろしくお願いします。
お分かりの方いらっしゃいましたら例文等を添えてコメントいただけたら幸いです。よろしくお願いします。

  • boosting.cv のオンラインヘルプより
    The data are divided into v non-overlapping subsets of roughly equal size. Then, boosting is applied on (v-1) of the subsets. Finally, predictions are made for the left out subsets, and the process is repeated for each of the v subsets.
    新たなデータについて predict できるようなものではないでしょう。
    predict は,実際には predict.list が呼ばれますが,当然ながら,predict.list が期待するようなオブジェクトではないので,そのようなエラーが出ます。debug で実行をトレースしてみるとわかります。 -- 河童の屁は,河童にあらず,屁である。? 2013-01-02 (水) 13:41:18
    > debug(predict)
    > resultPredict <- predict(data.adaCv, newdata = data.test, type="class")
    debugging in: predict(data.adaCv, newdata = data.test, type = "class")
    debug: UseMethod("predict")
    Browse[2]> 
    debugging in: predict.list(data.adaCv, newdata = data.test, type = "class")
    debug: {
        out <- lapply(object, predict, ... = ...)
        if (!is.null(names(object))) 
            names(out) <- names(object)
        out
    }
    Browse[3]> 
    debug: out <- lapply(object, predict, ... = ...)
    Browse[3]> 
    debugging in: FUN(X[[1L]], ...)
    debug: UseMethod("predict")
    Browse[4]> 
     以下にエラー UseMethod("predict") : 
       'predict' をクラス "character" のオブジェクトに適用できるようなメソッドがありません 
  • 河童の屁は,河童にあらず,屁であるさん回答いただきありがとうございました。
    なるほど、新たなデータについて predict することは難しいのですね。
    そこで私は回答を受け、boosting.cv以外の関数でirisデータに対してboosting、交差検定を行い、「predict」を実行したいと考えていたところadabagのパッケージより「boosting」という関数を用いることでboostingができ、rpartのパッケージより「rpart.control」関数の引数xvalより交差検定の数を指定できるのではないかと考えました。
    新たにかいたコマンドとコマンドの実行結果を下に示します。
    ・コマンド
    library(rpart)
    library(adabag)
    data <- iris
    ndata <- nrow(data)
    # 乱数指定~
    set.seed(101)
    # 学習データ(data.learn)とテストデータ(data.test)に分ける
    ridx <- sample(ndata, ndata * 0.5)
    data.learn <- data[ridx,]
    data.test <- data[-ridx,]
    # 弱識別器の数を10、3-fold crossvalidation?学習データに対しboostingを行ったものをdata.adaCvに代入
    data.adaCv <- boosting(Species ~ .,data = data.learn, mfinal = 10,control=rpart.control(xval=3))
    # テストデータに学習データを照らし合わせる。
    resultPredict <- predict(data.adaCv, newdata = data.test, type="class")
    resultPredict
    ・実行結果
    $confusion                Observed Class
    Predicted Class setosa versicolor virginica
         setosa         26          0         0
         versicolor      0         17         3
         virginica       0          1        28
    
    $error
    [1] 0.05333333
    しかし私は先に述べたように交差検定の数をxvalの引数を変えることで変更できると認識していたのですが、xvalの引数を例えば3、5、10と変更しても実行結果に変化がありませんでした。ですがrpartのパッケージのxvalの説明には「number of cross-validations.」と書いてありました。そこで私が質問させていただきたいことは
    1)xval は交差検定の数を示しているのか?
    2)xvalが交差検定の数を示していない場合、その他の関数や引数を用いて交差検定を指定し「predict」ができるのかできるのか?
    という2点です。例文等を示していただけたら幸いです。よろしくお願いします。
  • 投稿における注意事項を参照すべきですね。
    あなたは xval ではなく maxval を指定したのでは?
    control=rpart.control(maxval=3)
    maxval なんていうパラメータはそもそもないし。
    そもそも,cross-validation の数を変えたら結果は変わるものなのか?
    そのほかにも,Species とあるべき所が Especies となっていたりします(修正しておきました)。あなたが R コンソールに入力したものをそのままコピーペーストしてくれないと,あなたの単純なミスなのか使用法が間違えているのかわかりません。 -- 河童の屁は,河童にあらず,屁である。? 2013-01-03 (木) 14:55:04
  • 河童の屁は,河童にあらず,屁である。さんご指摘ありがとうございました。コマンドにはxvalを指定していたのですがここにはミスでmaxvalと記載してしまいました。(maxvalをxvalに訂正しています)また、cross-validation の数を変えると結果(精度)は変わると理論上は学習していたので記載してしまいました。質問文のミス、言葉足らず申し訳ありません。以後気をつけます。 -- tomo? 2013-01-04 (金) 21:36:44

タイムゾーン無指定による時間差計算の誤差

S? (2012-12-28 (金) 11:29:56)

質問を書き込んでいるうちに自己解決しましたので、質問というより、同じ失敗をする人がでないように報告します。

> Sys.Date()
[1] "2012-12-28"

今日は12月28日です。1月27日まで何日あるのか計算しました。

> difftime("2013-01-27", Sys.Date())
Time difference of 29.625 days
> difftime("2013-01-27", "2012-12-28")
Time difference of 30 days

Sys.Date()を使った方はきっちり30日になりません。

> str(Sys.Date())
 Date[1:1], format: "2012-12-28"

Sys.Date()の出力はDateクラスで"2012-12-28"を持っているだけです。

> difftime("2013-01-27", as.Date("2012-12-28"))
Time difference of 29.625 days

2012-12-28をDateクラスにすると再現します。units = "days"を付けても変化はありません。

> difftime("2013-01-27", as.Date("2012-12-28"), tz = "JST")
Time difference of 30 days

タイムゾーンを指定すると30日に戻りました。バックエンドで時間差計算を行ってそのままモデルに放り込んでいるとなかなか気がつかないエラーだと思います(もしかすると、私だけ?)。

スクリプトファイル(拡張子R)の関連付け

yoro? (2012-12-27 (木) 09:03:34)

お世話になります。
Windows7 (32或いは64bit)にて R 2.15.1 を使いっています。

お聞きしたいのは、hogehoge.R というようなスクリプトファイルをダブルクリックすることで、Rを起動させスクリプトを実行させる事は可能でしょうか?(バッチモードとしてではなく)

宜しくお願いします。

交互作用の自由度が統計ソフトによって異なるのはなぜでしょうか

こさく? (2012-12-26 (水) 18:42:17)

いつもお世話になっていますが、初めて投稿します。統計も素人ですがご容赦ください。

2群(a、b群各30名)で、それぞれ直線回帰できるようなデータがあるとします。実際のデータでは平均値には有意な差はなく、a、b群での交互作用(傾きの差)が主な関心事です。

下記は作ったデータですが、yをxとgrpでモデル化しようとしています。下記のモデル1-4のうちモデル1を採用したいと思いましたが、残念ながらgrp:xの有意差が出ませんでした。

ただ結果を見るとgrp:xの自由度が2になっています。浅学ですが、下記モデル2に示されるようにx、grpの自由度がそれぞれ1で、grp:xの自由度も1*1=1でよいのではと思ってしまいます。

他の統計ソフト(JMP)で解析すると、モデル1におけるgrp:xの自由度は期待通り1になっていました。近くの統計の先生にもモデル1におけるgrp:xの自由度は1でいいのではないかと言われました。

都合のいい結果を採用してもよいのですが、もう少し掘り下げることができればと思い投稿させていただきました。

何かコメント等ご指摘いただければ幸いです。

よろしくお願いいたします。

set.seed(1234)
# grp "a" のデータ
x1 <- runif(30)
y1 <- runif(30)+x1*0.3

# grp "b" のデータ
x2 <- runif(30)
y2 <- runif(30)-x2*0.3

x <- c(x1, x2)
y <- c(y1, y2)

# grp (2群のラベル)
grp <- factor(c(rep('a', 30), rep('b', 30)))

library(car) # type3 を指定するのは、問題とは関係ないですが

# ここからが問題
# モデルの固定因子を変えると、交互作用項の自由度が変わる

# モデル 1、grp:x の自由度 2
> Anova(lm(y ~ grp+grp:x), type=3) 
Anova Table (Type III tests)

Response: y
            Sum Sq Df F value    Pr(>F)    
(Intercept) 1.5509  1 20.7241 2.904e-05 ***
grp         0.1585  1  2.1178   0.15118    
grp:x       0.3955  2  2.6423   0.08006 .  
Residuals   4.1908 56                      

# モデル 2、grp:x の自由度 1
> Anova(lm(y ~ x+grp+grp:x), type=3) 
Anova Table (Type III tests)

Response: y
            Sum Sq Df F value    Pr(>F)    
(Intercept) 1.5509  1 20.7241 2.904e-05 ***
x           0.3939  1  5.2640   0.02554 *  
grp         0.1585  1  2.1178   0.15118    
x:grp       0.2338  1  3.1245   0.08257 .  
Residuals   4.1908 56                      

# モデル 3、grp:x の自由度 1
> Anova(lm(y ~ x+grp:x), type=3) 
Anova Table (Type III tests)

Response: y
            Sum Sq Df F value    Pr(>F)    
(Intercept) 2.0111  1  26.357 3.573e-06 ***
x           1.2837  1  16.823 0.0001318 ***
x:grp       2.1557  1  28.251 1.843e-06 ***
Residuals   4.3493 57                      

# モデル 4、grp:x の自由度 2
> Anova(lm(y ~ grp:x), type=3) 
Anova Table (Type III tests)

Response: y
            Sum Sq Df F value    Pr(>F)    
(Intercept) 2.0111  1  26.357 3.573e-06 ***
grp:x       2.4071  2  15.773 3.533e-06 ***
Residuals   4.3493 57
  • それぞれ,Anova(lm(y ~ ほげほげ), type=3) というのを summary(lm(y ~ ほげほげ)) というようにやってみれば,どのようなパラメータ,幾つのパラメータが推定されているかがわかり,その数と Df がどういう関係になっているかがわかるでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2012-12-26 (水) 19:33:36
  • コメントありがとうございます。summaryで出てくるパラメータの数とDfが対応していることがわかりました。なぜモデルにより交互作用項のパラメータの数が変わるかが謎ですが、とっかかりができたのでもう少し勉強してみます。またわからなかったらすいませんがアドバイスお願いいたします。ありがとうございました。 -- こさく? 2012-12-27 (木) 16:43:49

最尤法による共分散構造分析

りすりす? (2012-12-26 (水) 12:17:20)

お世話になっております。

windowsでRを使用しています。
Rで、最尤法による共分散構造分析ができるパッケージはどれなのでしょうか?
semパッケージは、デフォルトで最尤法なのでしょうか?

どなたかわかるかたがいらっしゃれば、ご教授をお願いいたしす。

  • 補足しますと、同じデータを使い、AMOSによる共分散構造分析・最尤法で分析した結果と、SEMパッケージで分析した結果が異なったため、その原因が最尤法にあるのかどうかを調べたのですが、わかりませんでした。 -- りすりす? 2012-12-26 (水) 17:57:17
  • 同じアルゴリズムでも,それを実装するプログラムによっては結果に違いは出てきます。例えば,SEMよりは簡単な因子分析においても,同じプロマックス法によるといっても,プログラムによってはかなり違った結果になったりするようです。ちなみに,例えば因子分析について言えば,R の開発者は「R の因子分析の方がより妥当な結果を与えるのだ」と自慢していたりしたと思います。
    問題を解くに際して,アルゴリズムで結果が異なるというのは理解しがたいかも知れませんが,例えば prcomp と princomp の違いなどというのはまさにそこに理由があるわけです。また,同じアルゴリズムでも,収束計算の場合の収束判定が違えば結果が違っても仕方がない(場合によっては,単調に真値に近づくのではなくある極値を経て別の解に到達するなどと言う場合には,どこで計算を打ち切るかで結果は大違いになる可能性もあります。なお,sem が最尤法によるかどうかということですが,以前のバージョンでは「最尤法による」と書いてあったと思いますが,今は library(help=sem) によれば,"This package contains functions for fitting general linear structural equation models (with observed and unobserved variables) using the RAM approach, and for fitting structural equations in observed-variable models by two-stage least squares." とされています。実際どのような計算が行われているかはソースプログラムをたどるしかないかもしれませんね。 -- 河童の屁は,河童にあらず,屁である。? 2012-12-26 (水) 22:02:33
  • お返事ありがとうございます。AMOSソフトの違いなのですね。HELPを読み、semパッケージでは、objective=objectiveMLを指定すると最尤法になる?ようなのでやってみましたが、やはりAMOSの結果とは異なりました。lavaanパッケージでも、estimator="ML"を指定すると最尤法らしいのでトライしてみたところ、semパッケージとほぼ同じ結果が出ました。AMOSとRの2つのパッケージ、どちらがベターなのかはわかりません。 -- りすりす? 2012-12-26 (水) 23:04:44
  • お返事ありがとうございます。AMOSソフトの違いなのですね。HELPを読み、semパッケージでは、objective=objectiveMLを指定すると最尤法になる?ようなのでやってみましたが、やはりAMOSの結果とは異なりました。lavaanパッケージでも、estimator="ML"を指定すると最尤法らしいのでトライしてみたところ、semパッケージとほぼ同じ結果が出ました。AMOSとRの2つのパッケージ、どちらがベターなのかはわかりません。 -- りすりす? 2012-12-26 (水) 23:04:44
  • お返事ありがとうございます。AMOSソフトの違いなのですね。HELPを読み、semパッケージでは、objective=objectiveMLを指定すると最尤法になる?ようなのでやってみましたが、やはりAMOSの結果とは異なりました。lavaanパッケージでも、estimator="ML"を指定すると最尤法らしいのでトライしてみたところ、semパッケージとほぼ同じ結果が出ました。AMOSとRの2つのパッケージ、どちらがベターなのかはわかりません。 -- りすりす? 2012-12-26 (水) 23:04:45
  • 複数投稿失礼いたしました。ソフトの違いということで、原因はわかりましたので、大変助かりました。お礼申し上げます。 -- りすりす? 2012-12-26 (水) 23:06:32
  • 複数投稿失礼と思うなら,重複分は消去してください(^_^;) -- 河童の屁は,河童にあらず,屁である。? 2012-12-26 (水) 23:23:33

boxplotの図に斜線を入れたい

Saito? (2012-12-21 (金) 21:29:04)

いつもお世話になっております。

boxplot()の図に斜線を入れたいのですが、どうすれば良いでしょうか。boxplot(runif(100), runif(200), runif(300))のそれぞれのグラフで、斜線の種類も変えられると嬉しいですが、とりあえず斜線が引きたいです。

どなたかご存知の方がいらっしゃいましたら、ご教授をお願い致します。

  • boxplot が返すオブジェクトを吟味すればヒントが得られるでしょう。例えば以下のようになるでしょうか? -- 河童の屁は,河童にあらず,屁である。? 2012-12-21 (金) 22:02:46
    a <- boxplot(runif(100), runif(200), runif(300))
    angle.p <- c(45, 135, 30)
    density.p <- c(10, 10 , 20)
    for (i in 1:3) {
    	rect(i-0.4, a$stats[2, i], i+0.4, a$stats[4, i],
                angle=angle.p[i], density=density.p[i])
    }
    boxplot.png
  • 早速の返信ありがとうございました。さすがです。大変うっかりしておりました、legendについて追加質問させてください。例えば、
    a <- boxplot(runif(100), runif(200), runif(300), ylim=c(-1, 3))
    angle.p <- c(45, 135, 30)
    density.p <- c(10, 10 , 20)
    for (i in 1:3) {
    	rect(i-0.4, a$stats[2, i], i+0.4, a$stats[4, i],
                angle=angle.p[i],  density=density.p[i])
    }
    legend(1, 3, c("100", "200", "300"), lty=1)
    などとしたときに、legendの横にも同じ斜線の小さな四角、など表示出来るでしょうか?追加の形になってしまい申し訳ありません。どうぞよろしくお願い致します。 -- Saito? 2012-12-21 (金) 22:11:50
  • 少しは自分で調べましょう。? legend
    lty は必要ないでしょうし。 -- 河童の屁は,河童にあらず,屁である。? 2012-12-21 (金) 23:00:16
    a <- boxplot(runif(100), runif(200), runif(300), ylim=c(-1, 3))
    angle.p <- c(45, 135, 30)
    density.p <- c(20, 20 , 40)
    for (i in 1:3) {
    	rect(i-0.4, a$stats[2, i], i+0.4, a$stats[4, i],
                angle=angle.p[i],  density=density.p[i])
    }
    legend(1, 3, c("100", "200", "300"), angle=angle.p,
           density=density.p)
    boxplot2.png
  • ありがとうございました。関数が返すオブジェクトをいじる習慣がないので、今後勉強します。 -- Saito? 2012-12-21 (金) 23:08:05

barplotにおけるy軸の値

BCD? (2012-12-19 (水) 23:02:56)

いつもお世話になっております。

barplot関数を使ってグラフを作成した時にy軸に自動的に付加される値を取得したいです。
というのも小数点が多くつく場合、y軸が見づらいので10-3乗として表記をしたいからです。
barplotを使う前に元のデータに10の3乗をかけ算しても良いのですが、上記の方法は無いのか知りたいのです。

どうかご教示願います。

  • 既出の解決法でいかが?軸の上付き文字による指数表記について -- 河童の屁は,河童にあらず,屁である。? 2012-12-20 (木) 08:06:52
  • どうもありがとうございます。ついでの質問なのですが、expression関数内で、変数を展開することはできないのでしょうか? -- BCD? 2012-12-21 (金) 00:22:42
  • 変数の展開ってどういうこと? -- 河童の屁は河童にあらず屁である。? 2012-12-21 (金) 09:11:19
  • (変数の内容と数式の組み合わせという意味なら)できます。example(plotmath)で2番目の例を見てください。 -- 2012-12-21 (金) 09:36:51
  • ありがとうございました。おかげで数式を書くことも覚えることができました。 -- BCD? 2012-12-21 (金) 16:26:11

mean関数

sori? (2012-12-19 (水) 14:24:56)

データ解析の勉強を始めたのですが、なぜ警告メッセージが出るのかがわからないので困っています。どなたかよろしくお願いします。

> x <- read.delim("clipboard")
> x
   学生名 性別 順位 国語 数学 英語
1    佐藤    1    5   64   48   78
2    鈴木    1    6   51   65   62
3    高橋    1    4   57   78   68
4    田中    1   14   38   62   42
5    渡辺    0   15   43   78   57
6    伊藤    0   13   52   73   53
7    山本    0    3   58   45   50
8    中村    0    1   72   36   71
9    小林    0   16   65   48   59
10   斉藤    1   17   53   58   35
11   加藤    0   12   30   55   53
12   吉田    0   18   56   72   49
13   山田    1    2   85   65   73
14 佐々木    1   19   69   62   66
15   山口    0   20   52   68   45
16   松本    0   11   55   52   63
17   井上    0    8   45   54   56
18   木村    1    7   61   32   88
19     林    1   10   43   57   43
20   清水    1    9   76   88   97
> attach(x)
> 性別
 [1] 1 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 1 1 1
> class(性別)
[1] "numeric"
> class <- factor(性別)
> class(性別)
[1] "numeric"
> 性別 <- factor(性別)
> class(性別)
[1] "factor"
> mean(x)
学生名   性別   順位   国語   数学   英語 
    NA   0.50  10.50  56.25  59.80  60.40 
 警告メッセージ: 
1: mean(<data.frame>) is deprecated.
 Use colMeans() or sapply(*, mean) instead. 
2: In mean.default(X[[1L]], ...) :
   引数は数値でも論理値でもありません。NA 値を返します 
> mean(国語)
[1] 56.25
> mean(x[,4:6])
 国語  数学  英語 
56.25 59.80 60.40 
 警告メッセージ: 
mean(<data.frame>) is deprecated.
 Use colMeans() or sapply(*, mean) instead. 
  • 「なぜ」という問いにこたえるなら、「data.frameにmeanを適用しているから」です。警告メッセージのままですね。 -- 2012-12-19 (水) 14:53:08
  • ご教示ありがとうございます。列の4〜6の平均(国語、数学、英語)はどのように出せばよいのか教えていただけると嬉しいです。 -- sori? 2012-12-19 (水) 15:56:05
  • colMeansかsapplyを使うようにと書かれていますね -- 河童の屁は河童にあらず屁である。? 2012-12-19 (水) 16:03:45
  • っできました。どうもありがとうございます。> colMeans(x[,4:6]) -- sori? 2012-12-19 (水) 16:37:59

floor(2.3*100)

so? (2012-12-19 (水) 13:50:56)

下記計算結果が導出される理由が分からず困っています。
ご教示いただけると幸いです。

> floor( c( 230, 2.3*100, 2.3*10*10 ) )
[1] 230 229 230
> floor( c( 230000, 2.3*100000, 2.3*100*1000, 2.3*1000*100 ) )
[1] 230000 229999 229999 230000
  • コンピュータにおける実数(整数及び2の冪数の和からなる数を除く)は,「近似値」であるためです。2.3 はコンピュータ上(数は,2進数で表される)では,循環小数です。それを100倍しても正確に 230 にはなりません。わずかに230 より小さいために小数点以下を切り捨てると 229 になります。じゃあ,2.3 を 10 倍して更に10倍しても同じではないかということですが,これは,2.3 の10倍の近似値がたまたま丸めによって23になるためです(近似値といっても,常に近似値ということではなく,たまたま正しい値になることもある)。後の例も全て同じ理由からあなたが思うのと異なる値になるのです。結論としては,コンピュータでの計算は紙と鉛筆と頭で計算したのとは異なることがあるということ。それに関連して,if 文などで実数と特定の定数を比較するときには注意が必要ということ。 -- 河童の屁は,河童にあらず,屁である。? 2012-12-19 (水) 13:55:31
    > sprintf("%a", 2.3)
    [1] "0x1.2666666666666p+1"
    > sprintf("%a", 2.3*100)
    [1] "0x1.cbfffffffffffp+7"
    > sprintf("%a", 230)
    [1] "0x1.ccp+7"
    > sprintf("%a", 2.3*10)
    [1] "0x1.7p+4"
    > sprintf("%a", 23)
    [1] "0x1.7p+4"
    > sprintf("%a", 0.125)
    [1] "0x1p-3"
  • 河童さん、分かりやすい解説ありがとうございました。 -- so? 2012-12-19 (水) 14:13:23

軸のラベルの向きを斜めに変更する方法

BCD? (2012-12-17 (月) 12:44:46)

いつもお世話になっております。
グラフを描く時に、lasオプションを指定すればラベルの向きを変更することができますが、軸に対して斜め(45℃くらい角度をつける)にラベルを配置することはできないのでしょうか?

どうかご教示願います。

  • ? par で srt の項を見ればよいでしょう。(crt の項も) -- 河童の屁は,河童にあらず,屁である。? 2012-12-17 (月) 14:27:40
  • 便乗質問で申し訳ありませんが、axisもmtextもsrtやcrtは利かないように思います。textでxpd=NAでやるのも手ですが、プロットの内容の関係でxpd=TRUEにしておきたいことも多いでしょう。srtとcrtパラメータを使って、具体的にどのようなコードで軸ラベルやアノテーションを斜めにすることができますか?よろしくお願いします。 -- 2012-12-17 (月) 15:27:17
  • xpd=TRUE は必要なときだけに指定することができますよ。つまり,par(xpd=FALSE) としておいて,必要なときのみ text(..., xpd=TRUE) とする。xpd 引数を指定できる関数すべてについていえることです。-- 河童の屁は,河童にあらず,屁である。? 2012-12-17 (月) 15:48:50
  • 河童さんじゃないけど、こんな感じはどうでしょう -- 2012-12-17 (月) 15:55:17
    set.seed(1234)
    a <- barplot(runif(12))
    text(a, -.01, month.name, srt = 45, adj = c(1, 1), xpd = TRUE)
    rotated.png
  • こんなのも。
    a <- hist(rnorm(1000), xaxt="n", xlab="", main="")
    text(a$breaks+0.1, -2.5, a$breaks, srt=45, pos=1, xpd=TRUE)
    hist.png
  • みなさまありがとうございます。textではできましたがmtextだとできないのですね...できれば便利なんですけど。 -- BCD? 2012-12-17 (月) 16:30:01
  • ですよね…
    > mtextだとできないのですね...できれば便利なんですけど。
    あたまがかたいだけなんでしょうが、mtextというものがあるのに、plotリージョン外の作図にtextを使うのがなんとなく違和感で… -- 2012-12-17 (月) 20:30:51
  • 変態的(?)なグラフが欲しいときには、plotrixパッケージのことも思い出してあげてください。 -- 2012-12-18 (火) 19:31:34
    library(plotrix)
    set.seed(1234)
    plot(runif(12), runif(12), xlab = "", xlim = c(0, 1),
         ylim = c(0, 1), axes = FALSE)
    ly <- round(c(0, (1:12)/12), 3)
    lx <- ly[-13]
    axis(1, at = lx, labels = rep("", 12), tck = -0.02)
    staxlab(1, lx, month.name, srt = 45)
    axis(2, at = ly, labels=rep("", 13))
    staxlab(2, ly, ly, srt = 45)
    box()
staxlab01.png
  • 「なんかパッケージがあったハズ」という気はしていたのですが、plotrixという名でしたか。 -- 2012-12-18 (火) 21:26:24
  • こんなパッケージもあるんですね!ありがとうございます -- BCD? 2012-12-20 (木) 21:47:48

(多クラスのカテゴリデータでベイジアンネット)dealのautosearchでエラー

yamaguchi? (2012-12-16 (日) 17:27:44)

はじめまして。いつもお世話になっています。
初投稿という事で至らない点もあるかと思いますが、よろしくお願いします。

dealパッケージで多クラスのカテゴリデータでベイジアンネットワークを作成しようとしたところ、autosearch関数で下記のエラーが発生しました。

>autosearch(dat.pre_net, dat.dummy, dat.prior)
以下にエラー apply(prior$jointalpha, didx, sum) :                                                     
 dim(X) must have a positive length

どのように解決したらよいか、ご助言をいただけますか。

以下実行手順です。

# サンプルとして成績データ作成
eng <- c("A", "B", "C", "C", "B", "D")
math <- c("B", "B", "C", "A", "B", "D")
sci <- c("A", "A", "B", "D", "B", "B")
res <- c("A", "B", "C", "C", "B", "C")
dat <- data.frame(eng, math, sci, res)
dat
  eng math sci res
1   A    B   A   A 
2   B    B   A   B
3   C    C   B   C 
4   C    A   D   C
5   B    B   B   B
6   D    D   B   C 

青木氏のサイトのqt3, make.dummyを参考にして、カテゴリデータをダミーデータに変換。
上記サンプルではダミーデータに変換しなくてもネットワークを描画できたのですが、自分のデータではjointprior関数を実行する際に "too large than due to tequnical limitations in R"というエラーが起き、オブジェクトのサイズを減らすためにダミーデータに変換することにしました。

dat.int <- dat
dat.int[,1:ncol(dat)] <- lapply(dat, as.integer) # カテゴリを数値に変換
cat <- sapply(dat.int, max) # 各列が持つ水準の個数を保存
cname <- unlist(sapply(dat.int, levels)) # 水準の名称を保存
dat.colnames <- colnames(dat.int)
dat.dummy <- make.dummy(dat.int)
colnames(dat.dummy) <- paste(rep(dat.colnames, cat), cname, sep=".")
           # 列名.水準 というカラム名を設定

library('deal')
dat.pre_net <- network(dat.dummy)
dat.prior <- jointprior(dat.pre_net, 20)
dat.dist <- learn(dat.pre_net, dat.dummy, dat.prior)
# 有効辺ノードの設定
res_list <- grep("res.*", colnames(dat.dummy))
           # このノードからは有効辺を引かない
[1] 12 13 14
# res → res以外への有効辺を引かないようにする
dat.col_num <- 1:length(colnames(dat.dummy))
         # 各ノードを数字のベクトルで取得
dat.no_res <- length(dat.col_num) - length(res_list)
         # resがつかないカラム名の個数を取得

a <- sort(rep(res_list,length(colnames(dat.dummy))))
    # res_listの各要素をカラム数分繰り返したベクトルを
    # ソート(有効辺が出てはいけないノード)
b <- 1:length(colnames(dat.dummy)) # 有効辺が入るノード
dat.ban <- cbind(a, b)
# 12,12などの重複を削除
dat.ban_df <- as.data.frame(dat.ban)
colnames(dat.ban_df) <- c("a", "b")
dat.ban_df[dat.ban_df$a == dat.ban_df$b,] <- c(NA, NA)
dat.ban_df <- na.omit(dat.ban_df)

# 有効辺を引かないノードリストの設定を適用
dat.pre_net <- getnetwork(dat.dist)
banlist(dat.pre_net) <- as.matrix(dat.ban_df)
# モデル探索
dat.posterior <- autosearch(dat.pre_net, dat.dummy,
                            dat.prior)
 以下にエラー apply(prior$jointalpha, didx, sum) :                                                     
 dim(X) must have a positive length

debug関数でautosearch()の処理を追って見ましたが、私には原因がわかりませんでした。
読みづらい点もあるかと思いますが、対処策・アドバイスのほど、よろしくお願いします。

また、実行環境は下記のとおりです。

>sessionInfo()                                                                                        
R version 2.14.1 (2011-12-22)                                                                          
Platform: x86_64-pc-linux-gnu (64-bit)                                                                 
locale:                                                                                                
 [1] LC_CTYPE=ja_JP.UTF-8       LC_NUMERIC=C                                                           
 [3] LC_TIME=ja_JP.UTF-8        LC_COLLATE=ja_JP.UTF-8                                                 
 [5] LC_MONETARY=ja_JP.UTF-8    LC_MESSAGES=ja_JP.UTF-8                                                
 [7] LC_PAPER=C                 LC_NAME=C                                                              
 [9] LC_ADDRESS=C               LC_TELEPHONE=C                                                         
 [11] LC_MEASUREMENT=ja_JP.UTF-8 LC_IDENTIFICATION=C                                                    
attached base packages:                                                                                
 [1] stats     graphics  grDevices utils     datasets  methods   base                                   
other attached packages:                                                                               
 [1] deal_1.2-35
  • Mac 版,64bit R 2.15.2 では,エラーなく結果が出ましたけど(正しい結果かどうかはわからない)。まずは,R 2.15.2 と最新のパッケージでやってみればいかが? -- 河童の屁は,河童にあらず,屁である。? 2012-12-17 (月) 09:09:49
  • WIndows 版,R 2.15.1 だけど,ちゃんと結果が出ましたが? -- 河童の屁は,河童にあらず,屁である。? 2012-12-17 (月) 16:07:07
  • 河童の屁は,河童にあらず,屁である。様 ご指摘の通り試してみると、うまく動きました。ありがとうございます。最新版で試すという発想が出来なかったことがお恥ずかしい限りです。 -- yamaguchi? 2012-12-17 (月) 16:32:46

package(e1071)におけるsvmについて

t.h? (2012-12-13 (木) 17:28:14)

はじめまして。よろしくお願いします

題名の通りですが、package(e1071)におけるsvmについて質問があります。
私の最終的な目的は「1つのクラスに対して間違いを許さない2クラス判別を行うsvmをつくる」です。
(クラスAとBがあるとして、テストデータを入れたときにAがBと判定されることは許すが、BがAと判定することは許されないSVM、という意味です)

(1)このsvmに訓練データとしてデータを入れるとき、その順番は関係あるのでしょうか?
(e.g)「クラスA,クラスBという順番で入っている行列を訓練データと与えたとき」と、「クラスB,クラスAという順番で入っている行列を訓練データと与えたとき」に構成されるSVMは違うものになるのでしょうか?

(2)このsvmはデフォルトで実行すると、ソフトマージンsvm(最大マージンsvm)のようですが、ハードマージンsvmにするにはどのようにすればよいでしょうか?

(3)目的を達成するために、デフォルトのSVMからどのようにすればよいでしょうか?

(4*)デフォルトのsvmに3クラス以上のデータを訓練させた場合は1vs1式でのクラス分けなのか、1vsOtrhers式でのクラス分けなのかを教えていただきたいです

段々と抽象性の高い質問になっておりますが、((4)だけ別系統の質問です)最終的な目的を達成するにあたり、有用であればどの様な回答でも構いません。

見当違いの質問、読みづらい文章かもしれませんが、ご回答よろしくお願いします。

  • (1) はcross validationでランダムにシャッフルするので、入力データが変われば結果が違うことも有りうるでしょう -- 2012-12-24 (月) 08:42:19
  • (2)(3)はcostとclass.weightのパラメータを操作することで目的に近いことができないでしょうか。 -- 2012-12-24 (月) 08:42:48
  • (4)は1vs1です。 http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f419 -- 2012-12-24 (月) 08:43:00

SEM の summary

しまりす? (2012-12-07 (金) 19:14:06)

お世話になります。

SEMパッケージの練習のため、下記URLの「食物とガン」の共分散分析を自分でやってみました。
http://wwwhum.meijo-u.ac.jp/labs/hh002/r/content/sem.html

共分散の結果は出せたのですが、最後のsummary()による適合度の出力ができませんでした。
summary(データ名)と入力しても、何も出力されず、エラーメッセージも出ません。

以下がプログラムと出力結果です。

> # ガンデータのSEM #
> 
> setwd("C:/Users/a2122062/work")
> gandat <- read.table("gan.csv", sep=",", header = TRUE)
> 
> # 相関行列を求める #
> soukan <- cor(gandat)
> soukan
            calory      niku       nyu      sake    daicho  chokucho
calory   1.0000000 0.7731109 0.7155250 0.6341241 0.7394903 0.8100869
niku     0.7731109 1.0000000 0.7227997 0.4515933 0.8526245 0.6718607
nyu      0.7155250 0.7227997 1.0000000 0.2321334 0.5787253 0.4785180
sake     0.6341241 0.4515933 0.2321334 1.0000000 0.5881328 0.6095649
daicho   0.7394903 0.8526245 0.5787253 0.5881328 1.0000000 0.7523879
chokucho 0.8100869 0.6718607 0.4785180 0.6095649 0.7523879 1.0000000
> 
> # 共分散する#
> library(sem)
 要求されたパッケージ MASS をロード中です 
 要求されたパッケージ matrixcalc をロード中です 
 警告メッセージ: 
1:  パッケージ '‘sem’' はバージョン 2.15.2 の R の下で造られました  
2:  パッケージ '‘matrixcalc’' はバージョン 2.15.2 の R の下で造られました  
> modelA.gan <- specify.model()
1: 洋食傾向 -> calory ,b11 ,NA
2: 洋食傾向 -> niku ,b21 ,NA
3: 洋食傾向 -> nyu ,b31 ,NA
4: 洋食傾向 -> sake ,b41 ,NA
5: 消化管ガン -> daicho ,NA ,1
6: 消化管ガン -> chokucho ,b62 ,NA
7: 洋食傾向 -> 消化管ガン,g21,NA
8: calory <-> calory ,e1 ,NA
9: niku <-> niku ,e2 ,NA
10: nyu <-> nyu ,e3 ,NA
11: sake <-> sake ,e4 ,NA
12: daicho <-> daicho ,e5 ,NA
13: chokucho <-> chokucho ,e6 ,NA
14: 洋食傾向 <-> 洋食傾向 , NA , 1
15: 消化管ガン <-> 消化管ガン , delta2,NA
16: 
Read 15 records
 警
'specify.model' is deprecated.
Use 'specifyModel' instead.
See help("Deprecated") and help("sem-deprecated"). 
> 
> semgan <- sem(modelA.gan , soukan, N=47)
> std.coef(semgan, digit=3)
          Std. Estimate                           
1     b11    0.90353083       calory <--- 洋食傾向
2     b21    0.88860193         niku <--- 洋食傾向
3     b31    0.72052466          nyu <--- 洋食傾向
4     b41    0.61993727         sake <--- 洋食傾向
5            0.89590512     daicho <--- 消化管ガン
6     b62    0.83980749   chokucho <--- 消化管ガン
7     g21    0.98052591   消化管ガン <--- 洋食傾向
8      e1    0.18363205         calory <--> calory
9      e2    0.21038661             niku <--> niku
10     e3    0.48084422               nyu <--> nyu
11     e4    0.61567779             sake <--> sake
12     e5    0.19735401         daicho <--> daicho
13     e6    0.29472337     chokucho <--> chokucho
14           1.00000000     洋食傾向 <--> 洋食傾向
15 delta2    0.03856894 消化管ガン <--> 消化管ガン
 警告メッセージ: 
'std.coef' is deprecated.
Use 'stdCoef' instead.
See help("Deprecated") and help("sem-deprecated"). 
> summary(semgan)
> 

なぜなのでしょうか?
もしかしたらとても簡単なミスかもしれないのですが、どうぞよろしくお願いいたします。

  • 「とても簡単なミス」ですね。summary の閉じ括弧が全角ですよ。エラーメッセージも出ないので,気づきにくいですけど。 -- 河童の屁は,河童にあらず,屁である。? 2012-12-08 (土) 09:56:52
  • 本当ですね。全角でした。半角にして解決しました。大変失礼いたしました。。。お礼申し上げます。 -- しまりす? 2012-12-13 (木) 17:37:28

lavaanパッケージによる多母集団分析のGFI,AGFIの出力

さとし? (2012-12-04 (火) 21:46:32)

お世話になります。Windows7のR 2.15.2を使っております。

lavaanパッケージで多母集団分析を行いました。

lav.model.1 <- lavaan(model.1, data=d1, model.type="sem",
group="group", int.ov.free=TRUE, auto.var=TRUE, auto.fix.first=TRUE,
fixed.x=FALSE, auto.cov.lv.x=FALSE,  auto.cov.y=FALSE)
summary(lav.model.1, fit.measure=TRUE, standardized=TRUE)

このようなオプションでsummaryを出力したところ,色々な適合度が表示されるのですが,GFIやAGFIが出力されません。

そこで質問なのですが,

1.GFIやAGFIの出力を可能にするオプションはあるのでしょうか?
2.GFIやAGFIの算出に必要な共分散行列を出力することはできるのでしょうか?
3.あるいは,出力された他の適合度指標からGFIやAGFIを式展開などで導出することは可能でしょうか?

よろしくお願いいたします。

  • semToolsパッケージにあるmoreFitIndices?関数で計算できませんか。 -- 2012-12-05 (水) 12:30:50
  • ご回答ありがとうございます。 moreFitIndices?を使って,以下のように入力しました。
    moreFitIndices(lav.model.1)
    すると,nfi,ifi,gfi*,agfi*,ciac,ecvi,bic*,hqc,sicが出力されました。
    GFIやAGFIらしきものが出たと喜んでいたのですが,少し調べたところgfi*とagfi*は「Goodness of Fit Indices」ではなく,gamma hatというもののようで,定義式もGFIとは別のものでした。
    結果として,残念ながらmoreFitIndicies?関数では,目当てのGFI・AGFIは出力されませんでした。
    申し訳ございません。 -- さとし? 2012-12-05 (水) 16:43:23

x軸ラベルの回転について

れこ? (2012-12-04 (火) 15:45:58)

お世話になります。WindowsのR 2.15.1を使っています。

y <- rnorm(20)
x <- factor(rep(c("AAAAA","BBBBB"),10))
stripchart(y ~ x, vertical=TRUE)

このとき、x軸のラベルを反時計回りに90度回転させたグラフにしたいのですが、どのようにすればよいでしょうか?

宜しくお願いします。

  • こういうことでしょうか? -- Saito? 2012-12-04 (火) 15:50:44
    y <- rnorm(20)
    x <- factor(rep(c("AAAAA","BBBBB"),10))
    stripchart(y ~ x, vertical=TRUE, las=2)
  • ありがとうございました。まさにそのとおりです。getS3method("stripchart","default")で使用できる引数を見たのですが、lasが含まれていなかったのでどうすればよいのかと思っていました。 -- れこ? 2012-12-04 (火) 17:39:48
  • そういうときは,「? par」をするのです。 -- 河童の屁は,河童にあらず,屁である。? 2012-12-04 (火) 17:41:57

一定時間が過ぎると新規個体群が入ってくる生物の生活史シミュレーションの高速化をしたい

Saito? (2012-12-04 (火) 11:34:01)

いつもお世話になっております。
ある生物が、時間が経つに連れて大きくなり、一定時間が過ぎると子供を産んで(子の数は固定)次の新しい年級群が加入し、自然に死んだりたまに捕獲される、という生活史をシミュレーションしたいと思っています。ただ、プログラムに問題があり、大変時間がかかります。下記は私が作った例なのですが、新規に年級群が入るというイベントをif文で書いてしまっています。 実際には、時間も年級群の数ももっとべらぼうに多いですし、パラメタの値を色々変えて検討したいので、素早く計算出来るよう今よりも高速化をしたいと考えております。しかし、私の文法がへたくそなせいで、これ以上は高速化が出来ません。どなたかご教授頂けますと幸いです。

Size <- seq(0.1, 30, by=0.5) #個体のサイズ分布
year <- 40 #時間
class <- 3 #生物の年級群の数

M <- catch <- matrix(0, ncol=year*class, nrow=length(Size))

###Catchは既知のデータ###
catch[, 5] <- rpois(length(Size), lambda=2)
catch[, 10] <- rpois(length(Size), lambda=3)
catch[, 56] <- rpois(length(Size), lambda=4)
catch[, 77] <- rpois(length(Size), lambda=5)
catch[, 105] <- rpois(length(Size), lambda=6)

SS1 <- matrix(NA, nrow=length(Size), year*class)
SS2 <- matrix(NA, nrow=length(Size), year*class)
SS3 <- matrix(NA, nrow=length(Size), year*class)

m1 <- runif(year*class, 0, 1) #平均成長の値(時間変化する)
m2 <- runif(year*class, 5, 10)
m3 <- runif(year*class, 15, 20)

sd1 <- runif(year*class, 1, 5) #平均成長の分散(時間変化する)
sd2 <- runif(year*class, 1, 3)
sd3 <- runif(year*class, 1, 2)

surv1 <- runif(year*class, 0.9, 0.99) #生存率(時間変化する)
surv2 <- runif(year*class, 0.9, 0.99)
surv3 <- runif(year*class, 0.9, 0.99)

###シミューション開始###
M[1, 1] <- S2 <- S3 <- 40000
for(i in 2 : (year*class)){
if (i <= year) {
A1 <- dnorm(Size, mean=m1[i], sd=sd1[i])
G1 <- sample(Size, sum(M[, i-1]), prob=A1/sum(A1), rep=T)
M[, i] <- 
SS1[, i] <- rbinom(rep(1, length(Size)),
                   table(cut(G1, breaks=c(Size, max(Size) + 0.5))), 
                   prob=surv1[i])

M[, i] <- M[, i] - catch[, i]
M[which(M[, i] < 0), i] <- 0
S1 <- M[, i]

} else { #次の年級群が加わってくる
if (i > year & i <=(year*2+13)) {
A1 <- dnorm(Size, mean=m1[i], sd=sd1[i])
A2 <- dnorm(Size, mean=m2[i], sd=sd2[i])

G1 <- sample(Size, sum(S1), prob=A1/sum(A1), rep=T)
G2 <- sample(Size, sum(S2), prob=A2/sum(A2), rep=T)

S1 <- SS1[, i] <- rbinom(rep(1, length(Size)),
                         table(cut(G1, breaks=c(Size, max(Size) + 0.5))), 
                         prob=surv1[i])
S2 <- SS2[, i] <- rbinom(rep(1, length(Size)),
                         table(cut(G2, breaks=c(Size, max(Size) + 0.5))), 
                         prob=surv2[i])

S1 <- S1 - round(catch[, i]*(SS1[, i]/(SS1[, i]+SS2[, i])))
       #それぞれの年級群の数に比例した値で捕獲
S2 <- S2 - round(catch[, i]*(SS2[, i]/(SS1[, i]+SS2[, i])))
S1[which(is.na(S1))] <- 0
S2[which(is.na(S2))] <- 0

M[, i] <- S1 + S2
M[which(M[, i] < 0), i] <- 0
} else { #また次の年級群が加わってくるが、加わるタイミングが違う
if (i > (year*2+13)) {
A1 <- dnorm(Size, mean=m1[i], sd=sd1[i])
A2 <- dnorm(Size, mean=m2[i], sd=sd2[i])
A3 <- dnorm(Size, mean=m3[i], sd=sd3[i])

G1 <- sample(Size, sum(S1), prob=A1/sum(A1), rep=T)
G2 <- sample(Size, sum(S2), prob=A2/sum(A2), rep=T)
G3 <- sample(Size, sum(S3), prob=A3/sum(A3), rep=T)

S1 <- SS1[, i] <- rbinom(rep(1, length(Size)),
                         table(cut(G1, breaks=c(Size, max(Size) + 0.5))), 
                         prob=surv1[i])
S2 <- SS2[, i] <- rbinom(rep(1, length(Size)),
                         table(cut(G2, breaks=c(Size, max(Size) + 0.5))), 
                         prob=surv2[i])
S3 <- SS3[, i] <- rbinom(rep(1, length(Size)),
                         table(cut(G3, breaks=c(Size, max(Size) + 0.5))), 
                         prob=surv3[i])
S1 <- S1 - round(catch[, i]*(SS1[, i]/(SS1[, i]+SS2[, i]+SS3[, i])))
S2 <- S2 - round(catch[, i]*(SS2[, i]/(SS1[, i]+SS2[, i]+SS3[, i])))
S3 <- S3 - round(catch[, i]*(SS3[, i]/(SS1[, i]+SS2[, i]+SS3[, i])))

S1[which(is.na(S1))] <- 0
S2[which(is.na(S2))] <- 0
S3[which(is.na(S3))] <- 0

M[, i] <- S1 + S2 + S3
M[which(M[, i] < 0), i] <- 0
}}}}
###シミューション終わり###
###得たいもの1###
SS1[is.na(SS1)] <- 0
SS2[is.na(SS2)] <- 0
SS3[is.na(SS3)] <- 0
SS <- SS1 + SS2 + SS3 
SS[, c(5, 10, 56, 77, 105)]
   #(既知データである)捕獲があった時点での
   #捕獲前の推定個体数の総和

###得たいもの2###
M #捕獲を考慮して計算を続けたときの推定個体数 
  • i は 2 から year * class までで,それが 3 区間に分かれるわけですね?
    別に if で分岐処理しなくて,3 区間ごとに for ループを作ってやればよいのでは?
       for (i in 2:year) {
           最初の年級群
       }
       for (i in (year+1):(year * 2 + 13)) {
           次の年級群
       }
       for (i in (year * 2 + 14):(year * class)) {
           また次の年級群
       }
    もっとも,そのようにしても全然速くならない。当然だ,if-else 判定はたかだか 120 回しか行われないのだから,大勢に影響はない(結果が同じになることは確かめた)。もっと他の箇所を最適化しないと。 -- 河童の屁は,河童にあらず,屁である。? 2012-12-04 (火) 13:11:09
  • 早速のご回答ありがとうございます。実際はclassに当たる部分が20ほどになっておりまして、例のようなプログラムの書き方では間違いや修正がしたくとも一苦労です。 それぞれの年級群で使う関数形は(パラメタは違うとはいえ)同じですし、子の数や加入のタイミングもばらばらとはいえ、外から与えられるのですから、上手い事プログラムを書けばfor()やifを多用せずとも同じことが出来ないか、と考えております。 どこか最適化出来そうな場所があれば、部分的でも結構ですので、ご教授ください。そこから何か道が開けるかもしれません。例えば、オブジェクトA1-A3, G1-G3, S1-S3はそれぞれlapplyを使って一括で書けないか努力したのですが、巧くいかず、でした。 -- Saito? 2012-12-04 (火) 13:39:58
  • lapply ではなくて mapply を使うのです。たとえば,
    A1 <- dnorm(Size, mean=m1[i], sd=sd1[i])
    A2 <- dnorm(Size, mean=m2[i], sd=sd2[i])
    A3 <- dnorm(Size, mean=m3[i], sd=sd3[i])
    A123 <- mapply(function(m, s) dnorm(Size, m, s),
                   c(m1[i], m2[i], m3[i]), c(sd1[i], sd2[i], sd3[i]))
    とするようなこと。平均値ベクトル,標準偏差ベクトルを c でつながなくてもよいように, m1, m2, m3 をひとまとめに行列で用意するなどというのも無意味でしょうね。結局,速度は全く影響を受けないでしょう。
    dnorm とか sample とか rbinom をなるべく纏めて計算するなどができれば少しは速くなるかな?
    S1 <- S1 - round(catch[, i]*(S1/(S1+S2)))
    S2 <- S2 - round(catch[, i]*(S2/(S1+S2)))
    S3 <- S3 - round(catch[, i]*(S3/(S1+S2)))
    などは,S1, S2, S3 をベクトルではなく行列として使えばよいかも。おっと,S2 を計算するときには,直前に更新された S1 の結果を使うのですか(S3 も同じく?)... -- 河童の屁は,河童にあらず,屁である。? 2012-12-04 (火) 13:57:56
  • ご回答ありがとうございます。最初に明言しておかなかったので申し訳ないのですが、高速化の効果が薄くとも、修正がしやすい、という点においてコンパクトなプログラムは有難いです。私の書き方ですと、classの数だけ書き足さなくてはならず、その点でも困っております。 -- Saito? 2012-12-04 (火) 14:16:36
  • すみません、それはバグですね(汗)もともとの投稿を修正しました。直前に更新せず、
    S1 <- S1 - round(catch[, i]*(SS1[, i]/(SS1[, i]+SS2[, i]+SS3[, i])))
    のように、保存しておいた更新前のものを使ってcatchの影響をそれぞれの年級群に与えます。-- Saito? 2012-12-04 (火) 14:17:49
  • > 高速化の効果が薄くとも、修正がしやすい、という点においてコンパクトなプログラム
    そういうことならば,話は別。
    「変数名+数字」というようなところは全て一つの行列・配列にする。それぞれの要素をアクセスするのにベクトル演算が使えるかもしれないしそうでなくて for でアクセスしても,たかがしれている(と思う)。
    たとえば,
    catch[, 5] <- rpois(length(Size), lambda=2)
    catch[, 10] <- rpois(length(Size), lambda=3)
    catch[, 56] <- rpois(length(Size), lambda=4)
    catch[, 77] <- rpois(length(Size), lambda=5)
    catch[, 105] <- rpois(length(Size), lambda=6)
    catch[, c(5, 10, 56, 77, 105)] <- sapply(2:6,
        function(lambda) rpois(length(Size), lambda=lambda))
    # 2:6 の部分も実際は c(xxx, yyy, zzz,...) みたいなことだろうから
    また,
    m1 <- runif(year*class, 0, 1) #平均成長の値(時間変化する)
    m2 <- runif(year*class, 5, 10)
    m3 <- runif(year*class, 15, 20)
    sd1 <- runif(year*class, 1, 5) #平均成長の分散(時間変化する)
    sd2 <- runif(year*class, 1, 3)
    sd3 <- runif(year*class, 1, 2)
    m123 <- mapply(function(min, max) runif(year*class, min, max),
                   c(0, 5, 15), c(1, 10, 20))
    sd123 <- mapply(function(min, max) runif(year*class, min, max),
                   c(1, 1, 1), c(5, 3, 2))
    とか。そうすれば,前に書いた
    A123 <- mapply(function(m, s) dnorm(Size, m, s),
                   c(m1[i], m2[i], m3[i]), c(sd1[i], sd2[i], sd3[i]))
    A123 <- mapply(function(m, s) dnorm(Size, m, s), m123[i,], sd123[i,])
    のようになる。
    要するに,少し違うけどほとんど同じという部分は 1 行で書ける。100 行書くところが 1 行で終われば,間違いが少なくなるし,見通しがよくなるし,直しやすくなる。それが「プログラム」というもの。 -- 河童の屁は,河童にあらず,屁である。? 2012-12-04 (火) 14:25:39
  • 最初に申し上げておくべきでした。お手数をおかけして申し訳ありません。特に、classの数だけプログラムを追加する今の書き方をやめたいです。その部分について、何か良い書き方を教えていただければ大変うれしいです。修正しやすくコンパクトな(そしてあとで読んでわかりやすければ最高です)書き方で同じことが出来れば幸いです。 -- Saito? 2012-12-04 (火) 15:00:30
  • しつこくて申し訳ありません。例えば下記のプログラムって、もっとコンパクトに書けないでしょうか・・・?-- Saito? 2012-12-05 (水) 12:10:25
    a <- b <- c <- d <- matrix(NA, 10, 6)
    for(i in 1 : 2) {
    a[, i] <- rnorm(10, mean=0, sd=1)
    d[, i] <- a[, i]
    }
    
    for(i in 3 : 4) {
    a[, i] <- rnorm(10, mean=1, sd=2)
    b[, i] <- rnorm(10, mean=0, sd=1)
    d[, i] <- a[, i] + b[, i]
    }
    
    for(i in 5 : 6){
    a[, i] <- rnorm(10, mean=2, sd=3)
    b[, i] <- rnorm(10, mean=1, sd=2)
    c[, i] <- rnorm(10, mean=0, sd=1)
    d[, i] <- a[, i] + b[, i] + c[, i]
    }
    
    #このくらいしか思いつきません。for()消せないですかねぇ・・・↓
    d <- matrix(NA, 10, 6)
    for(i in 1 : 2) {
    d[, i] <- rnorm(10, mean=0, sd=1)
    }
    
    for(i in 3 : 4) {
    d[, i] <-  apply(mapply(function(mean, sd)
        rnorm(10, mean, sd), c(1, 0), c(2, 1)), 1, sum)
    }
    
    for(i in 5 : 6){
    d[, i] <- apply(mapply(function(mean, sd)
       rnorm(10, mean, sd), c(2, 1,0), c(3, 2,1)), 1, sum)
    }
  • たぶん,以下のプログラムであっていると思うのだけど。
    アルゴリズム + データ構造 ==> プログラム
    アルゴリズムとデータ構造それぞれが互いに便利なように作る必要があるということです。
    データ構造に合うようにプログラムを書く。プログラムが書きやすいようにデータ構造を決める。修正しやすいようにデータ構造を決める。
    データ構造として,正規乱数のパラメータ mean, sd を以下のように作る。
    i は第一引数,第二引数は a, b, c, ... などを 1, 2, 3, ...に対応させ,j で参照。
    行列であるが実際には列優先のベクトルとして使う。
    i = 4, j = 2 は 元の記法だと a[, 4] で,N(0, 1^2) に従う正規乱数のこと。
    ただし,i=1, j=3 などは,sd = 0(そのような正規乱数はない)の場合には 0 を返す。
    set.seed(1234567)
    Mean <- matrix(c(
         # a  b  c
    	0, 0, 0,  #  i = 1
    	0, 0, 0,  #  i = 2
    	1, 0, 0,  #  i = 3
    	1, 0, 0,  #  i = 4
    	2, 1, 0,  #  i = 5
    	2, 1, 0), #  i = 6
    	byrow=TRUE, ncol=3)
    SD <- matrix(c(
    	1, 0, 0,
    	1, 0, 0,
    	2, 1, 0,
    	2, 1, 0,
    	3, 2, 1,
    	3, 2, 1),
    	byrow=TRUE, ncol=3)
    シミュレーションデータは 3 次元の配列として用意する。
    配列のサイズは以下の通り。
    n <- 10
    i <- 6 # nrow(Mean)
    j <- 3 # ncol(Mean)
    n = 1:10 のそれぞれについて要素を定める。
    N(α,β^2) などは,平均値 α,標準偏差 βに従う正規乱数 1 個。
    SD が 0 の場合は,定数 0。 要するにこういうものが 10 層あると考えてもよい。
    i\j    a          b         c
     1  N(0, 1^2)     0         0
     2  N(0, 1^2)     0         0
     3  N(1, 2^2)  N(0, 1^2)    0
     4  N(1, 2^2)  N(0, 1^2)    0
     5  N(2, 3^2)  N(1, 2^2)  N(0, 1^2)
     6  N(2, 3^2)  N(2, 2^2)  N(0, 1^2)
    以下のようにして「二次元配列」を作る。10行18列の「行列」。
    m <- sapply(1:(i*j), function(ij) {
    	   if (SD[ij] > 0)
    	     rnorm(n, Mean[ij], SD[ij])
    	   else
    	     rep(0, n)
    	 })
    行列に配列の次元属性を与える(三次元配列)。配列要素の順序に注意。
    m <- array(m, dim=c(n, i, j))
    m
    3 次元配列の周辺和を求める。
    和を求める必要のない部分には 0 を入れておけば,いつも同じ部分 a, b, c, ... 全部の和をとればよい。
    i によって和を取る範囲を変える必要はない。
    apply(m, 1:2, sum) # これが d
    実行例
    > m
    , , 1
    
                  [,1]       [,2]       [,3]        [,4]       [,5]       [,6]
     [1,]  0.156703769  1.1019974 -0.5878131  1.38177251  1.0866401  1.6239542
     [2,]  1.373811191  1.5415915  2.1952178  0.22287438  2.5868151 -0.1643288
     [3,]  0.730670244 -0.3782146 -0.9849293 -0.19496258  0.8157513  5.5951201
     [4,] -1.350800927 -0.4985698  2.4799454  1.88217872  6.8272976  5.7091340
     [5,] -0.008514961 -0.5412962 -0.1742176 -0.26483396  1.3814548  0.3559608
     [6,]  0.320981863  0.5419221  0.7326528 -0.82759674  1.9827762  0.9208469
     [7,] -1.778148409 -1.4575070  1.8153054 -3.16497120 -1.0243537  0.5033054
     [8,]  0.909503835  0.1169604  1.4648845  0.08704023  2.4651632  0.9539357
     [9,] -0.919404336 -0.1407206 -1.5649053  0.25347786  7.9319406  0.3369453
    [10,] -0.157714831  0.0443457  2.0469119  0.47429132  4.6990698  6.6437705
    
    , , 2
    
          [,1] [,2]       [,3]       [,4]       [,5]        [,6]
     [1,]    0    0 -1.6481922  0.9301823  2.3629785 -0.07863734
     [2,]    0    0 -0.5601030  0.2247429  1.7719864  2.32072697
     [3,]    0    0  0.8362890 -1.3439788  1.0961511  0.03228667
     [4,]    0    0 -2.1072330  0.6451209  1.5598118  1.45206790
     [5,]    0    0  0.2892977 -1.9031158  3.4218537 -0.07945608
     [6,]    0    0 -1.2472545  0.8929470  2.9554176 -3.03584486
     [7,]    0    0  0.7074159  0.7091518 -0.8749767  1.79230210
     [8,]    0    0 -1.6659138 -0.1559170  0.1048045 -0.82257526
     [9,]    0    0 -1.4662284  2.1920211 -2.8208809  3.41325672
    [10,]    0    0  0.2903617 -0.1537628  5.0290536  0.06835080
    
    , , 3
    
          [,1] [,2] [,3] [,4]       [,5]       [,6]
     [1,]    0    0    0    0 -0.1858555  0.1759547
     [2,]    0    0    0    0  0.6234541 -1.2223501
     [3,]    0    0    0    0 -0.8221098 -0.7782799
     [4,]    0    0    0    0  1.6184734  1.7862177
     [5,]    0    0    0    0 -0.2177257 -0.3615454
     [6,]    0    0    0    0 -0.1005853 -1.6459583
     [7,]    0    0    0    0 -0.6616456 -0.4109084
     [8,]    0    0    0    0  0.4907506 -2.1850624
     [9,]    0    0    0    0 -0.8438808 -0.3885813
    [10,]    0    0    0    0  0.2083525 -0.9391815
    
    > apply(m, 1:2, sum)
                  [,1]       [,2]       [,3]        [,4]      [,5]        [,6]
     [1,]  0.156703769  1.1019974 -2.2360053  2.31195481  3.263763  1.72127163
     [2,]  1.373811191  1.5415915  1.6351148  0.44761725  4.982256  0.93404801
     [3,]  0.730670244 -0.3782146 -0.1486403 -1.53894141  1.089793  4.84912694
     [4,] -1.350800927 -0.4985698  0.3727124  2.52729959 10.005583  8.94741966
     [5,] -0.008514961 -0.5412962  0.1150801 -2.16794979  4.585583 -0.08504062
     [6,]  0.320981863  0.5419221 -0.5146017  0.06535031  4.837608 -3.76095628
     [7,] -1.778148409 -1.4575070  2.5227213 -2.45581941 -2.560976  1.88469909
     [8,]  0.909503835  0.1169604 -0.2010293 -0.06887676  3.060718 -2.05370196
     [9,] -0.919404336 -0.1407206 -3.0311337  2.44549896  4.267179  3.36162071
    [10,] -0.157714831  0.0443457  2.3372736  0.32052849  9.936476  5.77293975
    たぶん本番のプログラムは Mean,SD の定義法なども組み込まないといけないだろうが,大筋は変わらないであろう。
    あなたのプログラムと私のプログラムでは,a, b, c に割り当てる乱数の発生順序が異なるので,同じ答にならないが,あなたのプログラムと
    set.seed(1234567)
    a <- b <- c <- d <- matrix(NA, 10, 6)
    for(i in 1 : 2) a[, i] <- rnorm(10, mean=0, sd=1)
    for(i in 3 : 4) a[, i] <- rnorm(10, mean=1, sd=2)
    for(i in 5 : 6) a[, i] <- rnorm(10, mean=2, sd=3)
    
    for(i in 3 : 4) b[, i] <- rnorm(10, mean=0, sd=1)
    for(i in 5 : 6) b[, i] <- rnorm(10, mean=1, sd=2)
    
    for(i in 5 : 6) c[, i] <- rnorm(10, mean=0, sd=1)
    
    for(i in 1 : 2) d[, i] <- a[, i]
    for(i in 3 : 4) d[, i] <- a[, i] + b[, i]
    for(i in 5 : 6) d[, i] <- a[, i] + b[, i] + c[, i]
    
    d
    は同じであり,このプログラムの答と私のプログラムの答は一致するので,私のプログラムも正しいと思います。 -- 河童の屁は,河童にあらず,屁である。? 2012-12-05 (水) 16:32:03
  • ご教授ありがとうございます。教えていただいたプログラムで最初に色々と用意しておくところにヒントを得て、0やNAのまま回すことを思いつきました。最初に載せたプログラムを書き変えたものが下記です(set.seed(1)で固定しましたが、書き方が違うので結果が完全に一緒にはならないです・・・??)。それなりにコンパクトになったように思いますし、クラスが増えても下へ下へだらだらと続くことはなくなりました。私のプログラミングレベルからして、下記のように書き直せたことで十分満足なのですが、どこかまだ包括的にコンパクトに書けそうな箇所がありましたら、勉強させていただければ大変うれしく思います。結局、いくつかfor文は残りました。 -- Saito? 2012-12-07 (金) 14:08:06
    set.seed(1)
    Size <- seq(0.1, 30, by=0.5) #個体のサイズ分布
    year <- 40 #時間
    class <- 3 #生物の年級群の数
    
    M <- catch <- matrix(0, ncol=year*class, nrow=length(Size))
    Gs <- list(0, 0, 0)  #classの数だけ
    r_years <- c(year, year*2+13)
    r_number <- c(40000, 40000)
    
    ###Catchは既知のデータ###
    c_days <- c(5, 10, 56, 77, 105)
    catch[, c_days] <- sapply(seq(2, 6), 
                          function(x) {rpois(length(Size), lambda=x)}
                         )
    
    SS <-SS2 <- As <- Probs <- matrix(NA, length(Size), class)
    Mean <- m123 #mapply(function(min, max)
      runif(year*class, min, max), c(0, 5, 15), c(1, 10, 20))
    SD <- sd123 #mapply(function(min, max)
      runif(year*class, min, max), c(1, 1, 1), c(5, 3, 2))
    Surv <- surv123 #mapply(function(min, max)
      runif(year*class, min, max), c(0.9, 0.9, 0.9), c(0.99, 0.99, 0.99))
    k <- 1
    SS2[1, 1] <- 40000
    
    for(i in 1 : (year*class)){
    As <- mapply(function(mean, sd)
      dnorm(Size, mean, sd), Mean[i, ], SD[i, ])
    Probs <- As/rep(apply(As, 2, sum), each=nrow(As))
    Probs[which(is.na(Probs))] <- 0
    
    for (j in 1 : ncol(Mean)) {
    if(sum(Probs[, j]==0) < nrow(As))
    Gs[[j]] <- sample(Size, sum(SS2[, j], na.rm=T),
      prob=Probs[, j], rep=T)
    }
    
    for(j in 1 : ncol(As)){
    SS[, j] <-  rbinom(rep(1, length(Size)), 
                       table(cut(Gs[[j]],
                       breaks=c(Size, max(Size) + 0.5))), 
                       prob=Surv[i, j])
    }
    
    for(j in 1 : ncol(As)) {
    SS2[, j] <- SS[, j] - round(catch[, i] *
         SS[, j]/apply(SS, 1, sum))
    SS2[which(SS2[, j] < 0), j] <- 0
    }
    SS2[which(is.na(SS2))] <- 0
    M[, i] <- apply(SS2, 1, sum)
    M[which(M[, i] < 0), i] <- 0
    
    if(sum(i==r_years) > 0){
    SS2[1, k+1] <- r_number[k]
    k <- k + 1
    }
    }

対応した2つのデータフレームに一括でペアT検定とWilcoxon符号順位検定を行い、各列の因子とp値一覧を出力したい。

のぶ? (2012-12-03 (月) 23:04:10)

お世話になります。

Rは始めたばかりの初心者です。
ご教示頂けると幸いです。

下記のようなデータフレームX、Yの、各A-A',B-B',C-C',D-D'間の、ペアT検定とWilcoxon符号順位検定を行い、各列の因子とp値一覧を出力したいと考えております。

X <- data.frame(A = c(1,5,6,4,2), B = c(2,1,7,4,3) ,
     C = c(1,NA,NA,NA,NA) , D = c(3,8,NA,4,1))
Y <- data.frame(A' = c(NA,3,2,8,1), B' = c(3,2,5,4,9) ,
     C' = c(NA,2,8,3,10) , D' = c(1,3,NA,2,NA))

検討したい因子がかなり多く、p値の一覧として出力した上で、BH法にてFDRを計算する予定です。
なので、

	検討できた数	p-value(paired-T.test)	p-value(wilcoxon)
A-A'	4	0.6892	 0.7127
B-B'	5	0.4144	0.5807
C-C'	0	NA	NA
D-D'	3	0.09547	 0.1736

のように、要約された結果一覧を得たいです。

for (i in 1:4) print(t.test(X[,i],Y[,i],paired=TRUE))
for (i in 1:4) print(wilcox.test(X[,i],Y[,i],paired=TRUE))

とするところまではたどり着きましたが、各検定結果において、何と何を比較したか分からない上にまとまっておらず、さらに全てNAの列があるとそこでスクリプトがとまってしまいます。
何か良い方法はありますでしょうか。
お手数をおかけいたしますが、よろしくお願いいたします。

  • 何と何を比較したかは,for ループの中で,変数名を書けばよい。今回は別のやり方を取る。
    まとまっていないということについては,まとめるように書くだけ。
    1. for ループは1つにする。
    2. 検定結果のうち,p.value だけを取り出す。
    全てNA だと止まるということについては,本当は全部が NA でなくても,データが一組しかない場合も止まるが,要するにそのような状況を把握して,そのような場合には検定をしない(p-value は NA とでもする)
    結果をまとめてキレイに整形して出力する。ループごとの結果をベクトルに保存していき,最後にデータフレームにする(これは好みの問題)。
    ということで,以下のようなプログラム。不細工だけど,ちゃんと望みの結果になると思います。 -- 河童の屁は,河童にあらず,屁である。? 2012-12-04 (火) 04:36:29
    X <- data.frame(A = c(1, 5, 6, 4, 2), B = c(2, 1, 7, 4, 3) ,
                    C = c(1, NA, NA, NA, NA) , D = c(3, 8, NA, 4, 1))
    Y <- data.frame(A = c(NA, 3, 2, 8, 1), B = c(3, 2, 5, 4, 9) ,
                    C = c(NA, 2, 8, 3, 10) , D = c(1, 3, NA, 2, NA))
    len <- length(X)
    n <- pt <- wt<- rep(NA, len)
    for (i in seq_len(len)) {
    	d <- na.omit(data.frame(x = X[, i], y = Y[, i]))
    	n[i] <- nrow(d)
    	if (n[i] >= 2) {
    		pt[i] <- t.test(d$x, d$y, paired = TRUE)$p.value
    		pw[i] <- wilcox.test(d$x, d$y, paired = TRUE)$p.value
    	}
    }
    data.frame(n, pt, pw, row.names=names(X))
    実行結果(警告メッセージも出るが。不要なら出さないようにする)
      n         pt        pw
    A 4 0.68923296 0.7127019
    B 5 0.41443008 0.5807122
    C 0         NA        NA
    D 3 0.09546597 0.1735682
  • ありがとうございました。したいことができました。まだまだ自分でプログラムを書くのは難しそうですが、内容は何とか理解できました。大変勉強になりました。今後ともよろしくお願いたします。 -- のぶ? 2012-12-04 (火) 22:41:43

mimRが手ごわい?!

悩めるポー? (2012-12-01 (土) 18:40:47)

R version 2.13.0(2011-04-13)
mimR_2.6.2
gRbase_1.4.4の環境下で、mimRとMIM3.2.0.7のコネクションがうまくいかないのは何故でしょうか?
The mimR Package
January 31, 2006をなぞっても、、、。

  • The mimR Package for Graphical Modelling in R DRAFT – comments are welcome! Søren Højsgaard Danish Institute of Agricultural Sciences February 20, 2007 -- 2012-12-01 (土) 19:07:00
  • ググっていたら、The mimR Package for Graphical Modelling in R DRAFT – comments are welcome! Søren Højsgaard Danish Institute of Agricultural Sciences Feb- S2 - round(catch[, i]*(S2/(S1+S2)))
    S3 ruary 20, 2007の中にヒントがありそうです。The 31 communication between R ,and MIM is based on the rcom package which is auto32 matically installed when mimR is installed.を見つけました。 -- 悩めるポー? 2012-12-01 (土) 19:09:25
  • R version 2.13.0(2011-04-13)だとRgraphviz package ca not be installed ?!なので、グラフは描けないですね。 -- 悩めるポー? 2012-12-01 (土) 19:19:13
  • 不可解な自問自答で,何が質問かもよくわからないですね。好きなだけ,ゆっくり悩んでください。
    少なくとも R version 2.13 でなんだかんだ言われても,なんだかんだ言われるのが関の山でしょう。 -- 河童の屁は,河童にあらず,屁である。? 2012-12-01 (土) 20:43:49

webページの更新日時取得

asap? (2012-11-30 (金) 21:30:28)

webページの内容は

 src <- readLines("http://www.jma.go.jp/jp/")

のようにして取得できますが、そのページの更新日時を取得できる方法はありますか?
例えばfirefox(Win版)であれば、右クリック>ページの情報を表示 を選択すると
そのページの更新日時が表示されますが、それをRで取得したいと思っています
よろしくお願いします

  • 私なら次のようにします -- 2012-12-01 (土) 05:20:26
    > url <- "http://jasp.ism.ac.jp/~nakanoj/workshop12/2012Rmeeting.htm"
    > grep("Last-Modified", system(paste("w3m -dump_head", url),
           intern = TRUE), value = TRUE)
    [1] "Last-Modified: Thu, 22 Nov 2012 05:14:24 GMT"
    ただし、動的に作成されているページにはLast-Modifiedがないので上記は使えません。しかしその場合はアクセスした日時が更新日時ですからそもそも意味がないです。見た目が静的なページに見えても、実はSSIを使っている場合もあります。 なお、http://www.jma.go.jp/jp/は403 Forbiddenでした。
  • ありがとうございます 以下のエラーがでるのですが不備な点などあれば指摘おねがいします。R2.15.1です -- asap? 2012-12-03 (月) 21:20:35
    url <- "http://jasp.ism.ac.jp/~nakanoj/workshop12/2012Rmeeting.htm"   
    grep("Last-Modified", system(paste("w3m -dump_head", url),
         intern = TRUE), value = TRUE)
    以下にエラー system(paste("w3m -dump_head", url), intern = TRUE) :
       'w3m' not found
  • w3m というのはテキストブラウザということで, 'w3m' not found というのは,それがないということ。つまりは,インストールしないと使えませんということ。Windows(でしょうね)にインストールするにはどうしたらよいかは私には分からない。 -- 河童の屁は,河童にあらず,屁である。? 2012-12-03 (月) 21:49:35

stripchartで対応のある点を線でつなぐ

COM? (2012-11-26 (月) 10:02:04)

お世話になります。
stripchart() で因子別に一次元散布図を描き、対応するデータを線でつなぎたいと思っています。

y <- rnorm(20)
x <- factor(c(rep(1, 10), rep(2, 10)))
stripchart(y~x, vertical=T)

このとき、因子1の1番目と因子2の1番目、因子1の2番目と因子2の2番目・・・
というように点を線でつなぐにはどのようにすれ- d ばよいでしょうか?
宜しくお願いします。

  • segments 関数を上手に使う。segments(1, y[1:10], 2, y[11:20]) -- 河童の屁は,河童にあらず,屁である。? 2012-11-26 (月) 10:16:40
  • 迅速なご回答ありがとうございました。stripchartについての投稿が少なくて困っていましたが、segments()で上書きすれば済むことだったんですね。 -- COM? 2012-11-26 (月) 10:24:17

factor データを strptime で"POSIXt" に変換したときにデータ数が変わる??

やまだ? (2012-11-24 (土) 06:24:36)

いつもお世話になっています。

x
[1] 2010/02/02 00:15:00 2010/02/02 01:15:00 2010/02/02 02:15:00 2010/02/02 03:15:00
[5] 2010/02/02 04:15:00 2010/02/02 05:15:00 2010/02/02 06:15:00 2010/02/02 07:15:00
[9] 2010/02/02 08:15:00 2010/02/02 09:15:00 2010/02/02 10:15:00 2010/02/02 11:15:00
[13] 2010/02/02 12:15:00 2010/02/02 13:15:00 2010/02/02 14:15:00 2010/02/02 15:15:00
[17] 2010/02/02 16:15:00 2010/02/02 17:15:00 2010/02/02 18:15:00 2010/02/02 19:15:00
20 Levels: 2010/02/02 00:15:00 2010/02/02 01:15:00 ... 2010/02/02 19:15:00

(y <- strptime(x, "%Y/%m/%d %H:%M:%S"))
[1] "2010-02-02 00:15:00" "2010-02-02 01:15:00" "2010-02-02 02:15:00" "2010-02-02 03:15:00"
[5] "2010-02-02 04:15:00" "2010-02-02 05:15:00" "2010-02-02 06:15:00" "2010-02-02 07:15:00"
[9] "2010-02-02 08:15:00" "2010-02-02 09:15:00" "2010-02-02 10:15:00" "2010-02-02 11:15:00"
[13] "2010-02-02 12:15:00" "2010-02-02 13:15:00" "2010-02-02 14:15:00" "2010-02-02 15:15:00"
[17] "2010-02-02 16:15:00" "2010-02-02 17:15:00" "2010-02-02 18:15:00" "2010-02-02 19:15:00"

length(x); length(y)
[1] 20
[1] 9

上記のようなコマンドを実行し、length(y)が9となるのはなぜでしょうか。どうぞご教授ください。

  • 再現しませんねぇ。どちらも長さ 20 になりますが。x をどうやって作ったかがわからないのですけど?
    以下を R コンソールにカット&コピーしたらどうなりますか?データの後にある空行を忘れずに。 x があなたの場合と同じ長さ 20 の Factor になっていることが分かるでしょう。
    x <- factor(scan("", what=""))
    "2010/02/02 00:15:00"
    "2010/02/02 01:15:00"
    "2010/02/02 02:15:00"
    "2010/02/02 03:15:00"
    "2010/02/02 04:15:00"
    "2010/02/02 05:15:00"
    "2010/02/02 06:15:00"
    "2010/02/02 07:15:00"
    "2010/02/02 08:15:00"
    "2010/02/02 09:15:00"
    "2010/02/02 10:15:00"
    "2010/02/02 11:15:00"
    "2010/02/02 12:15:00"
    "2010/02/02 13:15:00"
    "2010/02/02 14:15:00"
    "2010/02/02 15:15:00"
    "2010/02/02 16:15:00"
    "2010/02/02 17:15:00"
    "2010/02/02 18:15:00"
    "2010/02/02 19:15:00"
    
    x
    (y <- strptime(x, "%Y/%m/%d %H:%M:%S"))
    length(x); length(y)
    実行結果は以下の通り
    > x
     [1] 2010/02/02 00:15:00 2010/02/02 01:15:00 2010/02/02 02:15:00 2010/02/02 03:15:00 2010/02/02 04:15:00
     [6] 2010/02/02 05:15:00 2010/02/02 06:15:00 2010/02/02 07:15:00 2010/02/02 08:15:00 2010/02/02 09:15:00
    [11] 2010/02/02 10:15:00 2010/02/02 11:15:00 2010/02/02 12:15:00 2010/02/02 13:15:00 2010/02/02 14:15:00
    [16] 2010/02/02 15:15:00 2010/02/02 16:15:00 2010/02/02 17:15:00 2010/02/02 18:15:00 2010/02/02 19:15:00
    20 Levels: 2010/02/02 00:15:00 2010/02/02 01:15:00 2010/02/02 02:15:00 ... 2010/02/02 19:15:00
    > (y <- strptime(x, "%Y/%m/%d %H:%M:%S"))
     [1] "2010-02-02 00:15:00" "2010-02-02 01:15:00" "2010-02-02 02:15:00" "2010-02-02 03:15:00"
     [5] "2010-02-02 04:15:00" "2010-02-02 05:15:00" "2010-02-02 06:15:00" "2010-02-02 07:15:00"
     [9] "2010-02-02 08:15:00" "2010-02-02 09:15:00" "2010-02-02 10:15:00" "2010-02-02 11:15:00"
    [13] "2010-02-02 12:15:00" "2010-02-02 13:15:00" "2010-02-02 14:15:00" "2010-02-02 15:15:00"
    [17] "2010-02-02 16:15:00" "2010-02-02 17:15:00" "2010-02-02 18:15:00" "2010-02-02 19:15:00"
    > length(x); length(y)
    [1] 20
    [1] 20
    ちゃんと,両方とも長さ 20 ですけどねぇ。
    もし,length(y) が 9 だとして,じゃああ,y[1] をプリントしてみると,何が表示されますか?y[9] は? -- 河童の屁は,河童にあらず,屁である。? 2012-11-24 (土) 21:32:39
  • わざわざデータをscan()で打ち込んで頂き大変感謝いたします。 以下のようにそのままコピーしても同じ結果になりました。
    > x <- factor(scan("", what=""))
    1: "2010/02/02 00:15:00"
    2: "2010/02/02 01:15:00"
    3: "2010/02/02 02:15:00"
    4: "2010/02/02 03:15:00"
    5: "2010/02/02 04:15:00"
    6: "2010/02/02 05:15:00"
    7: "2010/02/02 06:15:00"
    8: "2010/02/02 07:15:00"
    9: "2010/02/02 08:15:00"
    10: "2010/02/02 09:15:00"
    11: "2010/02/02 10:15:00"
    12: "2010/02/02 11:15:00"
    13: "2010/02/02 12:15:00"
    14: "2010/02/02 13:15:00"
    15: "2010/02/02 14:15:00"
    16: "2010/02/02 15:15:00"
    17: "2010/02/02 16:15:00"
    18: "2010/02/02 17:15:00"
    19: "2010/02/02 18:15:00"
    20: "2010/02/02 19:15:00"
    21: 
    Read 20 items
    
    > x
    [1] 2010/02/02 00:15:00 2010/02/02 01:15:00 2010/02/02 02:15:00
    [4] 2010/02/02 03:15:00 2010/02/02 04:15:00 2010/02/02 05:15:00
    [7] 2010/02/02 06:15:00 2010/02/02 07:15:00 2010/02/02 08:15:00
    [10] 2010/02/02 09:15:00 2010/02/02 10:15:00 2010/02/02 11:15:00
    [13] 2010/02/02 12:15:00 2010/02/02 13:15:00 2010/02/02 14:15:00
    [16] 2010/02/02 15:15:00 2010/02/02 16:15:00 2010/02/02 17:15:00
    [19] 2010/02/02 18:15:00 2010/02/02 19:15:00
    20 Levels: 2010/02/02 00:15:00 ... 2010/02/02 19:15:00
    
    > (y <- strptime(x, "%Y/%m/%d %H:%M:%S"))
    [1] "2010-02-02 00:15:00" "2010-02-02 01:15:00" "2010-02-02 02:15:00"
    [4] "2010-02-02 03:15:00" "2010-02-02 04:15:00" "2010-02-02 05:15:00"
    [7] "2010-02-02 06:15:00" "2010-02-02 07:15:00" "2010-02-02 08:15:00"
    [10] "2010-02-02 09:15:00" "2010-02-02 10:15:00" "2010-02-02 11:15:00"
    [13] "2010-02-02 12:15:00" "2010-02-02 13:15:00" "2010-02-02 14:15:00"
    [16] "2010-02-02 15:15:00" "2010-02-02 16:15:00" "2010-02-02 17:15:00"
    [19] "2010-02-02 18:15:00" "2010-02-02 19:15:00"
    > length(x); length(y)
    [1] 20
    [1] 9
    その一方で、以下に問題はありません。
    > y[1]; y[9]
    [1] "2010-02-02 00:15:00"
    [1] "2010-02-02 08:15:00"
    
    > y[10]
    [1] "2010-02-02 09:15:00"
     
    > y[15]; y[20]
    [1] "2010-02-02 14:15:00"
    [1] "2010-02-02 19:15:00"
    問題となるのは以下のような場合です。
    > m <- data.frame(V1=1:20, V2=1:20)
    > m[,1] <- x
    > m[,2] <- y
    Warning message:
    In `[<-.data.frame`(`*tmp*`, , 2, value = list(sec = c(0, 0, 0,  :
      provided 9 variables to replace 1 variables
    ただ、原因の一つは旧バージョンのRを使っていることに原因の一つがあるようです。上記のエラーは以下の環境のときにおこるエラーです。
    > sessionInfo() 
    R version 2.8.1 (2008-12-22) 
    i386-pc-mingw32 
    
    locale:
    LC_COLLATE=Japanese_Japan.932;LC_CTYPE=Japanese_Japan.932;
    LC_MONETARY=Japanese_Japan.932;LC_NUMERIC=C;LC_TIME=Japanese_Japan.932
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base  
    以下の環境だと問題なくうまくいきます。
    > sessionInfo() 
    R version 2.15.1 (2012-06-22)
    Platform: i386-pc-mingw32/i386 (32-bit)
    
    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    
    ただ、R 2.8.1 でしか動作しないpackageを使用したいという事情があります。この場合、そのpackage使用の時のみでR 2.8.1を使用し、それ以外は最新バージョンを使用するという方法しかないでしょうか。なければ、そのように対応いたしますが、他に原因があるのであれば、ご教授いただければ幸いです。
    その他の環境は以下の通りです
    Microsoft Windows XP
    Professional
    Version 2002
    Service Pack 3
    
    Intel(R) Core(TM)2 Duo CPU
    E6850 @ 3.00GHz
    2.99 GHz、1.95 GB RAM -- [[やまだ]] &new{2012-11-25 (日) 00:49:29};
  • 挙げられた問題を解決するのが質問の目的ではなく,解決すべき問題は他にあるということで,なおかつ,R のバージョンが 2.8.1 だということも,書いていない。動かしたいパッケージ名も書かれていない。これじゃ回答しようという意欲はなくなる。そもそも,2.8.1 でしか動かない(それ以降バージョンアップもされない)ようなパッケージは信頼できませんね。ソースが公開されているのなら,あなたが自分で 2.15.2 でも動くように作り替えればよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2012-11-25 (日) 08:58:24
  • 既出 POSIXlt の bug ? -- 河童の屁は,河童にあらず,屁である。? 2012-11-26 (月) 11:04:25

barplotやbwplotにおける因子(項目)の並べ替え

atr? (2012-11-20 (火) 19:25:14)

お世話になります。

lab <- sample(rep(c("亜","い","u","エ","O"), length.out=10), 10) #サンプル
sp <- runif(10, min=0, max=7)
DF1 <- data.frame(lab, sp)
MEAN1 <- tapply(DF1$sp, DF1$lab, mean)
barplot(MEAN1)

にて描画される棒グラフのバーの並び順を例えば左から「"亜","い","u","エ","O"」とする方法はないのでしょうか。
低い検索スキルのせいかRjpwiki内では見つかりませんでした。ご教授頂けると幸いです。

  • factor 変数のカテゴリーの順序は,factor 関数で自分で決めればよいのですよ。自分で決めない限り,辞書順になります。
    layout(matrix(1:2, 2))
    par(mgp=c(1.6, 0.8, 0), mar=c(2, 2, 0, 0))
    lab <- sample(rep(c("亜","い","u","エ","O"), length.out=10), 10) #サンプル
    sp <- runif(10, min=0, max=7)
    DF1 <- data.frame(lab, sp)
    MEAN1 <- tapply(DF1$sp, DF1$lab, mean)
    barplot(MEAN1)
    DF1$lab<-factor(lab, c("亜","い","u","エ","O")) # ここがキモ!ですね
    MEAN1 <- tapply(DF1$sp, DF1$lab, mean)
    barplot(MEAN1)
    layout(1)
    factor.png
    例が,余りにも適切に選ばれているので,やらせのようにみえてしまいますねぇ。 -- 河童の屁は,河童にあらず,屁である。? 2012-11-20 (火) 19:59:53
  • bwplotもご教授頂いた形のfactor変数を渡すことで狙い通りになりました。ようやくfactor関数が掴めたような気がします(錯覚?) ご教授ありがとうございました! -- atr? 2012-11-21 (水) 17:14:44

SVMの結果がsummaryとtableで違う

? (2012-11-13 (火) 16:00:14)

はじめまして。よろしくお願いします。
今、問題になっているコードは以下の部分です。

library(e1071)
(eeg.svm <- svm(NAME~.,data=zz,cross=7))#svm
summary(eeg.svm)
pred2 <- predict(eeg.svm, zz)
table(pred2,zz[,1])

zzは、1列目NAMEに人物名(イニシャル)が入っており、2〜1201列目に各個人の波形が入っている、50×1201のデータフレームです。

このデータをsvmにかけて、個人の判別を行おうとしています。
そこで、summary(eeg.svm)を実行し結果を見ると

Call:
svm(formula = NAME ~ ., data = zz, cross = 7)

Parameters:
   SVM-Type:  C-classification 
 SVM-Kernel:  radial 
       cost:  1 
      gamma:  0.0008333333  

Number of Support Vectors:  50

 ( 10 10 10 10 10 )
 
Number of Classes:  5 

Levels: 
 m N o u y

7-fold cross-validation on training data:

Total Accuracy: 62 
Single Accuracies:
 42.85714 85.71429 42.85714 57.14286 85.71429 42.85714 75 

と出てきて、Accuracyが62%だとわかります。
では、その内訳がどうなっているのか、と予想からクロス表を作るため

pred2 <- predict(eeg.svm, zz)
table(pred2,zz[,1])

を実行してみると、

pred2  m  N  o  u  y
    m  8  0  0  0  0
    N  2 10  1  0  0
    o  0  0  9  0  0
    u  0  0  0 10  0
    y  0  0  0  0 10

と出てきます。このクロス表によればAccuracyは94%です。
なぜ、このように違った結果が出てしまうのでしょうか?

見辛い文章になっていたら申し訳ありません。(←編集し直しましたよ)
ご回答よろしくお願いします。

  • 「7-fold cross-validation on training data」って書いてあるからクロスバリデーションの評価結果が62%のAccuracyで、自己判別の結果(pred2)が94%のAccuracyということでは? -- 通りすがりの仮面ライダー? 2012-11-13 (火) 17:11:59
  • 以下のようなプログラムで,「でたらめなデータ」を解析してみると,それでも(Total accuracy が 0 のような場合でも)pred2 は 100% 正解となりますね。
    set.seed(12345)
    zz <- data.frame(NAME=rep(c("m", "N", "o", "u", "y"), 10),
                     matrix(rnorm(50*1200), 50))
    library(e1071)
    eeg.svm <- svm(NAME~., data=zz, cross=7) # svm
    summary(eeg.svm)
    pred2 <- predict(eeg.svm, zz)
    table(pred2, zz[,1])
    やはり,データ数より変数の数が多いのでそういうことになるのでは?むしろ,あなたのデータで,pred2 の正解率が 100% でないほうがおかしいのかな? -- 河童の屁は,河童にあらず,屁である。? 2012-11-13 (火) 17:31:58
  • 通りすがりの仮面ライダー様、河童の屁は,河童にあらず,屁である。様 返答ありがとうございます。 【�クロスバリデーションと自己判別では、クロスバリデーションの方を信頼すればよいのでしょうか?】 【�「自己判別」とは内部でどのように判別を行っているのでしょうか? 】【�pred2の結果が100%にならない理由に心当たりはありますでしょうか? 】追加でこちらの質問にお答えいただけると幸いです。 宜しくお願いします。 -- ? 2012-11-16 (金) 15:56:48
  • クロスバリデーションは,判別ルールを構築/検証する段階での妥当性の検討です。その結果を経て最終的な判別ルールが構成され,その結果が最終的な(自己判別?)でしょう。最終的にどのように判別が行われるかは,記述が難しいと思うので,predict 関数をトレースするのが正確でしょう。情報が冗長であるにもかかわらず正判別率が100%にならないのかは,わかりませんね。使用する変数の個数を変化させるなどして,いつも100%になるのかならないのかとか,誤判別されるデータに何らかの特徴があるのかないのかとか,個別のデータについて細かな吟味が必要なのでしょう。
    やはり,変数が余りにも多いのでそれを何らかの形で集約し,形式的にはサンプルサイズより少ない説明変数を使っての判別と言うことが必要なのではないでしょうか。 -- 河童の屁は河童の屁は,河童にあらず,屁である。? 2012-11-16 (金) 21:00:34

「NULL に対して属性を設定しようとしました」のエラーメッセージの原因を教えてください

佐藤? (2012-11-07 (水) 22:38:03)

初めまして。今回、初めて投稿させて頂きます。
現在とあるシステムのエラー原因が分からず困っております。
ご指南を宜しくお願いします。

<状況>
4年前からあるシステムを運用していて、Rのソースを一切変えず、これまで運用をしてきたのですが、先日下記エラーが発生しました。想定しないデータが連携された為、以下のエラーが発生するようになったと思われるのですが、エラー内容をみたところ、何が原因か分かりません。

下記のエラー内容を見て、原因が分かれば教えて頂けないでしょうか?

<ログファイルからのエラー直後の箇所を抜粋>

if (nrow(tDatStdModelPros) > 0) {

    res <- by(tDatStdModelPros, factorList,
              function(x) analyticalPerspectiveByStdModelFunc( x,
              stdPredictPros[(stdPredictPros[,"COLUMN_3"] == x[1,"COLUMN_3"]),],
              indexInfo[x[1,"COLUMN_3"],"COLUMN_11"],
              stdModelProsList[x[1,"COLUMN_2"],], startYM, 0))
    # 結果が List なので matrix に変換
    colName <- c("COLUMN_1",
                 "COLUMN_2",
                 "COLUMN_3",
                 "COLUMN_4",
                 "COLUMN_5",
                 "COLUMN_6",
                 "COLUMN_7",
                 "COLUMN_8",
                 "COLUMN_9",
                 "COLUMN_10") 
    predictValProsStd <- matrix(unlist(res), ncol=10,
            byrow = TRUE, dimnames = list(NULL, colName))

    predictValProsStd[,"COLUMN_9"] <- 3
    predictValProsStd[,"COLUMN_6"] <- 2

    rm( res)
}
以下にエラーmatrix(unlist(res), ncol = 10,
  byrow = TRUE, dimnames = list(NULL,  : 
        NULL に対して属性を設定しようとしました
実行が停止されました~
  • res に付値したあと,res がどうなっているか(期待しているものと同じか)チェックしましたか?
    もしそれがおかしかったら,tDatStdModelPros?, factorList はどうか,必要ならさらにさかのぼる。
    プログラムの断片だけ見せられても,その時点での各変数がどのようになっているかわからない。回答者はパズルを解きたいわけではない。 -- 河童の屁は,河童にあらず,屁である。? 2012-11-07 (水) 22:51:36
  • tDatStdModelPros??, factorList のデバッグを実施しようとしているのですが、cat()を使ったデバッグ方法だと、変数がlistの為、エラーとなります。この場合のデバッグをする場合は、どのような関数を利用すればよいでしょうか?簡単なサンプルがあると助かります。よろしくお願いいたします。 -- 佐藤? 2012-11-12 (月) 21:35:04
  • print を使うか,必要な要素について cat でよいでしょう。要素数が多いとか,コンパクトに必要なものだけを表示したいということなら,cat を使う専用の関数を書けばよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2012-11-13 (火) 07:56:49
    > x <- list(a=1:3, b="abc")
    > print(x)
    $a
    [1] 1 2 3
    
    $b
    [1] "abc"
    
    > cat(x$a)
    1 2 3
    > cat(x$b)
    abc
  • print()を使い、res,DatStdModelPros?, factorListの値をチェックしましたが、問題ありませんでした。この為、原因が分からない状況です。そもそもエラーと出力されている「NULL に対して属性を設定しようとしました」はどういう意味なのでしょうか? -- 佐藤? 2012-11-13 (火) 21:09:42
  • > そもそもエラーと出力されている「NULL に対して属性を設定しようとしました」はどういう意味なのでしょうか?
    文字通りのことでしょう。しかし,それらしい状況を再現して,同じようなエラーメッセージになるかどうか色々やりましたけど,そんなエラーメッセージは出ませんでした。
    例えば
    > a <- NULL
    > attributes(a) <- list(a="aaa")
    > a
    list()
    attr(,"a")
    [1] "aaa"
    なんてやっても,エラーも出ないし,然るべき結果になるわけです。
    「【いろいろやった】なんていってもどこまでやったのやら」とも言われるだろうから「回答者はパズルを解きたいわけではない」といったわけ。実際にエラーが起きた状況を特定して,そのエラーメッセージが出たと言うことを見極めてもらいたいということ。
    更に詳細にエラーを検出するためには debug 関数を適用する。これによれば,関数のステップごとにその時点時点での各変数の状況をチェックしながら関数の流れをトレースすることができるので,エラーの原因を把握することができる可能性が高まるでしょう。まずは debug 関数の使い方からスタートするとよいと思います。 -- 河童の屁は,河童にあらず,屁である。? 2012-11-13 (火) 21:12:33
  • 再度確認したところ、resの返却値にNULLが含まれておりました。結果は、以下です。ここで疑問点なのですが、by()の関数について、ネット上を色々調べたのですが、見つけることができず、どういうった結果を返すのか分からない状況です。by()はどういう使い方をsるうのでしょうか?
    ちなみに、analyticalPerspectiveByStdModelFunc?()の返却値がNULLです。 -- 佐藤? 2012-11-13 (火) 22:31:13
  • > by()はどういう使い方をsるうのでしょうか?
    オンラインヘルプをみましょう。「どういうった結果を返すのか分からない」のでは使えないですね。また,記事を編集することもできますよ。 -- 河童の屁は,河童にあらず,屁である。? 2012-11-14 (水) 06:45:12

Jaccard係数(類似度)計測後のデンドログラム描画方法を教えてください

mura? (2012-11-07 (水) 14:18:02)

はじめまして。R初心者の大学院生で、修士論文のデータ整理で困っております。ご指南を宜しくお願いします。

実は、Jaccard(ジャッカード)係数で約10個のデータの相互の結びつきの強さを計算し、横書きのデンドログラムで描画したいと考えています。
スケールは、ジャッカード係数なのでデータは最大値は1.0で最小値は0となり0.XXXで表現され、数値が大きい(1に近い)程結びつきが強いということで樹形図は結節されていきます。

今、10個のデータ間のジャッカード係数を計算してある縦横の表(対照行列)がJaccard.CSVという名称のCSVファイルがあるとき、Rでどのようにすれば横書きの樹形図を書くことができるでしょうか?
Rについては超初心者で、本を見ながら練習をはじめたばかりです。
大変お手数ですが関数とその他引数も含めてどのようにすれば良いかご指南願えれば幸いです。
どうぞ宜しくお願い致します。

  • よく分からないが、対称行列からデンドログラムを描くなら次のようにするとか。 -- 2012-11-08 (木) 12:00:30
    > set.seed(1234)
    > x <- round(cor(matrix(runif(25), 5)), 1)
    > row.names(x) <- colnames(x) <- LETTERS[1:5]
    > x
         A    B    C    D    E
    A  1.0 -0.3 -0.4 -0.9 -0.4
    B -0.3  1.0  0.5  0.3 -0.4
    C -0.4  0.5  1.0  0.2 -0.3
    D -0.9  0.3  0.2  1.0  0.6
    E -0.4 -0.4 -0.3  0.6  1.0
    という対称行列があったとして、
    > library(rioja)
    > plot(chclust(as.dist(x)), hang = -1, horiz = TRUE)
    chclust01.png

日頃、デンドログラムを描くことがないので、今までplot.hclust()ってhorizオプションがないことを知らなかった。何か理由があるのだろうか?

インストール済みのパッケージのアーカイブ化(zip形式)

わnがねぇー? (2012-10-27 (土) 11:23:59)

 最近、CRAN より、インストールしたパッケージが、CRANサイトより消えてしまいました。

 新しいPCに、Rをインストールしているのですが、このパッケージも利用する必要があります。

 ンストール済みのパッケージをアーカイブ化(zip形式)して、新しいRの環境で利用する方法はあるのでしょうか?

  • だれか持ってるかもしれないから、ここで告知してみたらいかがでしょう。 -- 2012-10-27 (土) 16:19:00
  • バイナリのパッケージをインストールしているなら、インストールされたパッケージ(のファイル)をそのまま新しいPCにコピーしても動作するとも思いますが。.libPaths()でパッケージのインストール先を調べてましょう。 -- 2012-10-27 (土) 20:11:54
  • まずは,そのパッケージ名を明記すれば? -- 河童の屁は,河童にあらず,屁である。? 2012-10-27 (土) 20:24:01

長さの異なるベクトルを渡した時の"関数の引数"と"配列の要素番号"で展開される順序

satto? (2012-10-26 (金) 02:26:34)

初めて投稿させて頂きます
以下のコードを実行した時に表示される要素番号とその要素が指す値が実際のものと一致しません。

xn <- 2
yn <- 3
zn <- 4
a <- c(1:(xn*yn*zn))
dim(a) <- c(xn, yn, zn)
f1 <- function(x, y, z) {
	cat("a[x,y,z] : ")
	cat(
		sprintf("[%d,%d,%d]=%2d,",
			x, y, z, a[x,y,z])
	)
	cat("\n")
}
f1(1:xn, 1:yn, 1:zn)

おそらく、sprintf()の書式指定子に渡される順序と、配列の[]内でベクトルが展開される順序が一致していないのだと思いますが、このような表示を行うために何か良い方法はないでしょうか。

  • コードの書き込みが崩れてますね、すみません慣れていないもので -- satto? 2012-10-26 (金) 02:27:48
  • > すみません慣れていないもので
    直しておきます。揚げ足を取るようですが,慣れていないのではなくて,新規投稿欄の「お名前」の2行上に書いてある「投稿における注意事項」を読んでいないからでしょう。その中に更に「投稿する前にまず [heart] 投稿文書の書式 [heart] を読んでください」というリンクがあります。ちゃんと読んで最初からちゃんとできる人もいます。
    それはさておき,ベクトル演算と R における配列要素の格納順序について理解されていないからこういう結果になるわけです。添え字と要素を対照して表示したいということで,あなたが定義した f1 という関数をそのまま使うとすれば,引数に添え字のベクトルを与えてはダメです。以下のようにすればあなたの思うような結果が表示されるのでは?(「良い方法」ではなく「正しい方法」ですが)。
    毎回 f1 を呼ぶのではなく 1 回だけ関数を呼んで添え字と配列要素をまとめて表示するという関数を書くことも当然できますが,それは応用問題でしょう。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-26 (金) 08:10:14
    > for (k in 1:zn) {
    +   for (j in 1:yn) {
    +     for (i in 1:xn) {
    +       f1(i, j, k)
    +     }
    +   }
    + }
  • どうもお手数をかけました、先頭にスペースでコードの引用を行うのですね、勉強になります。
    表題の件ですが、やはりfor文を素直に使ったほうがいいみたいですね、なんとかベクトル表記でうまく書けないかと試行錯誤してみましたが、労力に見合わないと判断しました。レスポンスありがとうございました。 -- satto? 2012-10-27 (土) 03:09:54

回帰分析の繰り返し処理のやり方について

悩むぽー? (2012-10-24 (水) 20:15:37)

お世話になります。
処理を繰り返すには、for ループを使えばいいんだろうな?と思うのです。
例えば、回帰分析の結果を変数の組み合わせで、数十回繰り返す場合、どんな処理をするのが、より効率的かと悩んでいます。文法をしっかりと理解しないまま使うことに課題はあるのですが、どなたかご教示ください。よろしくお願いします。

変数ABとvariable1の回帰分析をするとして、変数ABとn個の異なる変数の回帰分析を繰り返す処理です。下記のように、commandを繰り返し入力すれば出来ることですが、、、。

RegModel.1 <- lm(AB~variable1, data=dataset)
summary(RegModel.1)
RegModel.2 <- lm(AB~variable2, data=dataset)
summary(RegModel.2)
RegModel.3 <- lm(AB~variable3, data=dataset)
summary(RegModel.3)
  • 全ての結果を違う名前のオブジェクトに取っておく必要があるのかどうかとか,variable1 〜 variablen を変数名で指定する必要があるかということもあり,その答えによっては eval(parse(text=...)) を使うのではない方法を採る方が効率的ですが。
    以下のようなデータフレーム dataset があるとして,
      AB variable1 variable2 variable3 variable4 variable5 variable6 variable7 variable8 variable9
    1 60        47        51        67        50        46        58        42        55        58
    2 50        57        51        51        70        54        31        46        44        61
    3 38        44        34        48        33        67        51        37        40        56
    4 38        66        46        46        38        48        50        55        49        44
      :
    こんなふうにやる
    n <- 9
    for (i in 1:n) {
      str <- sprintf("RegModel.%i <- lm(AB ~ variable%i, data=dataset); print(summary(RegModel.%i))",
                  i, i, i)
      eval(parse(text=str))
    }
    別のやり方は,簡単。
    ans <- lapply(dataset[,2:10], function(x) lm(dataset$AB~x))
    lapply(ans, summary)
    ans はリストオブジェクトになります。
    どっちがよいですか? -- 河童の屁は,河童にあらず,屁である。? 2012-10-24 (水) 22:09:17
  • ご教示ありがとうございます。今はRとEXCELLを交互に使いながら試しているところですから、Rだけで完結した処理をするには結果を配列変数か何かにとっておいて、表の作成とかモデルの比較とかをすることも考えます。今後、どう進めていくか考えているところなので、このご教示を復習させていただきます。ありがとうございました。 -- 悩むポー? 2012-10-24 (水) 23:33:11
  • あっという間の処理で、驚いてしまいました。ありがとうございます。調べてみると、applay()ファミリーをうまく使うといいのかな?ということが分かりましたが、ロジスティック単回帰をこの手法で同様に実行するとなると、言葉の意味が分からず、困っています。厚かましいとは思いますが、上の例の変数ABが2値の因子としてロジスティック回帰を実行するにはどう書けばいいのでしょうか?よろしくお願いします。 -- 悩むポー? 2012-10-25 (木) 11:40:06
  • > ロジスティック回帰を実行するにはどう書けば
    制御の骨格は同じ。使う関数を変えるだけでしょう。lm の代わりに glm を使って, glm の引数に family=binomial を追加するだけでしょう。
    つまり,lapply(dataset[,2:10], function(x) glm(dataset$AB~x, family=binomial)) のようにするだけ。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-25 (木) 12:01:01
  • ありがとうございます。ご教示の通りと思うのですが、エラー txt と出ますので、私の入力に何が違うか確認します。 -- 悩むポー? 2012-10-25 (木) 13:05:31
  • 原因が分かりました。式の中に余計なスペースが入っていました。このスペースがないと実行されましたので、一気に氷解しました。ありがとうございました。 -- 悩むポー? 2012-10-25 (木) 13:12:58

年次別データの欠損年の自動補間

atr? (2012-10-23 (火) 19:20:06)

お世話になります。
下記のように、'00〜'02年、'04年は測定実施、'03年測定せず、というデータに対し、年毎の平均値を棒グラフ化(または折れ線グラフ化)したい場合に

yr <- sample(rep(c(2000:2002, 2004), length.out=10), 10) #サンプル
sp <- runif(10, min=0, max=7)
DF1 <- data.frame(yr, sp)
MEAN1 <- tapply(DF1$sp, DF1$yr, mean)
barplot(MEAN1)

上記barplot(MEAN1)のように'02年の次が'04年とならず、下記barplot(MEAN2)のように、測定値のない'03年がゼロ等となるようにデータ自動補間またはプロット時に'03年が自動補間する方法はないでしょうか?

DF2 <- DF1
DF2[(nrow(DF2)+1), ] <- c(2003, 0) # '03年平均ゼロ化(便宜上)
MEAN2 <- tapply(DF2$sp, DF2$yr, mean)
barplot(MEAN2) #狙いの出力

測定ナシの年のデータを手動追加で作成、はデータが膨大であり出来れば避けたいです。以上宜しくお願いします。

  • 以下のような関数を作ればよいかと。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-23 (火) 22:02:28
    set.seed(123)
    yr <- sample(rep(c(2000:2002, 2004), length.out=10), 10) #サンプル
    sp <- runif(10, min=0, max=7)
    DF1 <- data.frame(yr, sp)
    MEAN1 <- tapply(DF1$sp, DF1$yr, mean)
    
    func <- function(MEAN1) { # 飛び値のあるデータ
    	Names <- as.numeric(names(MEAN1))
    	MEAN2 <- numeric(diff(range(Names))+1)
    	MEAN2[Names-Names[1]+1] <- MEAN1
    	names(MEAN2) <- Names[1]:Names[length(Names)]
    	return(MEAN2) # 飛び値には 0 を補完したデータを返す
    }
    
    MEAN2 <- func(MEAN1)
    barplot(MEAN2)
    または,yr を,最大・最小を指定して factor にして以下のようにする
    set.seed(123)
    yr <- sample(rep(c(2000:2002, 2004), length.out=10), 10) #サンプル
    sp <- runif(10, min=0, max=7)
    
    yr <- factor(yr, levels=min(yr):max(yr))
    MEAN1 <- tapply(sp, yr, mean)
    barplot(MEAN1)
    お好きな方を
  • 例えば、こんな感じ?0という測定値が観測されたのではなく未測定なら私は0よりもNAがお薦めです。 -- 2012-10-23 (火) 22:36:37
    barplot(MEAN1[as.character(2000:2004)], names.arg=2000:2004)
  • ご教授ありがとうございました。tapply、factor、barplot等々含めてとても勉強になりました。まだまだだなぁ... -- atr? 2012-10-24 (水) 21:59:23

パッケージvcdのモザイクプロットに関するいくつかの疑問

vcd初心者? (2012-10-23 (火) 17:43:10)

お世話になります。
Windows 7上でR i386 2.15.1を使って、vcd_1.2-13を試しています。
パッケージvcdのモザイクプロットに関して、いくつか疑問があります。

library(vcd)
mosaic(Titanic)

とすると、描画領域全体に広がるプロットが作成されますが、次のように仮想データを入力して描画すると、

tab <- matrix(c(10, 30, 40, 60, 70, 30), nrow=3, byrow=T)
dimnames(tab) <- list(Size=c("S", "M", "L"), Gender=c("Male", "Female"))
mosaic(tab, split_vertical=T)

正方形の領域にしかプロットされません。
これを描画領域全体に広げるにはどうしたらよいのでしょうか。

また、度数を各セルに表示しようとして、次のように入力すると、

mosaic(tab, split_vertical=T, labeling=labeling_cells(text=tab))

度数は表示されるのですが、変数名と水準名のラベルが消えてしまいます。
最低、水準名は表示したいのですが、どうしたらよいのでしょうか。

さらに、ラベルを日本語で表示しようとして、次のように入力すると、

> dimnames(tab) <- list(サイズ=c("S", "M", "L"), 性別=c("男", "女"))
> mosaic(tab, split_vertical=T)
 以下にエラー grid.Call.graphics(L_downviewport, name$name, strict) : 
  Viewport 'cell:サイズ=S' was not found

とエラーになってしまいます。日本語が通らないようなのですが、何か対処法はありますでしょうか。

以上、長々と申し上げましたが、どなたか解決策を御教示いただければ幸いです。

  • basic な描画関数によるものではないので,対処が難しいですね。自分で basic な描画関数だけを使って関数を書く...というのは,現実的ではないですけどねえ。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-23 (火) 22:14:34

関数の引数の値の有効性の確認方法の教授願い

ひろ? (2012-10-23 (火) 12:02:25)

関数の引数(パラメータ)aの値がvalidか否かで処理をif分岐することを考えています.しかし,aの値の存在,validが正しく判断できずに困っています.

というのもexists("a")とするとTRUEが返りますが,他is.na,is.null,in.nan等で値の有無を調べると「wrapup 中にエラーが起こりました 'a'が見つかりません」とエラーが返ってきます.aは存在するのに,アクセス出来ない原因がわかりません.お知恵をお貸し頂けると助かります.

■ 追加ソースコード

test<-function(a,b){
	browser()
	missing(a)		# TRUE
	missing(b)		# FALSE
	print(exists("a"))	# TRUE
 	print(exists("b"))	# TRUE
 	print(ls(a))		# [1] "a" "b"
	print(ls(b))		# 正常にオブジェクト一覧表示
	print(search(a))	# wrapup 中にエラーが起こりました
                               #  使われていない引数 (a)
	print(search(b))	# wrapup 中にエラーが起こりました
                               #  使われていない引数 (b)
	is.na(a)		# wrapup 中にエラーが起こりました
                               #  オブジェクト 'a' がありません
	is.na(b)		# FALSE
}
test(b=1)
  • aの居る環境をsearchとlsで調べてみては?自分の場所はenvironmentでも分かります。 -- 2012-10-23 (火) 12:24:34
  • 何をどうやったらそういう結果になるのかを再現できる最小限のプログラム,データを示さないと(環境も),「原因がわかりません」--「そうですか」としかいえませんね。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-23 (火) 13:36:15
  • 引数チェックの話ですよね?if(missing(a)){引数aに値が設定されていない場合の処理}という感じにするのはどうでしょうか。詳しくはヘルプを参照して下さい。 -- 2012-10-23 (火) 14:02:40
  • 名無しの方,拙い説明を理解していただきましてありがとうございます.私が求めていたのは,まさに,missing関数です. -- ひろ? 2012-10-23 (火) 16:12:22
  • 頂いた回答(missing関数)を,河童の屁は,河童にあらず,屁である。さんからいただきました指示通り,説明用に作っていたサンプルに追加した上で上記に示しました.ご指示ありがとうございました. -- ひろ? 2012-10-23 (火) 16:13:02
  • へぇ、以前はデフォルト値が指定されてない引数を与えずに関数呼ぶと、「既定値がないのに引数が渡されていません」みたいなエラーが出た気がするんですが…。(別の言語と混同してるだけ?) -- 2012-10-23 (火) 16:23:37
  • 以前ってどのくらい以前でしょうか?間瀬先生らが翻訳されたマニュアル(ver.1.10, 2000年)にはmissing関数の説明もありますし(p.18)、2000年にmissing関数が存在するということは、少なくともその頃にはすでに規定値なしの引数はOKだったようです。もしかして、自作関数ではなくて既存の関数で引数に値を与えずにエラーになったとかではありませんか。自分以外の人が使う可能性のある関数にif(missing(x)) stop("xに値が設定されていません")という処理を入れるのは常套手段です。 -- 2012-10-23 (火) 16:55:31
  • missing() で TRUE になった引数は,渡されていないのだからその変数に何が入っているかなんていえるわけがないというだけの話でしょう
    missing() が FALSE であることがわかって始めて if 文などで妥当な値が入っているかどうか調べればよいわけでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-23 (火) 18:12:16
    > test <- function(a, b) {
    + 	if (missing(a) || missing(b)) stop("Error 1")
    + 	else if(a < 0 || b < 10) stop("Error 2")
    + 	return(a + b)
    + }
    > test(a=13)
     以下にエラー test(a = 13) : Error 1
    > test(b=1)
     以下にエラー test(b = 1) : Error 1
    > test(a=3, b=9)
     以下にエラー test(a = 3, b = 9) : Error 2
    > test(a=-10, b=20)
     以下にエラー test(a = -10, b = 20) : Error 2
    > test(a=50, b=100)
    [1] 150 
    > test(10, 30)
    [1] 40
  • あぁ、なるほど。自作で定義した関数では出ないんですね。わたしは自分の関数はパッケージ化しているので、missingなんぞを使う機会がないのです。パッケージ化してあれば、ビルトイン以外でも「引数〜がありませんし、省略時既定値もありません」というエラーが出ましたので、わざわざそういった例外処理を書く必要はないですね。 -- 2012-10-23 (火) 18:14:34

添え字が許される範囲か否かを確かめる方法

ひろ? (2012-10-23 (火) 10:46:51)

添え字が許される範囲か否かを確かめる方法はありますでしょうか?

■ 試行内容:
SVMといった機械学習を用い,弁別予測・正解結果より精度を算出しようとしています.

ところが,結果の行列の構成が結果で異なります. 下記の様に,"正常","異常"の2つの行列が通常現れる

pred   異常 正常
  異常 100     0
  正常    0  100

ところが予測結果が悪いと次のように"異常"のみ現れ,"正常"行がないことがあります.結果res["正常",]とすると"wrapup 中にエラーが起こりました 添え字が許される範囲外です"とエラー.

pred   異常 正常
  異常 100   100
  • 行名・列名がない場合は行列の大きさを求めて,使おうとする添え字がその範囲内にあるかどうか見ればよいだけでしょう。
    行名・列名がある場合は,"正常" %in% rownames(a) などで事前にわかるでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-23 (火) 10:54:13
  • 河童の屁は,河童にあらず,屁である。様.添字があるか否かを判定する方法が判りませんでした.ありがとうございました. -- ひろ? 2012-10-23 (火) 11:12:00

hclustの各labelsの枝の長さ

kin? (2012-10-23 (火) 07:59:59)

お世話になります。

hclustで樹形図を作成しています。

今回の質問は、各ラベルから延びている枝の高さを得たいのです。
→ 各ラベルに直接接続している枝の高さです。

dat.hc <- hclust(dat, method="ward")

とした場合、dat.hc$heightで各クラスターごとの枝の高さが得られ、dat.hc$merge でクラスター形成履歴?が判るので、そのラベル(マイナス値)と対応させるのかなと考えていますが、いまいちスマートなスクリプトが思い浮かびません。

アドバイスなど頂ければ幸いです。
宜しくお願いします。

  • > いまいちスマートなスクリプトが思い浮かびません
    正しい答が求まればよいわけで,スマートである必要なんかないのです。
    以下のようにすれば正しい答が出るかな? -- 河童の屁は,河童にあらず,屁である。? 2012-10-23 (火) 10:02:06
    > set.seed(4649)
    > d <- data.frame(x=rnorm(10), y=rnorm(10), z=rnorm(10))
    > a <- hclust(dist(d), method="ward")
    > plot(a, hang=-1)
    > cbind(
    + 	a$order,
    + 	sapply(a$order, function(x) {
    + 		a$height[which(a$merge == -x, arr.ind=TRUE)[1]]
    + 	})
    + 	)
          [,1]     [,2]
     [1,]    9 4.161608
     [2,]    7 1.761123
     [3,]    1 1.093749
     [4,]    3 1.093749
     [5,]    6 1.310064
     [6,]   10 1.310064
     [7,]    4 3.018550
     [8,]    2 1.690142
     [9,]    5 1.290380
    [10,]    8 1.290380
  • 河童の屁は,河童にあらず,屁である。様 早速のご回答ありがとうございました。ご呈示頂いたスクリプトで完ぺきでした。apply系関数やwhichなども片隅に浮かびはしましたが、勉強不足で使いこなせていません。どうもありがとうございました。 -- kin? 2012-10-23 (火) 10:28:38

K-meansの結果出力

Micheal? (2012-10-23 (火) 05:09:56)

dataset <- 1:100
x <- matrix(dataset, 50, 2)
w <- km <- kmeans(x, 2)

の結果得られるClustering vectorを出力したくて

write(w, file="result.txt", ncolumns=1)

としたのですが、うまく出力する事が出来ません。ご示唆を頂ければと思っています。よろしくお願い致します。

  • write(w$cluster, file="result.txt", ncolumns=1) でしょ? -- 河童の屁は,河童にあらず,屁である。? 2012-10-23 (火) 06:31:16
  • どうもありがとうございました。 -- Micheal? 2012-10-23 (火) 07:06:58

mvpartによる決定木描画時の凡例について

SKYLINE? (2012-10-20 (土) 21:54:00)

http://mjin.doshisha.ac.jp/R/19.pdfを参考に mvpart 関数を用いて決定木を描画しました。

library(mvpart)
iris.rp <- mvpart(Species~., data=iris)
plot(iris.rp, uniform=TRUE, branch=0.6, margin=0.05)
text(iris.rp, all=T, use.n=TRUE)

ところが、上記のサイトのような凡例 (色と品種の対応) が表示されません。
どうすれば凡例が表示されるのでしょうか?
ご教授お願い致します。

環境
MacOSX 10.8.2
R 2.15.1
RStudio 0.96.331
mvpart 1.6

  • text(iris.rp,all=T,use.n=T,legend = T) -- okinawa 2012-10-20 (土) 22:28:26
  • okinawa様 お陰様で凡例が表示されるようになりました。ありがとうございました。 -- SKYLINE? 2012-10-20 (土) 23:07:12

数字変換

アトム? (2012-10-19 (金) 07:41:20)

100x250のマトリックス(dim(a)=100, 250)の中に1から9までの数字が入っています。この中から3だけを選んで10に変換したいと思い、

b <- gsub(3, 10, a)

を実行したのですが上手くいきません。ご示唆を頂ければと思っています。

  • このようなことは,R の教科書の最初の方(添え字の使い方などの項)に書いてあることが多いです。一般的な基礎知識としてそのような教科書を読んでおくとよいでしょう。そうでないと,以下のような例を示されただけでは,何がどうなっているのかわからないかもしれませんからね。
    インターネット上のチュートリアルでもよいです。例えばここでは,「行列Tips大全」というページの中に,行列の要素の一部分を置き換える (2004.12.10)みたいなところにもあるわけです。必要になったときに,膨大な内容からこのような小さな記述部分を検索するのは不可能でしょう。必要になるときに備えて,暇なときに読んでおくというのが正しい対処法でしょう。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-19 (金) 08:45:47
    > set.seed(888)
    > a <- matrix(sample(9, 50, replace=TRUE), 10, 5)
    > a
          [,1] [,2] [,3] [,4] [,5]
     [1,]    1    4    6    2    5
     [2,]    4    1    9    2    2
     [3,]    1    1    9    8    4
     [4,]    7    4    7    1    5
     [5,]    7    7    8    4    3
     [6,]    1    9    6    3    8
     [7,]    4    7    6    1    8
     [8,]    3    3    2    9    3
     [9,]    1    8    3    4    4
    [10,]    9    7    8    4    1
    > a[a==3] <- 10
    > a
          [,1] [,2] [,3] [,4] [,5]
     [1,]    1    4    6    2    5
     [2,]    4    1    9    2    2
     [3,]    1    1    9    8    4
     [4,]    7    4    7    1    5
     [5,]    7    7    8    4   10
     [6,]    1    9    6   10    8
     [7,]    4    7    6    1    8
     [8,]   10   10    2    9   10
     [9,]    1    8   10    4    4
    [10,]    9    7    8    4    1

0から始まるデータの読み込み

ひろ? (2012-10-18 (木) 13:01:50)

何時も参考にさせて頂いています。R初心者です。x<-c(034, 0223, 098, 076, 054)というデータを読み込もうと思ったら0が表示されずに、>x 34, 223, 98, 76と読み込まれてしまいます。数字は数値ではありません。0も一緒に読み込む事は出来るのでしょうか?

  • 数値ではなく文字列として読み込めばよいです。 -- 2012-10-18 (木) 13:35:53
    > (x <- c("034", "0223", "098", "076", "054"))
    [1] "034"  "0223" "098"  "076"  "054" 

半角と全角混在文字列のバイト数

kin? (2012-10-18 (木) 10:44:24)

お世話になります。
日本語のフレーズを指定文字数で改行したいと考えています。
しかし、ncharでは半角全角も1文字と判断するので半角と全角混在文字列では、指定文字数で改行を入れても1行の見た目の長さが異なってしまいます。
バイト単位で文字数を得るような関数はありませんか?
宜しくお願いします。

  • ncharのオプションにありましたね。type="bytes" (ヘルプを読んで解決しました。) -- kin? 2012-10-18 (木) 10:49:53

出現回数の計算法

Micheal? (2012-10-18 (木) 09:04:32)

R初心者です。ランダムな組み合わせの数字が入ったデータフレームを作成しました。

y <- c(897, 34565, 32, 1,345, 324, 98765, 808, 897, 808, 808, 456, 3, 454, 3, …)
length(y)=30000

この中から同じ組み合わせの数字が幾つ出現しているかを調べ表示したいのですが、解決方法はありますでしょうか?得たい出力は、

(組み合わせの数字,出現回数)

808, 2
1345, 35
32, 3
…

です。よろしくお願い致します。

  • 同じ組み合わせの数字ってのが何のことかわからないのですが、同じ数字を数えるならtable(y) -- 通りすがりの仮面ライダー? 2012-10-18 (木) 10:28:53
  • 通りすがりの仮面ライダー様、返信ありがとうございました。y<-c(1,2,3,4,2,3,4,5)、x<-table(y)としたら、望み通りの結果が得られました。第1行 1,2,3,4,5第2行 1,2,2,2,1。これを保存する為に、write(y, file="resultramdon.txt", ncolumns=1)としたら計算結果だけが保存されました。これを一列目に要素(1,2,3,4,5)、二列目に計算結果(1,2,2,2,1)として出力する為にはどの様にしたら宜しいのでしょうか?宜しくお願い致します。
    記事を「編集」しましょ -- Micheal? 2012-10-18 (木) 11:13:53
  • write.csv(as.data.frame(table(y)), file="resultramdon.csv", row.names=FALSE, quote=FALSE) -- 通りすがりの仮面ライダー? 2012-10-18 (木) 11:38:01

異なる列数のデータフレームの連結

ひろ? (2012-10-15 (月) 15:12:54)

いくつかの列は同じ列名で,幾らか異なる列名のdata.frameを2つ行連結したいのですが,列数が一致しないとエラーが返ってきて実現できません.解決方法がないでしょうか?

例えば,data.frame1とdata.frame2があるとします.2つの行連結すると,共通の列名が有るところは通常通り連結して,無い箇所は"NA"といった値で補完され,結果data.frame.Answerに成ることが希望です.

data.frame1:

    A    C    D
1   1    2    3
2   4    5    6

data.frame2:

    A    B    C    D
1   7    8    9   10
2  11   12   13   14

data.frame.Answer(<- data.frame1+data.frame2)

    A    B    C    D
1   1    NA   2    3
2   4    NA   5    6
3   7    8    9   10
4  11   12   13   14
  • data.frame.Answer <- merge(data.frame1, data.frame2, all=TRUE) とします(列名の順序が希望するものではなくなるでしょうが,不都合はないでしょう) -- 河童の屁は,河童にあらず,屁である。? 2012-10-15 (月) 15:34:41
  • 河童の屁は,河童にあらず,屁である。様,質問の度回答お疲れ様です.私の問題も解決できました.ありがとうございました. -- ひろ? 2012-10-15 (月) 15:58:40
  • これに関係しているので教えていただけると助かるのですが,mergeの過程において,「重複している列」と「そうでない列」って分離して取得できますか? -- ひろ? 2012-10-15 (月) 16:33:53
  • merge の過程においてということは必要ないと思いますが,重複している列とそうでない列を取り出すには,以下の例を見ればわかると思います。
    列を少し追加したデータフレームを実際に操作してみましょう。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-15 (月) 16:50:22
    > a
      A C D E F
    1 1 2 3 1 4
    2 4 5 6 4 6
    > b
       A  B  C  D X
    1  7  8  9 10 4
    2 11 12 13 14 9
    
    > (n.a <- colnames(a))   # 列名を取り出す
    [1] "A" "C" "D" "E" "F"
    > (n.b <- colnames(b))   # 列名を取り出す
    [1] "A" "B" "C" "D" "X"
    
    > setdiff(n.a, n.b)      # a にあって b にない列
    [1] "E" "F"
    > a[setdiff(n.a, n.b)]   # a から取り出す
      E F
    1 1 4
    2 4 6
    
    > setdiff(n.b, n.a)      # b にあって a にない列
    [1] "B" "X"
    > b[setdiff(n.b, n.a)]   # b から取り出す
       B X
    1  8 4
    2 12 9
    
    > intersect(n.a, n.b)    # 両方に共通する列
    [1] "A" "C" "D"
    > a[intersect(n.a, n.b)] # a から取り出す
      A C D
    1 1 2 3
    2 4 5 6
    > b[intersect(n.a, n.b)] # b から取り出す
       A  C  D
    1  7  9 10
    2 11 13 14
  • 河童の屁は,河童にあらず,屁である。様.お世話になっております.例文を付けて教示下さいましてありがとうございました.mergeやsetdiff,intersectら関数知りませんでした.後半の質問はwhichやらany?なんかと使って取り出せそうだったのですが,これら関数を知り得たので開発の負担が減りそうです.ありがとうございました. -- ひろ? 2012-10-15 (月) 17:19:06

コンソール画面の更新

kin? (2012-10-14 (日) 07:25:10)

時間がかかる処理の進行状況がわかるようにcatにてコンソールに出力しています。
しかし、コンソール画面の行数が26行とすると、そこまでの出力が溜まらないと画面に表示されないようです。
RGUI設定のbuffer console by deault?のチェックは外しています。

現在は、事前に改行(\n)を26個くらい出力することで対応していますが、他に良い方法はありますでしょうか?

  • コンソール画面の行数を数行にしておけばよいのでは?
    そもそも,どれくらいの処理が何秒くらいで終わるというのが分かっていれば,ストップウオッチでも用意しておけばよいだけではないですか。処理状況の表示は気休めに過ぎないので,表示があろうがなかろうが,処理時間は同じ(ヘタにやると処理時間を増やすことになる) -- 河童の屁は,河童にあらず,屁である。? 2012-10-14 (日) 21:12:57
  • コメント有難うございました。flush.console()ではうまくいきませんでした。コンソール画面の行数を数行にするのも1手段ですが、そのためのディメリットもありますので。なお、処理状況の表示は気休めにすぎませんが、多くのソフトウエアーでプログレスバー等の機能は実装されており、重要なインターフェイスと考えております。 -- kin? 2012-10-15 (月) 04:45:04
  • ちゃんと処理しているのか気になりますよね。こここ、参考になりませんか?http://www.r-bloggers.com/progress-bars-in-r-using-winprogressbar/ -- 2012-10-15 (月) 10:06:14
  • winProgressBar?のご紹介有難うございました。この関数はこれから頻繁につかわさせて戴くことになりそうです。大変助かりました。 -- kin? 2012-10-15 (月) 19:48:13

geoRでのバリオグラム作成について

cet? (2012-10-14 (日) 01:46:07)

はじめまして。いつもこちらを参考にさせていただいています。
R初心者なのですが、どうしても研究でKrigingによる空間補間が必要になり、現在、R version 2.15.1(Win7/64bit)でgeoRのパッケージを利用しています。
緯度、経度、値の情報が入ったcsvを読み込みchl200708というデータフレームを作成しました。(緯度範囲:30-55N,経度範囲:140-180E データ行数:57690)

このような形式のデータを使用しております。

> head(ttt200708)
      lon    lat     ttt
1 140.042 54.958 0.73995
2 140.083 54.958 0.74817
3 140.125 54.958 0.74817
4 140.167 54.958 0.77717
5 140.208 54.958 0.77717
6 140.250 54.958 0.78524

(7~57690行目は省略いたします) このデータをパッケージgeoRコマンドを用いて

testgeo <- as.geodata(ttt200708)

でgeodataの形式にすることはできました。
しかし、距離行列を計算しようとすると”負の長さのベクトルは許されません”というエラーが出てしまいます。
同様に、バリオグラムを作成しようとすると

> vario1 <- variog(testgeo,max.dist=0.1)
variog: computing omnidirectional variogram
 以下にエラー dist(as.matrix(coords)) :  負の長さのベクトルは許されません 

となってしまいます。緯度・経度の並び順が悪いのかと思い、昇順・降順を入れ替えてみたりしましたが、それでも同様のエラーになってしまいます。
オンラインでもこの間違いの解決方法を探したのですが、みつかりませんでした。

勉強不足なのはわかっているのですが、どこかにこの解決方法が載っていますでしょうか?
もし、解決方法をご存知でしたら、教えてください。
どうぞよろしくお願いいたします。

  • いろいろやってみましたが,エラーが再現できません。「緯度・経度の並び順が悪いのかと思い、昇順・降順を入れ替えてみたりしましたが、それでも同様のエラー」ということですが,あなたのデータのどこに問題があるのか突き止めてみてください。まずデータを半分に分けて両方のデータでやってみてください。どちらか,あるいは両方ともエラーが出るかも知れませんが,エラーの出たデータを更に半分に分けて両方で分析してエラーの出る方をまた半分に分けて,というように繰り返します。そのうち,データ数はドンドン少なくなっていき,目で見て原因となるデータが見つかるかも知れません。それでも原因が分からなければ,20個くらいのデータなら,ここにアップロードすればよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-14 (日) 08:54:34
  • 河童の屁は,河童にあらず,屁である。様 ご丁寧なアドバイスありがとうございました。全576960データのうち、約8パーセントに当たる46000データ位になったところでエラーが変わりました(ttt200708_2 にデータを格納しました)。
    > testgeo2 <- as.geodata(ttt200708_2)
    > vario1 <- variog(testgeo2,max.dist=0.1)
    variog: computing omnidirectional variogram
       エラー:サイズ2.9Gbのベクトルを割り当てることができません
        追加情報: 警告メッセージ: 1:In as.vector(dist(as.matrix(coords))) :
         Reached total allocation of 8072Mb : see help (momory.size)
    というエラーがでました。これを調べてみたところ、データが大きすぎて私のパソコンでは扱えないのだという理解に至りました。データが大きすぎるということは、小さな区画に分けて解析を行う以外の方法がないということでしょうか? -- cet? 2012-10-14 (日) 13:00:15
  • データを35000行ほどにすると、一応バリオグラムを作ることができるようです。 -- cet? 2012-10-14 (日) 13:01:34
  • > データが大きすぎるということは、小さな区画に分けて解析を行う以外の方法がないということでしょうか?
    あなたは,最初「データ行数:57690」と書いていましたでしょう。どうりで,私がいくら条件を色々変えて追試しても再現できないわけだ。
    576960データとは大きいですね。確かに,その大きさのデータを作ってやってみたら,出ましたね,同じエラーメッセージ。
    以下にエラー dist(as.matrix(coords)) :  負の長さのベクトルは許されません 
    Mac の 64 bit 版の R ですが,この条件じゃあお手上げかな。
    距離行列を作るわけだけど,どれだけのメモリーが必要になるか,計算してみてください。576960^2*8/1000000000000≒2.7テラバイトですよ。どう逆立ちしても無理でしょう。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-14 (日) 13:38:39
  • 河童の屁は,河童にあらず,屁である。様  本当にありがとうございました。データ数の件、大変申し訳ありません。当たり前のことですが、以後、しっかりと投稿内容をチェックしてから投稿いたします。やはり、大きなデータは無理なのですね。そして、距離行列に必要なメモリー等、完全なる勉強不足でした。データを小さくしてやっていきます。ありがとうございました。 -- cet? 2012-10-14 (日) 14:36:29

tickの長さ

MY? (2012-10-12 (金) 02:50:04)

いつもお世話になっております。
plot関数などの作図関数を使ってグラフのx軸、y軸の目盛りの線の長さを調節したいのですがどのようにすれば良いでしょうか?目盛りの太さを調節するにはlwd.ticksオプションをいじればよいことは分かったのですが...
どうぞよろしくお願い致します。

  • オンラインヘルプを見ましょう。? par によって,あなたが求める答えが得られます。
    tcl The length of tick marks as a fraction of the height of a line of text. The default value is -0.5; setting tcl = NA sets tck = -0.01 which is S' default.
    ということです。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-12 (金) 07:56:36
  • どうもありがとうございました。parのhelpには作図の色々なパラメーターが載っているのですね。勉強になりました。 -- MY? 2012-10-12 (金) 12:52:56

合計値

Micheal? (2012-10-11 (木) 07:40:43)

R初心者の者です。

dataset=c(1,9,2,7,72,3,7,99,21,20,11,12,122,45,198,334,43,39,34,45…)
(要素数は100個)というデータセットにおいて、前から順に5個づつ合計していきたいのですが、計算方法が分かりません。イメージは(1+9+2+7+72, 3+7+99+21+20, 11+12+122+45+198, ….)です。どうぞ、宜しくお願い致します。

  • 5×20の行列にして,colSums を使えばよいでしょう(20×5の行列でもよいですが...作り方に注意...byrow=TRUE にするそして rowSums を使う)。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-11 (木) 11:24:54
    > dataset <- 1:100            # データ例
    > x <- matrix(dataset, 5, 20) # 行列を作る
    > x[,1:4]
         [,1] [,2] [,3] [,4] 5 列目以降は略
    [1,]    1    6   11   16
    [2,]    2    7   12   17
    [3,]    3    8   13   18
    [4,]    4    9   14   19
    [5,]    5   10   15   20
    > colSums(x)                  # 列方向に(5 個ずつの要素の)和
     [1]  15  40  65  90 115 140 165 190 215 240 265
    [12] 290 315 340 365 390 415 440 465 490
  • 河童の屁は、河童にあらず、屁である様、ありがとうございました。行列を作ってみたら各要素がInteger,20と表示され、上手く行列を作る事が出来ません。宜しくお願い致します。 -- Micheal? 2012-10-11 (木) 22:13:38
  • > 行列を作ってみたら各要素がInteger,20と表示され、上手く行列を作る事が出来ません。
    各要素がInteger,20 って,何をどうやったら表示されたのですか?あなたの説明では,何がどうなっているのか,よく分かりませんね。エラーメッセージの表示を含む実行過程をコンソールからコピー&ペーストしてみてください。状況をちゃんと伝えないと,適切なアドバイスができません。
    ベクトルから行列を作るということは分かりますか?例に挙げたのは,あくまでも例ですよ。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-11 (木) 22:24:40
  • あなたが,dataset=c(1,9,2,7,72,3,7,99,21,20,11,12,122,45,198,334,43,39,34,45…) と書いたのは,データフレームの要素のことなんですね(= を使っているのは 付値 <- のつもりだろうと思ったのだけど,そうじゃなかったんだ)データセットなんて言葉を使うものだから,混乱に輪を掛ける。
    例えば,d <- data.frame(dataset=c(1,9,2,7,72,3,7,99,21,20,11,12,122,45,198,334,43,39,34,45…)) ということで,そして,あなたは行列を作るときに x <- matrix(d$dataset, 5, 20) ではなく,x <- matrix(d, 5, 20) とやっちゃったんだ。
    そりゃ,そういうことをすれば,"Integer,20" みたいなのを要素(その要素は list)とする行列みたいなものができますな。
    質問も,ちゃんとしないと,正解は出ませんよ。
    データフレームの要素(列)を使って行列を作るには,x <- matrix(データフレーム名$要素, 行数, 列数) のようにするんです。-- 河童の屁は,河童にあらず,屁である。? 2012-10-11 (木) 22:38:57

各行のカウントの仕方について

sheet? (2012-10-09 (火) 23:11:19)

24行x500列の時系列データ(=data)で、1〜24行の各行が時間、1〜500列が人物の位置データになっています。1=家、2=オフィス、3=買い物…10=それ以外、で表しています。 (data[,1]=(10,10,10,10,10,10,10,10,4,4,2,2,2,2,2,2,2,2,2,2,3,4,4,10)、の様な)

これらのデータから各要素(1から10)の各時間毎の総計(rowSums(data==1), rowSums(data==2)….)を取り出し、更にその各時間毎(各行毎)に「新たにその行動を起こした人の数だけを数えたい」と思っています。例えば

data[,1]=(1,10,10,10,10,10,10,4,4,4,2,2,2,2,2,2,2,2,2,2,3,4,4,10)
data[,2]=(10,10,10,10,10,10,10,10,4,4,4,4,2,2,2,2,2,2,2,2,3,4,4,10)
data[,3]=(10,10,10,10,3,3,4,4,4,4,2,2,2,2,2,2,2,2,2,2,3,4,4,10)

というデータセットにおいては、第一行のrowSums(data==10)=2, rowSums(data==1)=1になると思います。

ここでdata[,1]では第一行に1が初めて現れているので、3つのデータセット全てにおける第一行の1という要素の合計数は1(rowSums(data==1)=1)。反対に、data[,2]とdata[,3]においては10という要素が現れているので、第一行の10という要素の合計は2となります(rowSums(data==10)=1)。

しかし第二行を見てみると、data[,1]では10という要素が「新たに」現れているので、第二行の10という要素に関してはカウントするのですが、data[,2]とdata[,3]の第二行は10となっていて、第一行から連続しているので「新しく行動を起こした人」とは考えず、カウントしない事とします。この場合、第二行のrowSums(data==1)は1、第二行のrowSums(data==10)は2となる様に計算したいのですが、どの様にすれば良いのか検討が付きません。

何かご示唆を頂ければと考えております。よろしくおねがいします。

  • 「第二行のrowSums(data==10)は2となる様に計算」というのは,間違いでは?直前の説明では 1 とするのではないですか?
    他にも説明のおかしいところがありますが,要するに「新しく行動を起こした人」を数えたいのですから,大元のデータで,直前と同じコードがであれば例えば0で置き換えておいてやればよいのでは?旨い置き換え方もあるでしょうけど,まずは分かりやすく書いてみて,正しい答えがほどほどの時間で得られればそれでよしと。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-10 (水) 08:18:15
    > d <- cbind(c(1,10,10,10,10,10,10,4,4,4,2,2,2,2,2,2,2,2,2,2,3,4,4,10),
    + c(10,10,10,10,10,10,10,10,4,4,4,4,2,2,2,2,2,2,2,2,3,4,4,10),
    + c(10,10,10,10,3,3,4,4,4,4,2,2,2,2,2,2,2,2,2,2,3,4,4,10))
    > d2 <- apply(d, 2, function(x) {
    + 	y <- c(0, x[1:23])
    + 	ifelse(x==y, 0, x)
    + 	})
    > d2
          [,1] [,2] [,3]
     [1,]    1   10   10
     [2,]   10    0    0
     [3,]    0    0    0
     [4,]    0    0    0
     [5,]    0    0    3
     [6,]    0    0    0
          以下略
    > rowSums(d2==1)
     [1] 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    > rowSums(d2==10)
     [1] 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3
  • ありがとうございました。 -- sheet? 2012-10-10 (水) 11:37:20
  • 上と同じ類いのデータで引き続き質問なのですが、同じ数(0は除く)が連続で出現した際に、その数が現れた回数の合計を数え、その計算結果を元々あった数字と入れ替える事は可能でしょうか?例えば、
    d <- cbind(c(0,0,0,10,10,10,0,0,0,0,0,10,10,10,10),
               c(10,10,10,0,0,0,0,0,0,0,0,0,10,10,10),
               c(0,10,10,10,10,10,10,0,0,0,0,0,0,0,0))
    というデータにおいて、第一行においては10が3回と4回現れ、第二行においては10が3回と3回、第三行においては10が6回現れています。よってこれを
    d <- cbind(c(0,0,0,3,3,3,0,0,0,0,0,4,4,4,4), 
               c(3,3,3,0,0,0,0,0,0,0,0,0,3,3,3),
               c(0,6,6,6,6,6,6,0,0,0,0,0,0,0,0))
    としたいのですが。よろしくおねがいします。 -- sheet? 2012-10-12 (金) 08:29:24
  • スレッドのつじつまが合わなくなったので,もとのコメントは省略
    以下のようにすればいかが? -- 河童の屁は,河童にあらず,屁である。? 2012-10-12 (金) 16:42:08
    a <- sapply(apply(d, 2, rle), function(x) {
    	l <- x[[1]]
    	v <- x[[2]]
    	v <- ifelse(v, l, v)
    	rep(v, l)}
    	)
    a
  • 河童の屁は, 河童にあらず, 屁であるさん、どうもありがとうございました。続けて質問なのですが、全く同じ条件でdが1000行とか沢山ある場合の繰り返し計算はどの様にすれば良いのでしょうか?よろしくおねがいします。 -- sheet? 2012-10-14 (日) 01:04:15
  • > 全く同じ条件でdが1000行とか沢山ある場合の繰り返し計算
    状況がよくわかりませんが?普通にやればよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-15 (月) 15:40:58
  • 河童の屁は、河童にあらず、屁であるさん、曖昧な質問の仕方をしてしまい、大変申し訳ありませんでした。
    d <- cbind(c(0,0,0,10,10,10,0,0,0,0,0,10,10,10,10),
               c(10,10,10,0,0,0,0,0,0,0,0,0,10,10,10),
               c(0,10,10,10,10,10,10,0,0,0,0,0,0,0,0))
    というデータにおいて、同じ数(0は除く)が連続で出現した際に、その数が現れた回数の合計を数え、その計算結果を元々あった数字と入れ替えるという質問において下記の様な回答を得ました:
    a <- sapply(apply(d, 2, rle), function(x) {
    	l <- x[[1]]
    	v <- x[[2]]
    	v <- ifelse(v, l, v)
    	rep(v, l)}
    	)
    a
    これを実行すると:
    [,1] [,2] [,3]
    [1,] 0 3 0
    [2,] 0 3 6
    [3,] 0 3 6
    以下略
    となり期待通りの結果が得られました。
    さて、上の例では3行15列の小さな行列だったのですが、これをもう少し大きい行列にした場合の計算式はどうなるのでしょうか?つまり1300行×1600列の様な場合はという事なのですが‥‥。
    繰り返し計算法で、Nやiを用いるのかな?という事は想像出来るのですが、実際に計算式に組み込むとなるとちょっと分かりません。よろしくおねがいします。 -- sheet? 2012-10-17 (水) 00:26:10
  • 例で示した d は15×3の行列だったのだけど,それが1300×1600になっても同じでしょ?d の大きさによってプログラムが変わるわけではないですよ。やってごらんなさい。
    なお,投稿書式についてはちゃんと確認してください。ぐちゃぐちゃで読めたものじゃなかった。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-17 (水) 07:10:51

時系列データ変換

Pen? (2012-10-09 (火) 08:18:53)

時系列データを作っています。各列に個人のIDを振り、各行には毎分毎に、その個人から得られたデータを保存してあります。データは100人から得られたので、列の総計は100。行は1日を分毎に保存してあるので、24(h) x 60 (min) = 1440行となっていて、それを行列(=a)としてRに読み込みました。ここから時系列データにする為に、ts関数を使って

a <- ts(a, start=0, frequency=1440)

としたら、

第一行:0,000000000
第二行:0,0006944444
第三行:0,0013888889
第四行:0,002083333
....

となってしまいました。
この数字は一体何なのでしょうか?
普通の時刻(00:00:00, 00:01:00, 00:02:00)で表示する事は可能なのでしょうか?
何かアドバイスを頂ければ幸いです。

  • > この数字は一体何なのでしょうか?
    質問が不明瞭なのだけど,行ラベルが,0.0006944444,0.0013888889 となっているということなんだよね。0,0006944444 じゃなくて,0.0006944444でしょ?
    それは,あなたが指定した frequency の逆数(1/1440=0.0006944444)を増分とする等差数列ですよ。
    で,その行ラベルを 00:01:00 などとしたいということなんだね?
    以下のように行ラベルを付け直してやればよいかな。00:00:00 〜 23:59:00 の文字列を作るのは別法もあろう。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-09 (火) 09:33:56
    > a <- ts(matrix(rnorm(1440*100), 1440, 100), start=0, frequency=1440)
    > rownames(a) <- substring(as.POSIXct(0:1439*60, origin="2012-01-01"), 12, 19)
    > a[1:10,1:5]
               Series 1   Series 2    Series 3      Series 4   Series 5
    00:00:00  0.3842177 -0.2572337  0.77637479 -1.4475976202  1.3714974
    00:01:00  1.2847077  0.2472553 -0.33261748  1.8957044334  0.2877515
    00:02:00 -1.8002028 -0.1887225  0.59084323 -0.6793383289  0.4185490
    00:03:00 -0.8671542  0.6765212  0.34528150 -0.0985912968  0.2143888
    00:04:00  0.9490067 -1.7888453  1.01909404 -0.4561435524  0.3423056
    00:05:00  0.8383023 -0.2663956  1.14336704  0.7110252003 -0.2873150
        以下略

計算結果の出力について

SP? (2012-10-09 (火) 07:56:54)

PP.test の繰り返し計算で得られた結果を出力したいのですが、どうにも上手くいきません。

for (i in 1:3) {
  b <- PP.test(a[, i])
  print(b)
}

という計算式を作り、得られた結果は

Phillips-Perron Unit Root Test
data:  a[, i] 
Dickey-Fuller = -3.5585, Truncation lag parameter = 7, p-value = 0.03666

	Phillips-Perron Unit Root Test
data:  a[, i]
Dickey-Fuller = -3.8536, Truncation lag parameter = 7, p-value = 0.01631

	Phillips-Perron Unit Root Test
data:  a[, i] 
Dickey-Fuller = -7.0615, Truncation lag parameter = 7, p-value = 0.01

となりました。この P-value だけをまとめて出力したいと思っています。ファイル形式は何でも構いません。宜しくお願いします。

  • PP.test(a[, i])$p.value で表示されます。 -- 2012-10-09 (火) 09:18:13
  • 早速のお返事、どうもありがとうございます。PP.test(a[,i])$p.valueを試してみたのですが、返ってきた答えは[1]0.01でした。これは上の3つある結果の内の最後の値に対応していると思うのですが、3つ- matrix(d, 5, 20) とやっちゃったんだ。
    そりゃ,そういうことをすれば,とも同時に表示する方法は無いのでしょうか(iを1000くらいまで増やしたいので)?宜しくお願いします。 -- SP? 2012-10-09 (火) 09:57:50
  • 前回答者は,p 値だけを取り出すにはどうしたらよいかを示してくれたのだから,それを格納しておいて後で纏めて出力するのはあなたに任されたわけですよ。
    n <- 1000
    a <- matrix(rnorm(500*n), ncol=n)
    b <- numeric(n)
    for (i in 1:n) {
    	b[i] <- PP.test(a[,i])$p.value
    }
    print(b)
    のようにしてもよいし,下の「通りすがりの仮面ライダーさん」みたいにしてもよいし。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-09 (火) 10:17:21
  • unlist(lapply(apply(a, 2, PP.test), function(x){x$p.value})) -- 通りすがりの仮面ライダー? 2012-10-09 (火) 10:17:28
  • apply(a, 2, function(x) PP.test(x)$p.value) で十分ですね。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-09 (火) 10:24:23
  • 河童の屁は, 河童にあらず, 屁である。さん、通りすがりの仮面ライダーさん、大変ご丁寧な返信ありがとうございました。nとaを定義し、b<-numeric(n) for (i in 1:n) {b[i]<-PP.test(a,[,i])$p.value} print(b)とした所、計算結果がn個出てきました。しかし、ある一定の所から後ろ全ての計算結果(213番目から後ろ全て)が0.00000000と表示されてしまいます。例えば、1000個纏めて出力した結果の300番目は0.00000000と表示されているのですが、個別にPP.testを計算すると違う数値が結果として出てきます。つまりPP.test(a[,300])$p.valueとすると、返ってくる結果は0.01なのです。試しにもう1つやってみた所(PP.test(a[,400])$p.value)、返ってきた結果は0.01でした(こちらも纏めて出力した時は0.00000000と表示されてしまいます)。という事は、最初に入力したaのデータは正しく認識されていると思うのですが‥‥。何故全体で纏めて出力すると、違う結果が表示されるのかが分かりません。宜しくお願いします。 -- SP? 2012-10-09 (火) 11:24:38
  • 通りすがりの仮面ライダーさんのやり方ではどうなります? -- 河童の屁は,河童にあらず,屁である。? 2012-10-09 (火) 11:35:04
  • 河童の屁は, 河童にあらず, 屁である。さん、unlist(lapply(apply(a,2,PP.test),function(x){x$p.value}))とするとエラーが表示されます。Error in FUN(newX[, i], ...) : singularities in regression。そしてapply(a,2,function(x) PP.test(x)$p.value)とした時もエラーが表示され、Error in PP.test(x) : singularities in regressionとなります。これはどういう意味なのでしょうか?又、個別にPP.testを行った場合と、纏めてやった場合とでは、何かしらの違いが出るものなのでしょうか?色々と調べてみたのですが、R初心者なのでサッパリ分かりません。宜しくお願いします。 -- SP? 2012-10-09 (火) 11:50:54
  • singularities 云々は,PP.test の中で,重回帰分析のために lm 関数を呼んでいて,解の $rank が 2 以下だとこのエラーが出ます。その引数(データ)に問題がある(正規方程式が解けない:特異行列である)ということですね。問題の起こるデータ(列)を調べてみてはいかがでしょうか?
    このエラーがあると,プログラムの実行(for ループ)が打ち切られて,その後の列に対する分析はされないので,その後の P 値(にかぎらず全ての値)が求められていませんね。for ループでやるときも,同じエラーメッセージがでているでしょう?
    ちゃんとしたデータなら,for でちまちま結果を蓄積しても,apply でやっても同じ結果(問題ない結果)になると思いますよ。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-09 (火) 12:18:39
  • 河童の屁は, 河童にあらず, 屁であるさん、どうもありがとうございました。 -- SP? 2012-10-09 (火) 23:21:14

散布図のプロットを分散化する方法

yy? (2012-10-04 (木) 13:17:40)

対応分析や多次元尺度構成法などで散布図を作成しています。

データや解析手法により座標面の一部分に集中してプロットされることがしばしば発生しています。

この際に、作成されたプロットデータをスプリングモデルのような感じでノードの近いものは斥力が発生し、遠いものは引力が発生するみたいな感じで、ノードを分散させてみたいと考えていますが具体的な関数や手法の見当が全くついていません。

なにか、アドバイスをいただければ幸いです。

  • > ノードの近いものは斥力が発生し、遠いものは引力が発生するみたいな感じで、ノードを分散させてみたい
    散布図とは実態を表すものなのだから,集まっているものをバラカシテ表示したら実態を表さないものになってしまいますよねえ。そのような図に意味があるんですか?
    そのような場合の散布図の描き方のひとつとして,アルファチャンネルを使うというのはいかがでしょうかね?
    plot(iris[,1:2], col="#00aa0030", pch=19) などのようにすれば,データの集中している所は濃い色になります。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-04 (木) 13:35:44
    alpha.png
  • 河童の屁は,河童にあらず,屁である。様 早速のコメント有難うございます。> 散布図とは実態を表すものなのだから・・・ごもっともなのですが、今回の解析対象は数千件の文書の視覚化を行っていて、それに対応分析を使用しています。各プロットをidentifyで特定することで、内容をcatでコンソール表示していますが、文書集合の中に特別変わったものが存在すると、それに影響され、他の大部分の文書が集中してしまうことがあります。そうすると各プロットを正確にクリックできなくなってしまいます。そこで数値的な正確性は犠牲にしてもプロットを分散させたいと考えております。解析の元データの文書形態素行列で特異な文書の形態素数などを細工すればよいのか?などと漠然と考えてはおりますが頭が悪いもので・・・よろしくお願いします。 -- yy? 2012-10-04 (木) 15:03:55
  • > 各プロットを正確にクリックできなくなってしまいます
    そのような目的ならば,散布図にする結果データ(座標値データ)をクラスター分析すればよいでしょう。どれがどのクラスターに入るかが,ちゃんと把握できますよ。添付図は,iris データセットを cmdscale で分析して,その結果をプロットしたものと,その座標値をクラスター分析した結果の右の方にあるクラスターの様子。このクラスターには 最初の 1~50 番の setosa が入っているのがわかりますよ。
    数千もののなかからクリックしようとすること自体が異常でしょう。 -- 河童の屁は河童の屁は,河童にあらず,屁である。? 2012-10-04 (木) 15:53:16
    cmdscale.png
  • 今回の目的の1つにインタラクティブな操作性があります。すなわち文書名がクラスター分析で確認できても、その内容確認のため、またCSVなどの元データを確認する手間を省きたいのです。散布図ではidentifyで文書を特定できますので便利だと考えています。デンドログラムなどでもそのようなこと(クリックで文書名を特定し、詳細を画面表示)が可能でしょうか?PS:あれから各種対応分析を試し、それらの引数を変更することを試行しながらなんとか分散化?ができました。 -- yy? 2012-10-05 (金) 05:12:27
  • > あれから各種対応分析を試し、それらの引数を変更することを試行しながらなんとか分散化?ができました
    そのノウハウを開陳してみては? -- 河童の屁は,河童にあらず,屁である。? 2012-10-05 (金) 21:23:28

引数名の表示

taked? (2012-10-03 (水) 18:58:04)

関数の引数名を表示させたいのですが、可能でしょうか?
下はうまくいっていない例ですが、このような関数を実行したときに引数名(オブジェクトの変数名)である"y"をcat変数などで表示させたいです
yはベクトルです。よろしくお願いします。

 y <- c(1.9, 0.8, 1.1, 0.1,-0.1,4.4,5.5,1.6,4.6,3.4)
 Data <- function(x){
 #  cat(names(x))
 }
 Data(y)
  • deparse(substitute(argument)) で取り出すことができます。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-03 (水) 21:16:57
    >  y <- c(1.9, 0.8, 1.1, 0.1,-0.1,4.4,5.5,1.6,4.6,3.4)
    >  Data <- function(x){
    +  	cat(deparse(substitute(x)), "\n")
    +  }
    >  Data(y)
    y 
    >  long.name <- 1:10
    >  Data(long.name)
    long.name
  • 解決できました。河童の屁は,河童にあらず,屁である。様ありがとうございました。 -- taked? 2012-10-05 (金) 10:09:43

線形判別分析をしたいのですが(エラー:variables are collinear)

? (2012-10-03 (水) 15:42:52)

はじめまして。
線形判別分析を用いて、個人認証システムを実装しようと考えています。
元になる波形はcsv形式で保存されており、
30000行×10列で、1〜5列目が人物yの波形データ、残りが人物mの波形データです。

eegMY <- matrix() #空の行列を用意
eegMY <- matrix(scan("csvファイルのパス",sep=',',n=30000),nrow=30000,ncol=10,byrow=T) #行列にデータを読み込む
eegMYt <- t(eegMY) #転置する
name <- matrix(, nrow=10, ncol=1) #個人を判別するための情報をy,mとして、行列を用意する
name[1:5,1] <- "y"
name[6:10,1] <- "m"
x <- cbind(name,eegMYt) #データと個人識別行列を結合する
z <- x[1:10,1:101] #※1
y <- as.data.frame(z) #ldaは行列形式は対応していないのでデータフレームに型変換する
library(MASS)
ldadata <- lda(V1~.,data = y) #実行できない(エラー:variables are collinear)

※1 データが大きすぎるため実行できないようなので、とりあえず範囲を区切っています。
現在このようなコードになっています。
V1に用意した個人認証用の"y"か"m"が入っているので、それをもとにldaを実行したいのですが、

In lda.default(x, grouping, ...) : variables are collinear

という警告メッセージが表示されます。
どのようにすれば、このプログラムが完成に向かうでしょうか?

この様な、本格的なコードを書くのは初めてなので、見当違いの質問かもしれませんが、ご教授いただけたら幸いです。よろしくお願いします。

  • 最終的に使われるデータ行列 z は 10行101列ですね?判別分析の実行例などを見てもらうとよく分かりますが,判別に使う変数が判別する例数(データ数)より多いのはダメです(多変量解析の常識です)。つまり,延べ10人の判別に使えるのは8変数までです(被説明変数1個分少なくなる)。少なければよいというものでもなく,同じくらいだと不安定な判別関数しか得られません。
    延べ 10 人を判別するのに 30000 もの変数を使うのは異常です。しかも,延べ 10 人は 2 人×5回? というのですからなおさら。
    重回帰分析に対応する PCR 回帰というのがありますが,その考え方で,30000 個の波形を表すデータの主成分得点を求め,それを使って判別するという手も使えるとは思いますが,10人(2人×5回)ではどうしようもない気はします。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-03 (水) 21:11:03
  • 河童の屁は,河童にあらず,屁である。様、ご返事ありがとうございます。 識別したい数より、識別するためのデータ数が多いことが問題だったのですね。 この常識というのは、ldaに限らず、回帰分析やSVMにも通用するのですよね。 その場合、例えば指紋認証システムや、声紋認証システムでは、どうしているんでしょう。 もし、知識がありましたら、参考までに教えて頂けると幸いです。 -- P? 2012-10-06 (土) 14:37:16
  • SVM では事情が違うかも(要するに,逆行列や,固有値固有ベクトルを求めるときの制約なので)。 -- 河童の屁は,河童にあらず,屁である。? 2012-10-06 (土) 15:21:30

1つのグラフを複数ページPDFにしたいのですが

yds? (2012-09-27 (木) 13:50:39)

hclustでデンドログラムを作成しpdfに出力しています。
pdf(family="Japan1GothicBBB", file="dendorogramTI.pdf", width=11.69*3, height=8.27)
td.hc <- hclust(td.d, method="ward")
plot(td.hc, cex=0.7, hang=-1, xaxs="i", yaxs="i")
dev.off()

良し悪しは別として、デンドログラムの項目(要素)が多くなり、例えばA4を横3枚に並べたようなサイズになってしまいます。
これをA4で3ページの1つのPDFとして出力することはできないでしょうか?

  • parとmfrowを使って分割できそうに思います.詳しくは,http://cse.naro.affrc.go.jp/takezawa/r-tips/r/55.html -- ひろ? 2012-10-02 (火) 16:57:24
  • ひろ様、res有難うございます。parとmfrowは、私はこれまでは複数のグラフを1ページ?などに纏める場合使っていました。今回はデンドログラムですので範囲を分割する方法もわかりません。1つの大きなグラフ(デンドログラム)を複数に分割するのにもparとmfrowで可能なのでしょうか? -- yds? 2012-10-03 (水) 21:24:52

setwd() 後の、Rコードのソースを読み込み… での問題

yy? (2012-09-26 (水) 08:57:07)

windows7 32bit R i386 2.15.0 を使用しています。

Rのショートカットの作業フォルダは以下のようにしてデスクトップにRフォルダを作成しています。

"C:/Users/hogehoge/Desktop/R"

その配下にcsvフォルダと、scriptフォルダを作成して、各々csvファイルや拡張子rのスクリプトファイルを格納しています。
ユーザーは、ファイル → Rコードのソースを読み込み… でscriptフォルダに移動後に任意のrスクリプトファイルを読み込みます。
rのスクリプトファイルの最初には、下記のように記載されていてcsvファイル選択後、解析処理をさせています。

library(svDialogs)
dirBase <- getwd()
setwd(paste(dirBase, "/csv" , sep=""))
csvfile <- dlgOpen(title="対象のCSVファイルを指定してください。", filters=dlgFilters[c("All"), ])$res
# 別のスクリプトを連続して実行する場合に備え、scriptフォルダに移動
setwd(paste(dirBase, "/script" , sep=""))

その後、Rのコンソール画面で getwd() すると、

> getwd()~
[1] "C:/Users/hogehoge/Desktop/R/script"

のように正しく変更されています。
◆ 今困っていることは、ファイル → Rコードのソースを読み込み…をクリックしても、最初の時はダイアログのフォルダが C:/Users/hogehoge/Desktop/R/csv となっています。
その後、ファイルを選択せずにダイアログを閉じ、もう一度、同じようにファイル → Rコードのソースを読み込み…を行うと、C:/Users/hogehoge/Desktop/R/script になっておりrスクリプトファイルを選択できるようになります。
◆ これを最初のRコードのソースを読み込み…で C:/Users/hogehoge/Desktop/R/script が選択できるようにしたいのですが、何か手立てはありますでしょうか?

  • .Rprofile に setwd("C:/Users/hogehoge/Desktop/R/script") って書いておいたらいいのでは? -- 通りすがりの仮面ライダー? 2012-09-26 (水) 10:15:25
  • 通りすがりの仮面ライダー様、コメント有難うございました。~ Resを参考にして下記の記載で所望の動作になりました。~ 作業フォルダは "C:/Users/hogehoge/Desktop/R/script" に変更後、~ library(svDialogs)~ ~ dirR <- sub("/script", "", getwd())~ dirCSV <- paste(dirR, "/csv/*" , sep="") # dlgOpenでは最後に*必要~ csvfile <- dlgOpen(default=dirCSV, title="対象のCSVファイルを指定してください。",~ filters=dlgFilters[c("All"), ])$res~ ~ if (length(csvfile) > 0) {~ setwd(dirR) # 生成ファイルをRフォルダに出力するため~ # 所望のスクリプト~ setwd(paste(dirR, "/script" , sep="")) # 他のRファイル読み込むため~ }~ -- yy? 2012-09-27 (木) 13:32:22

Rの起動時の文言で気になるところ

Montecarlo? (2012-09-25 (火) 23:10:06)

いつもお世話になっております。
新しいパソコンへRをインストールしたところ、以前のパソコンでは表示されなかった文言が表示されるようになってしまいました。

 [以前にセーブされたワークスペースを復帰します] 

この文言の意味するところが分からず、何か影響があるのでしょうか。 「ワークスペースを○○したい」のページは見つけましたが、あまりヒントになりませんでした。
ご存知の方がいらっしゃいましたら、なにとぞお教えいただけますようお願いいたします。 なお「sessionInfo()」は以下の通りです。

> sessionInfo()
R version 2.15.1 (2012-06-22)
Platform: i386-pc-mingw32/i386 (32-bit)

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   
  • 前回 R を終了したときの状態を回復したと言うことで,気にする必要は全くありません。R を終了するときに定義した変数や関数など(要するにワークスペース)を保存し,次に R を立ち上げたときにそこから読み込んで,前の変数や関数を引き続き使えるようにすると言うことです。もし,終了時にそれ以前に定義した変数や関数などをチャラにしたいということなら,終了時に「ワークスペースのイメージファイルを保存しますか?(OS により文言は異なる)」に対して「保存しない」を選べばよいのです。 -- 河童の屁は,河童にあらず,屁である。? 2012-09-26 (水) 06:44:50
  • 河童の屁は、河童にあらず、屁である様 ご回答ありがとうございました。気にしなくていいということがわかり安心いたしました。 -- Montecarlo? 2012-09-26 (水) 23:34:21

正規表現にマッチした個数

yy? (2012-09-20 (木) 21:15:57)

お世話になります。
たとえば

x <- "最新のコメントが付いた記事"

とした場合、正規表現を "(最新|記事)" とした場合に「マッチした個数:この場合2個」を得たいのですが、regexprや grep ではできなさそうですが何か適当な関数はありますでしょうか?
よろしくお願いします。

  • 仕様に自由度が許されるならば,以下のようにすればどうでしょうか?それでもなおかつ,仕様に曖昧な点があるので以下の2案。それ以外なら仕様書を明確に書く。 -- 河童の屁は,河童にあらず,屁である。? 2012-09-20 (木) 21:55:45
    # 重複があっても 1 回と数える
    > x <- "最新のコメントが付いた記事の最初のコメント"
    > sum(sapply(c("最新", "記事"),  grep, x))
    [1] 2
    > sum(sapply(c("最新", "記事", "コメント"),  grep, x))
    [1] 3
    # 重複はそれぞれを 1 回と数える
    > sum(sapply((sapply(c("最新", "記事"),  gregexpr, x)), length))
    [1] 2
    > sum(sapply((sapply(c("最新", "記事", "コメント"),  gregexpr, x)), length))
    [1] 4
  • 曖昧な質問になっていましたね。お手数をおかけしました。今回は重複もそれぞれ数えたいので後半の仕様でOKです。→ 大変助かりました。有難うございました。 ご参考までのお聞きしたいのですが、今回の検索したい文字列はベクトルで具体的に指定できるのですが、できない場合でもカウントできる式はありますでしょうか?・・ここでも重複もそれぞれ数えたいです。 たとえば、正規表現が"[あ-ん]"のような場合です。 よろしくお願いします。 -- yy? 2012-09-21 (金) 04:39:13
  • 訂正です。"[あ-ん]"も文字列ベクトルに変換できますね。正確には検索対象文字列に墨付きカッコ【A001】【B021】・・などが含まれてそれを数える場合です。正規表現は"【.+?】"になるでしょうか。単純に考えれば、教えていただいた式の文字列ベクトルに、事前にマッチする文字列を調べて代入するということになりそうですが・・ よろしくお願いします。 -- yy? 2012-09-21 (金) 05:25:14
  • > 検索対象文字列に墨付きカッコ【A001】【B021】・・などが含まれてそれを数える場合です。正規表現は"【.+?】"になるでしょうか
    ということが,曖昧なんですよ。【 に続いて大文字アルファベットが一文字,3桁(0詰め)の数字,そして 】ということですか?だったら,【[A-Z][0-9][0-9][0-9]】 じゃないの?正規表現の仕様なんか,人に説明する方が面倒なんで,自分で試行錯誤した方がよっぽど速い。 -- 河童の屁は,河童にあらず,屁である。? 2012-09-21 (金) 20:42:52
  • また誤解を与えたようですね。正規麩応現式はあくまでも例示であり質問したい(知りたい)わけではありません。知りたいのは任意の正規表現式にマッチした個数を調べる方法はいかなるスクリプトで記載すべきかということです。たとえばVBScript.RegExp?のMatches.Countみたいに一挙に知ることができないのかというのが最初の質問の意図でした。javaでは while (matcher.find()) { hitCount++; } みたいに繰り返し処理が必要ですね。そのようなことができる関数がRにないのかということが疑問の発端でした。 -- yy? 2012-09-22 (土) 06:22:25
  • 河童の屁は,河童にあらず,屁である。様、いろいろ煩わせてしまいました。私の理解不足でした。 sum(sapply( (sapply(c("最新", "記事", "コメント"), gregexpr, x)), length)) は sum(sapply( (sapply("最新|記事|コメント", gregexpr, x)), length)) としても記載できるのですね。私の疑問は解決しました。どうもありがとうございました。 -- yy? 2012-09-22 (土) 07:01:04
  • length(unlist(gregexpr("最新|記事|コメント", x))) で十分ですね。 -- 河童の屁は,河童にあらず,屁である。? 2012-09-22 (土) 08:04:39
  • 河童の屁は,河童にあらず,屁である。様 上記スクリプトなら理解しやすいです。ただ、no matchでも -1 が返りますのでそれを補正して利用させていただいております。何度もアドバイス有難うございました。 -- yy? 2012-09-23 (日) 08:08:58

3次元分布図のプロットごとに日本語ラベルをつけるには

a.i? (2012-09-19 (水) 04:32:46)

plot(x, y)
text(x, y, label)

での2次元分布図ではきちんと日本語表示されますが、

plot3d(x, y, z)
text3d(x, y, z, label)

でのrglパッケージで3次元分布図を作成すると日本語の部分だけが表示されないか文字化けしています。
きちんと日本語部分を表示する方法はあるでしょうか。
よろしくお願いします。

表作成

MY? (2012-09-18 (火) 11:58:43)

Rを使って表を作成しpngなどのファイルに出力してグラフ化したいのですが、そういったことができる関数はありますか?
よろしくお願いします。

  • え? 表を作って png ファイルに出力する? どういうこと? 表ではなく「図」を png 形式でファイルに出力するということ?(図と表の区別わかります?) -- 河童の屁は,河童にあらず,屁である。? 2012-09-18 (火) 13:26:08
  • 混乱させて申し訳ありません。私がやりたいことは、例えば表を作成して第一列の値には青色、第二列の値には赤色、文字のfontをtype2に...というように編集した表をpng等の拡張子を指定してファイルに保存したいのです。 -- MY?2012-09-18 (火) 14:20:33
  • グラフィックウインドウに text 関数で描き出し,それを保存する。 -- 河童の屁は,河童にあらず,屁である。? 2012-09-18 (火) 14:42:10
  • どうもありがとうございます。表を編集して綺麗にしてから出力する関数があればと思ったのですが、やはりtextなどを使って直接書き込む方法しかないのですね。 -- MY? 2012-09-19 (水) 17:20:57
  • 滅多にないと言うことはどういうことなのかを吟味してみる必要もあるでしょうね(まあ,普通ではない,レギュラーじゃないということです)。 -- 河童の屁は,河童にあらず,屁である。? 2012-09-19 (水) 20:20:57
  • まあ,そうたびたびやることじゃないなら,エクセルなどで,思う存分,色や,フォントや,書体などを変え放題で,結果を,スクリーンショットにとって好きなファイル形式で保存すればよいのではないでしょうか? -- 河童の屁は,河童にあらず,屁である。? 2012-09-19 (水) 21:25:13
  • どうもありがとうございます。表を編集して綺麗にしてから出力する関数があればと思ったのですが、やはりtextなどを使って直接書き込む方法しかないのですね。 -- MY? 2012-09-19 (水) 21:44:21
  • 同じ回答が重複しているようなので,以下のような回答も蛇足ながら。単純な出力を ばか Excel で読み込んで,思う存分お化粧して,それをスクリーンショットするという方法もありますが,いかが? -- 河童の屁は,河童にあらず,屁である。? 2012-09-19 (水) 21:47:46
    bakaexcel.png
  • 色々と提案をありがとうございます。microsoft power pointだと自分が作りたい表(色など、単純な表に修飾をしたもの)を作れるのですが、いかんせん手入力で表を作成するので時間がかかっていました。そこで、Rだと自動でかつ綺麗に表を出力できると思って質問させて頂きました。提案の一つにあるようにExcelをうまく工夫すれば色々できそうなのでそれも検討してみたいと思います。 -- MY? 2012-09-20 (木) 09:45:51
  • > いかんせん手入力で表を作成するので時間がかかっていました。
    なぜ手入力を?R で書き出した素のままの表を Excel で読めばよいでしょう。フォントを変えたり色を変えるのを Excel でやるのです。 -- 河童の屁は,河童にあらず,屁である。? 2012-09-20 (木) 16:10:57
  • そうですね。今度からはそうやってみます。どうも有り難う御座いました。 -- MY? 2012-09-20 (木) 19:55:07

表示される有効桁数(2.0や4.0といった表示方法)

taked? (2012-09-18 (火) 11:12:50)

小数点以下の表示をそろえるため、2.0や4.0を得たいのですが、調べても分からなかったので教えてください
よろしくお願い致します
下の例ではround関数を使っていますが、round関数でなくても、4.0(数値)の入力に対して、4.0を得られれば良いです

 > round(4.01,digit=0)
 [1] 4
 > round(4.01,digit=1)
 [1] 4
 > round(4.01,digit=2)
 [1] 4.01
 > 4.0
 [1] 4
  • sprintf 関数と cat 関数を使えばよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2012-09-18 (火) 11:18:12
    > cat(sprintf("%.1f\n", 4.01))
    4.0
    > cat(sprintf("%.2f\n", 4.01))
    4.01
    > cat(sprintf("%.0f\n", pi))
    3
    > cat(sprintf("%.1f\n", pi))
    3.1
    > cat(sprintf("%.2f\n", pi))
    3.14
    > cat(sprintf("%.3f\n", pi))
    3.142
    > cat(sprintf("%.4f\n", pi))
    3.1416
    > cat(sprintf("%.5f\n", pi))
    3.14159
  • 河童の屁は,河童にあらず,屁である。さんありがとうございました。希望の結果が得られました -- taked? 2012-09-18 (火) 17:10:55

biplotの色

超初心者? (2012-09-14 (金) 15:52:22)

いつも掲示板を参考にしています。

x<-matrix(c(2,2,3,6,2,0,6,7,9,1,4,1,4,2,1,3,5,6,3,2,6,4,5,7,5,1,1,7,3,2,0,5,0,8,1,8),9,4)
rownames(x)<-c("みかん","いよかん","はっさく","ぽんかん","桃","すもも","白桃","20世紀梨","新高梨")
colnames(x)<-c("あ町","い町","う町","え町")

library(MASS)
x.coa<-corresp(x,nf=4)
biplot(x.coa)


上記のようなサンプルで出力されるbiplot図に対して、柑橘類(みかん、いよかん、はっさく、ぽんかん)はオレンジ色、(桃、すもも、白桃)はピンク色、(20世紀梨、新高梨)にはグリーンをあてたいのですが、どうやったらできるのでしょうか?

よろしくお願いします。

  • 基本的に,そのようなオプションはないので,プログラムを修正する必要があります。
    まず,R コンソールに以下を入力(stats の biplot.default を編集します)
    biplot.default <- edit(stats:::biplot.default)
    出てくるエディット画面で,51行目の
       text(x, xlabs, cex = cex[1L], col = col[1L], ...)
       text(x, xlabs, cex = cex[1L], col = col, ...)
    に(col[1L] を col にする)
    60行目の
       text(y, labels = ylabs, cex = cex[2L], col = col[2L], ...)
       text(y, labels = ylabs, cex = cex[2L], col = col[length(col)], ...)
    に(col[2L] を col[length(col)] にする)
    修正を保存し編集を終了する(「ファイル-->保存」,「ファイル-->閉じる」
    果物の色を指定する。
    (color <- rep(c("orange", "pink", "green", "red"), c(4, 3, 2, 1)))
    "orange" が 4 回,"pink" が 3 回,"green" が 2 回。最後に "red" を 1 回ということ(描いてみれば分かるが,赤は,この例では町を表す文字列の色)。
    biplot の実行を以下のようにする。
    biplot(x.coa, col=color)
    その他の col[1L],col[2L] もしかるべき値に直した方がよいが,まあ決定的なものじゃないから省略。気になったらいじってみてください。 -- 河童の屁は,河童にあらず,屁である。? 2012-09-14 (金) 18:54:52
  • 河童さん 有り難うございます。こんな情報どうやって探しても出てきませんでした。助かりました。 今後ともよろしくお願いします。 -- 超初心者? 2012-09-14 (金) 22:15:19
  • 追加質問です。よろしくお願いします。関数の書き換えは毎回行わなければ、いけないのでしょうか? -- 超初心者? 2012-09-17 (月) 21:48:32
  • > 関数の書き換えは毎回行わなければ、いけないのでしょうか?
    まあ,そういうことになります。書き換えた関数を自前のものにして保存し,必要なときに source 関数等で読み込むようにすれば, edit の手間は省けるでしょうけど。
    自分用のプログラムを書いて,それを利用するにしても,利用したいときにそのプログラムを読み込み・利用できるようにするという手続きは避けられません(ワークスペースを保存して quit すれば,次の R の立ち上げ時にも自動的に環境が引き継げるので,前と同じ関数がなんの手続きも必要なく使えますけどね)。
    特別なことをするわけですから,なにもしないでいつでも好きなときに利用できるというわけにはいきません。でしょうね。 -- 河童の屁は,河童にあらず,屁である。? 2012-09-17 (月) 21:58:18
  • 河童さん ご丁寧に有り難うございます。確かに、いつも行う手続きではないので関数が書き換えられてしまうと、困る事の方が多いかもしれません。自分用に保存しておくことにします。重ねてお礼申し上げます。 -- 2012-09-18 (火) 05:45:45

Rstudio for Mac で,HRML に含まれる PNG 画像の日本語文字化け

(2012-09-11 (火) 15:22:23)

Mac OS X 10.8.1, R 2.15.1,Rstudio 0.96.330 を使っています。
R コンソールから pdf("file.png"...) のようにして書き出したファイル中の日本語は文字化けしませんが,Rstudio で,*.Rmd から *.html を生成すると,figure フォルダに作られる *.png ファイルの日本語は文字化け(トーフ)します。当然,できあがった html ファイル中の *.png 画像も文字化けしています。
Mac で作った *.Rmd を Windows に持って行って Rstudio で *.html にすると文字化けはしません。
Rstudio for Mac の場合には,フォントファミリーが日本語になっていないのだと思いますが,フォントファミリーを設定するオプションがわかりません。
R コンソールから knit2html から始めて debug でトレースしてみた限りでは,knit 関数の中にある process_file の中(あるいは更にその奧か)で *.png が作られるようですが,やはり,フォントファミリーの設定のタイミングが全くわかりませんでした。対処法はあるでしょうか。

画像に使われるフォントはpar(family="フォント名")で指定します.Macでヒラギノ角ゴシックを使う場合,

 par(family="HiraKakuPro-W3")@

とします.

ldaの結果からクロス表を作りたいのですが要素数が合いません

ウエモト? (2012-09-10 (月) 16:15:33)

初めて質問させて頂きます。宜しくお願いします。
Rを使って線形判別法(lda)によってデータの分類・予測をしたいと思っております。

library(MASS)
group <- c("y","y","y","y","y","m","m","m","m","m")#人物の属性
wave <- c(y1,y2,y3,y4,y5,m1,m2,m3,m4,m5)#各要素は1列30000行の行列
traindata <- data.frame(GROUP=new{2012-09-17 (月) 21:48:32};
  • group,WAVE=wave)#データフレームにする
    (ldadata<-lda(GROUP~.,data = traindata))#ldaにかける
    plot(ldadata)#学習データの第一判別関数得点の分布
    apply(ldadata$means%*%ldadata$scaling,2,mean)#判別得点
    table(group,predict(ldadata)$class)#判別結果をクロス表にする←失敗
    このような状態です。実行すると最終行で、要素が一致せず、失敗してしまいます。
    原因は、groupが要素数10なのに対し、predict(ldadata)$classが要素数30000だということに起因しています。
    自分としては、データフレームtraindata中のwaveにおける、各要素である各行列がどちらのグループに属するのかを調べたいのですが、どうすればいいかで困っています。
    google検索などを使ってみましたが、自分の力不足でどのようにすればいいのかわかりません。
    Rの知識が少なく、低レベルな質問かとも思いますが、ご教授願います。
    見辛い文面でしたら申し訳ありません。
  • データの作り方がおかしいのでは?
    > wave <- c(y1,y2,y3,y4,y5,m1,m2,m3,m4,m5)#各要素は1列30000行の行列
    って,変ですね。traindata は何行何列のデータフレームになっているのか,確かめてみた方が良さそうですね。参考書かネットで lda の使い方を再確認した方がよいでしょう。下に簡単な例と使い方を書いておきます。 -- 河童の屁は,河童にあらず,屁である。? 2012-09-11 (火) 09:28:27
    > library(MASS)
    > set.seed(123)
    > ( d <- data.frame(group=rep(letters[1:2], each=5), x=rnorm(10), y=rnorm(10), z=rnorm(10)) )
       group           x          y          z
    1      a -0.56047565  1.2240818 -1.0678237
    2      a -0.23017749  0.3598138 -0.2179749
    3      a  1.55870831  0.4007715 -1.0260044
    4      a  0.07050839  0.1106827 -0.7288912
    5      a  0.12928774 -0.5558411 -0.6250393
    6      b  1.71506499  1.7869131 -1.6866933
    7      b  0.46091621  0.4978505  0.8377870
    8      b -1.26506123 -1.9666172  0.1533731
    9      b -0.68685285  0.7013559 -1.1381369
    10     b -0.44566197 -0.4727914  1.2538149
    > ans <- lda(group~x+y+z, d)
    > ans2 <- predict(ans)
    > xtabs(~d$group+ans2$class)
           ans2$class
    d$group a b
          a 4 1
          b 3 2

censored logit/probit model

taka? (2012-08-20 (月) 21:31:47)

お世話になります。
Rでcensored logit modelあるいはcensored probit modelを利用したのですが、ただのlogit model、probit model、またCensored regression modelのTobit modelについては、こちらのwikiの「Rでエコノメトリクス」のページなどを参照させていただき、それぞれ

glm(y ~ x1 + x2 + x3, family=binomial(link="logit"))
glm(y ~ x1 + x2 + x3, family=binomial(linknew{2012-10-04 (木) 13:35:44}; ~

="probit"))

vglm(y ~ x, tobit(Lower=0), trace=TRUE)

などの関数を使うということまではわかったのですが、censored logit/probit modelではどのような関数を使えば良いのかがgoogleなどで調べられませんでした。
もしご教授いただけましたら幸いです。
当方、Rの基礎どころか統計の基礎も危うく、見当違いな質問でありましたら誠に申し訳ございません。

xtableライブラリで小数点の桁数を指定

meet? (2012-08-07 (火) 22:35:28)

xtableライブラリで、列ごとに小数点の桁数を指定する(2列目は小数点第一位まで、3列目は第二位まで)ことはできますか?また1列目に行番号をつけないようにできますか?ご教授お願いします。

library("xtable")
sex    <- c("F", "F", "M", "M", "M")
height <- c(158.0, 162.5, 177.3, 173.3, 166.3)
weight <- c(51.22, 55.33, 72.44, 57.44, 64.33)
( x    <- data.frame(SEX=sex, HEIGHT=height, WEIGHT=weight) )
mytable <- xtable(x) 
print(mytable, type="html")
  • 何かをやろうと思うときに,オンラインヘルプを読む癖を付けておくことは望ましいことです。全てのこととはいわないまでも,ほとんどはオンラインヘルプに書いてあります。?xtable, ?print.xtable を読みましょう。厳しい掲示版なら,「マニュアルを読め」で片付けられればよい方で,反応なし(放置プレー)が良いところでしょう。
    能書きばかりたれるなといわれるだろうから,答えも書いておきましょう。桁数指定は xtable の digits 引数,行名を書くか書かないかは print.xtable の include.rownames で指定するのです。 -- 河童の屁は,河童にあらず,屁である。? 2012-08-07 (火) 23:14:07
    mytable <- xtable(x, digits=c(0, 0, 1, 2)) 
    print(mytable, type="html", include.rownames=FALSE)
    で,以下のようになるでしょう。
    html.png
  • ご教授ありがとうございます。オンラインヘルプをよく読むように努力します。 -- meet? 2012-08-08 (水) 00:09:26

行列からデータフレームを作りたい

ランゲル・ハンス? (2012-08-04 (土) 11:00:04)

いつも掲示板を参考にしています。
次のような行列Mがあります。

m <- c(16, 15, 7, 14, 9, 11, 8, 4, 1, 16, 12, 17, 10, 9, 19, 6)
M <- matrix(m, 4, 4)
M

行列Mの行をX、列をY、値をVとし、行列Mの左下が(X, Y)=(1, 1)になるように次のようなデータフレームを作りたいと思います。

X 	Y	V
1	1	14
2	1	4
3	1	17
4	1	6
1	2	7
2	2	8
3	2	12
4	2	19
1	3	15
2	3	11
3	3	16
4	3	9
1	4	16
2	4	9
3	4	1
4	4	10

方法をご教示いただけないでしょうか?
上の例は4行4列ですが、本当はn行m列でデータフレームを作りたいと思います。どうぞよろしくお願いします。

  • おやすいご用です。以下のように。 -- 河童の屁は,河童にあらず,屁である。? 2012-08-04 (土) 11:25:09
    > N <- t(M[nrow(M):1,])
    > data.frame(X=c(row(N)), Y=c(col(N)), V=c(N))
       X Y  V
    1  1 1 14
    2  2 1  4
    3  3 1 17
    4  4 1  6
    5  1 2  7
      SNIP
    15 3 4  1
    16 4 4 10
  • 河童さま ありがとうございました。大変参考になりました。感謝です。 -- ランゲル・ハンス? 2012-08-04 (土) 15:41:26

画像の特定色のピクセル数を求めたい

しまだ? (2012-08-03 (金) 23:43:47)

お世話になります。
画像を与えた時、特定の色のピクセル数を得たいのです。そこで:

library(biOps)
data <- readJpeg("c:/hoge_20120101.jpg")
x <- c(1:352)
y <- c(1:288)
blue <- c(0)
grey <- c(0)
white <- c(0)
black <- c(0)
yellow <- c(0)
for ( i in x ){
for ( j in y ){
if (( data[i,j,1]==0 ) && ( data[i,j,2]==0 ) && ( data[i,j,3]==254 ))
{ blue <- ( blue + 1 ) }
if (( data[i,j,1]==192 ) && ( data[i,j,2]==192 ) && ( data[i,j,3]==192 ))
{ grey <- ( grey + 1 ) }
if (( data[i,j,1]==255 ) && ( data[i,j,2]==255 ) && ( data[i,j,3]==255 ))
{ white <- ( white + 1 ) }
if (( data[i,j,1]==0 ) && ( data[i,j,2]==0 ) && ( data[i,j,3]==0 ))
{ black <- ( black + 1 ) }
if (( data[i,j,1]==255 ) && ( data[i,j,2]==255 ) && ( data[i,j,3]==0 ))
{ yellow <- ( yellow + 1 ) }
}}

(1)処理を速くしたい
スクリプトを実行したところ、動いたのですが、処理が遅いように思います。 コーディングが素人で下手くそだと思うのですが、どこを修正すれば良いのでしょうか。
(2)png画像を扱いたい
biOpsは、png画像を読み込めないようです。オリジナルはpngのため、無理矢理jpegに変換しているのですが、pngが読み込めて同様の処理ができるパッケージはありませんでしょうか。

  • ベクトル計算をすると,30倍近く速くなります。 -- 河童の屁は,河童にあらず,屁である。? 2012-08-04 (土) 07:22:03
    data <- readJpeg("c:/hoge_20120101.jpg")
    d1 <- data[,,1]
    d2 <- data[,,2]
    d3 <- data[,,3]
    blue <- sum(( d1==0 ) & ( d2==0 ) & ( d3==254 ))
    grey <- sum(( d1==192 ) & ( d2==192 ) & ( d3==192 ))
    white <- sum(( d1==255 ) & ( d2==255 ) & ( d3==255 ))
    black <- sum((d1==0 ) & ( d2==0 ) & ( d3==0 ))
    yellow <- sum(( d1==255 ) & ( d2==255 ) & ( d3==0 ))
  • ありがとうございます。やはりコーディングですね。。。imagemagicでconvert hoge.jpg out.txtとか試行錯誤中でした。助かりました。 -- しまだ? 2012-08-04 (土) 09:36:37
  • pngが扱えるパッケージですが、ご自分で一度探されましたか。少し探しただけですが、readbitmap、adimproなどがpngの読み込みに対応しているみたいですよ。 -- Iona? 2012-08-04 (土) 09:56:42
  • ありがとうございます。画像処理パッケージの機能比較表のpngにチェックが入っていなかったので、対応していないと思っていました。事前にもう少し調べるようにします。 -- しまだ? 2012-08-04 (土) 18:05:00

○○したいができない

IonaZUNNNNNNN? (2012-08-03 (金) 23:28:40)

マニュアルをちゃんと嫁
そもそも、そんなことをしたいというのは変態(そんなことする必要はない)
どうしてもしたければ、関数(プログラム)を書け
関数(プログラム)を書けないなら、あきらめよう

プログラム中で、S1 - Snまでのベクトルのデータフレームの作成法

tt? (2012-08-02 (木) 19:01:06)

n は、プラスの整数です。nが決まっていれば、以下でOKなのですが、異なった数字の時(実際にはせいぜい、5-10程度)には、プログラム中では対応できないですよね。

mS <- data.frame(S1,S2, ---,Sn)

一つの方法として、S1のみのデータフレームを作り、そこに1個ずつベクトルを追加していく方法はできるのですが、いかにも非効率ですよね。もう少しすっきりした方法は無いでしょうか? 
よろしくお願いします。

  • do.call("data.frame", lapply(seq_len(5), function(x) runif(5))) -- 2012-08-02 (木) 19:15:42
  • 本当にそういうことが必要なのかどうか疑問ですが,以下のようにするとあなたの要求は満たされますか? -- 河童の屁は,河童にあらず,屁である。? 2012-08-02 (木) 19:17:27
    # S1, S2, ..., Sn というベクトルがあって,それをデータフレームにする
    > S1 <- rnorm(5)
    > S2 <- rnorm(5)
    > S3 <- rnorm(5)
    > S4 <- rnorm(5)
    > n <- 4
    > mS <- eval(parse(text=paste("data.frame(", paste("S", 1:n, sep="", collapse=","), ")")))
    > mS
               S1         S2          S3         S4
    1  -0.5025337  1.4369542  0.45664139  0.4367258
    2  -0.5886718 -0.7321779 -0.08103579  1.3684718
    3  -0.7793953  1.3541141 -0.98813613 -1.3115064
    4   1.3410327  1.3565760 -1.19112426  0.3708082
    5   0.5515542  0.3012129  0.61595356 -0.1799028
  • 1つずつベクトルを追加して行く方法は非効率ではないし、非効率だとしてもせいぜい5−10程度なら何の影響もないと思うのですが。そもそもベクトルを生成するときにデータフレームにしておくのが一番効率的かと思います。一応別解も載せておきます。あと、2つ上の回答でdo.callを使う必要はないです。 -- Iona? 2012-08-02 (木) 19:53:28
    data.frame(sapply(ls(pattern = "S[0-9]+"), get))
  • 皆さん、ありがとうございます。うまくいくようになりました。自分の知識が非常に生半可なものだということがよくわかりました。勉強します。 -- tt? 2012-08-02 (木) 23:51:00

Rstudio serverでinstall.packages()

taked? (2012-08-01 (水) 17:41:01)

Rstudio serverで、インストールできるパッケージとできないパッケージがあります。解決法があればご教授下さい。
CentOS 6.2、 rstudio-server-0.96.228-x86_64 です。
例えばggplot2はインストールできましたが、XMLなどいくつかのパッケージがうまくインストールできません。
パッケージがR自体のバージョン もしくは64bitに対応してないのでしょうか?

 > install.packages("XML")
 Installing package(s) into ‘/home/●○●○/R/library’
 (as ‘lib’ is unspecified)
 trying URL 'http://cran.cnr.Berkeley.edu/src/contrib/XML_3.9-4.tar.gz'
 Content type 'application/x-gzip' length 923501 bytes (901 Kb)
 opened URL
 ==================================================
 downloaded 901 Kb
 
 * installing *source* package ‘XML’ ...
 ** package ‘XML’ successfully unpacked and MD5 sums checked
 checking for gcc... gcc
 checking for C compiler default output file name... a.out
 checking whether the C compiler works... yes
 checking whether we are cross compiling... no
 checking for suffix of executables... 
 checking for suffix of object files... o
 checking whether we are using the GNU C compiler... yes
 checking whether gcc accepts -g... yes
 checking for gcc option to accept ISO C89... none needed
 checking how to run the C preprocessor... gcc -E
 No ability to remove finalizers on externalptr objects in this verison of R
 checking for sed... /bin/sed
 checking for pkg-config... /usr/bin/pkg-config
 checking for xml2-config... no
 Cannot find xml2-config
 ERROR: configuration failed for package ‘XML’
 * removing ‘/home/●○●○/R/library/XML’
 Warning in install.packages :
 installation of package ‘XML’ had non-zero exit status
 
 The downloaded source packages are in
 	‘/tmp/Rtmp5ZwZF3/downloaded_packages’
  • このエラーは、パッケージをソースから入れるとき、依存ライブラリがインストールされていないためにパッケージのコンパイルが失敗する、RStudioとは無関係な現象です。依存ライブラリを入れてから再度Rパッケージをインストールしてください。OS側にある特定のライブラリを利用するタイプのRパッケージは全て同様です。XMLパッケージはOSのlibxml2をRの中から使うためのパッケージです。OSにはlibxml2があることが前提になります。XMLパッケージのインストールにはlibxml2の開発ファイルが必要です。この場合は、xml2-configを含むrpmを探してそれをインストールします。-- 2012-08-01 (水) 17:47:25
  • 依存ライブラリが必要ということなんですね。どうもありがとうございました。 -- taked? 2012-08-01 (水) 21:27:17

subset の仕様について

tadashi? (2012-07-25 (水) 01:10:16)

こんな現象があります。
下記のようなsubset の使い方は間違いのようです。どこかにこの件について書いてあるでしょうか

> subset(test,test[,"flag"]==flag)


> test<-data.frame(flag=sample(c("a","b","c"),rep=T,10))
> x<-"a"
> subset(test,test[,"flag"]==x)
  flag
1    a
6    a
9    a
> flag<-"a"
> subset(test,test[,"flag"]==flag)
   flag
1     a
2     c
3     b
4     b
5     c
6     a
7     c
8     c
9     a
10    b
  • Helpに書いてあります。"For data frames, ..."のところです。データフレームに対するsubset関数のsubset引数はデータフレームをattachした環境で評価されます。
    subset(test, test[, "flag"] == flag)
    attach(test)
    test[test[, "flag"] == flag, ] # ここのflagはデータフレーム内のflag列。
    detach(test)
    といった処理が行われています。 -- Iona? 2012-07-25 (水) 01:19:48
  • さっそく、ありがとうございます。これは間違いやすい気がしますね。結構はまりました。 -- tadashi? 2012-07-25 (水) 01:35:56
  • 同じ変数をつかえると便利な気がします。 flag==$flag のような記法はないのでしょうか -- tadashi? 2012-07-25 (水) 02:21:26
  • "["を使えばいいのでは。(間違うも何もsubset関数の利点を知らない人は"["を使う気がしますけど) -- Iona? 2012-07-25 (水) 02:39:10
  • subset の利点がまとまっているページはあるでしょうか? それから、すみません。”["はどう使うのでしょうか? -- tadashi? 2012-07-25 (水) 09:28:43
  • 使い方はヘルプを見ようよ。 ?"[" とか help("[")とか。しかも、あなたはすでにtest[で"["演算子を使っていますよ。 -- 2012-07-25 (水) 10:55:06
  • Helpを読めばわかるはずです。分からなければsubsetではなく"["を使うべきです。また、"["の使い方はここで聞くようなものではありませんよ。まずは自力で調べてから質問してください。 -- Iona? 2012-07-25 (水) 11:29:14
  • 条件式も、論理式の && や、|| でなくて、& | を使うようです。このあたり間違いやすい気がします。 -- tadashi? 2012-07-28 (土) 12:53:08
  • Helpにすべて書いてあります。?"|" -- 2012-07-28 (土) 14:11:46
  • なんで違うのでしょう。間違いやすい気がします。 -- tadashi? 2012-07-28 (土) 23:57:00
  • 作用(目的)が違うのだから演算子が違うのです。/ と %/% や * と %*% が間違いやすいと言っているのと同じレベル。ダダをこねるのもいい加減にしなさいヨ。 -- 2012-07-29 (日) 09:11:12
  • 自助努力をすべきかどうか云々は横に置いておいて,確かに間違いやすいですね.subsetについてはここに記載があります.もし「�ベクトルごとの条件式」と「�要素ごとの条件式」が混乱されているなら,「�subsetでは & や | を使う」「�if文では && や || を使う」と覚えておいて,徐々に慣れる(理解を深める)のも一案かと思いますがいかがでしょう. -- とおりすがり? 2012-07-29 (日) 12:06:58
  • > if文の中は & や | を使う
    おやまあ,変なことを言うなあ。
    > ベクトル同士の条件式は && や || を使う
    というのもねえ。確かにあなたも混乱している。
    いずれにせよ,上の方の人が書いているように,ヘルプ嫁ということ。
    注:以下で,shorter form とは |, & のこと,longer form とは ||, && のこと(あまりよくない言い方だと思うが)
    The shorter form performs elementwise comparisons in much the same way as arithmetic operators. The longer form evaluates left to right examining only the first element of each vector. Evaluation proceeds only until the result is determined. The longer form is appropriate for programming control-flow and typically preferred in if clauses.
    "examining only the first element of each vector" というところは,「R にはスカラーはない。要素数1のベクトルなのだ」ということに関係しているのネ。
    subset や if の場合はというように覚えるのじゃなくて,|, & の結果は「複数個の TRUE/FALSE を要素とするベクトル」,||, && の結果は「1個の TRUE/FALSE」と覚えればよいでしょう(ヘルプと同じことだけどね)。そうすれば,subset では前者,if では後者でなくては困るなァということが分かるんじゃないカ。 -- 2012-07-29 (日) 12:44:28
    > set.seed(11119)
    > (a <- sample(c(TRUE, FALSE), 10, replace=TRUE))
     [1]  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE
    > (b <- sample(c(TRUE, FALSE), 10, replace=TRUE))
     [1] FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE
    > a | b
     [1]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    > a || b
    [1] TRUE
    > a & b
     [1] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE
    > a && b
    [1] FALSE
  • 私にとってはありがたい質問でした。色々と叩きつつもちゃんと回答いただいた方ありごとうございます。tadashiさんがしていなければ、私がしていたかも・・・。 -- きゅうり? 2012-07-31 (火) 14:45:27

二元配置分散分析での residuals

分散分析? (2012-07-20 (金) 11:26:29)

Rで二元配置分散分析をしたのですが、Residuals が表示されないことがあります。その理由を教えていただけると助かります。

> a <- c(15.65, 14.40, 17.50, 15.90, 20.30, 19.45, 20.45, 19.05)
> 要因1 <- factor(c("T1", "T1", "T2", "T2", "T3", "T3", "T4", "T4"))
> 要因2 <- factor(c("Y1", "Y2", "Y1", "Y2", "Y1", "Y2", "Y1", "Y2"))

> summary(aov(a ~ 要因1 * 要因2))
            Df Sum Sq Mean Sq
要因1        3 34.026 11.3421
要因2        1  3.251  3.2513
要因1:要因2  3  0.151  0.0504

よろしくお願いします。

  • モデルに含まれる自由度が サンプルサイズ-1 以上になるからです。データを1個以上付け加えると,誤差が表示されるようになります。 -- 河童の屁は,河童にあらず,屁である。? 2012-07-20 (金) 12:28:16
  • コメントありがとうございました。もう一度計算して確認します。 -- 分散分析? 2012-07-20 (金) 17:26:49

hoge.Rdataをダブルクリックで起動したときのファイル名取得

ふしぎ? (2012-07-19 (木) 17:53:11)

例えば、hoge.RdataをダブルクリックしてRを起動した後で、このファイル名"hoge.Rdata"を取得する関数や方法はありますでしょうか?
list.files() で作業フォルダ内のファイル名は取得できますが、他にも.Rdataの拡張子を持つファイルがある場合、hoge.Rdataを一意に決定できずに困っています。解決策やヒントなど、ご教示いただければ幸いです。
動作環境は、Win XP、R version 2.14.2です。

shapeファイルのポリゴンの座標値の取り出し方

蓮井? (2012-07-15 (日) 06:45:20)

win-xp、R2.15.1、maptools0.8-16、sp0.9-99を使っています。
shapeファイルの各ポリゴンについて、
 ・面積を求める
 ・各ポリゴンがある座標値を含むかどうかを確認する
の2つの作業を実施したく、各ポリゴンの座標値を取り出し方についてご教示いただきたく、よろしくお願いします。
readShapeP最新 cat(sprintf(br;特別なことをするわけですから,なにもしないでいつでも好きなときに利用できるというわけにはいきません。でしょうね。 -- 河童の屁は,河童にあらず,屁である。? olyでポリゴンを読み、スロットpolygonsを表示させると、

> map <- readShapePoly("sample.shp")
> map1[1,] @ polygons
> 
> An object of class "Polygons"
> Slot "Polygons":
> [[1]]
> An object of class "Polygon"
> Slot "labpt":
> [1] -32959.94 -64662.22
>  <中略>
> Slot "coords":
>            [,1]      [,2]
>  [1,] -32919.99 -64656.18
>  [2,] -32920.01 -64659.99
>   <中略>
>  [13,] -32919.99 -64656.18
>   <後略>

となりますが、このcoordsの値を取り出すためにはどうすればよろしいでしょうか。
「R の S4 クラス、メソッド入門」は読んでみたのですが、よくわからず…。
よろしくお願い申し上げます。

sendmailRでメール送信したい

kbys? (2012-07-13 (金) 21:23:22)

sendmailRというパッケージでgmailを使ってメール送信する方法について教えてください。マニュアル(http://cran.r-project.org/web/packages/sendmailR/sendmailR.pdf)を参考にしたのが下のコードですがうまくいきません。よろしくお願いいたします。"oooooooooo@gmail.com"は仮のアドレスです。

library(sendmailR)
sendmail(from="oooooooooo@gmail.com", to="oooooooooo@gmail.com", subject="件名",
         msg="本文", control=list(smtpServer="smtp.gmail.com"))
以下にエラー socketConnection(host = server, port = port, blocking = TRUE) : 
コネクションを開くことができません 
追加情報:   警告メッセージ: 
In socketConnection(host = server, port = port, blocking = TRUE) :
smtp.gmail.com:25 cannot be opened
  • gmail は、ssl でかつ smtpauth が必要です。さくっと探した範囲では使えないみたいにみえます。 -- tadashi? 2012-07-14 (土) 03:01:24
  • smtp.gmail.comはSSLかTLSが必要なためsendmailRでメールは送れません。pythonのsmtplibをrJythonから利用する方法が一番確実かと思います。 -- Iona? 2012-07-14 (土) 04:53:48
  • tadashiさん、Ionaさんありがとうございます。pythonのsmtplibをrJythonから利用する方法を調べてこのサイト(http://r.789695.n4.nabble.com/Email-out-of-R-code-td3530671.html)で、特にファイル添付できるnutterb 氏の投稿を参考にしています。送信はできたのですが本文に日本語を送信すると???となって受信されます。エンコードを明示的に指定しないといけないことが分かり修正を試みているのですがpythonも初心者なものでうまくいっておりません。大変お手数おかけしますが、nutterb 氏の投稿の中で修正箇所・コードについて教えて頂けないでしょうか? -- kbys? 2012-07-15 (日) 13:25:05
  • なんで、Rからメールを送りたいのでしょうか? 外部プログラムを使う方法でよいならいくらでも違った解決があるかと思います。 -- tadashi? 2012-07-16 (月) 00:13:07
  • 毎日のデータの集計をメールでレポートしたいです。 -- kbys? 2012-07-16 (月) 06:54:44
  • だったら、レポートをテキストファイルで出力してそれをメールで送信するのはどうでしょうか、OSなどにもよりますが、Linux なら簡単ともいえます。私はRuby でやっています。 -- tadashi? 2012-07-17 (火) 09:50:09
  • rubyなどを使ってやってみようと思います、ありがとうございました -- kbys? 2012-07-17 (火) 11:24:43
  • メールを送る瞬間にパソコンの前にいるのであれば、メーラーを使えばいいかと思います。わざわざ凝った方法を使う必要は無いでしょう。
    日本語が正しく送れない件ですが、rJythonは日本語を正しく扱えないようです。system関数で直接pythonに投げれば文字化けせずに送れるようです。 -- Iona? 2012-07-18 (水) 16:28:18
  • >メールを送る瞬間にパソコンの前にいるのであれば
    メールを送る瞬間!にパソコンの前にいなくても,crontab などと組み合わせれば,定時に自動的にレポートを送出することもできるでしょう。それは,R であっても Java であっても,python であっても,単なるshell script であろうと,違いはない。と,思いますけど? -- 河童の屁は,河童にあらず,屁である。? 2012-07-18 (水) 21:57:22
  • gmailのsmtpサーバを使うという縛りを解いて、そのRで解析をしているマシンでsmtpサーバ(postfixとか)をたててoooooooooo@gmail.com宛てにメールを送信するのは駄目なのでしょうか。 -- 2012-07-19 (木) 11:04:03

コマンドプロンプトによるrscript.exeの実行について

taked? (2012-07-10 (火) 15:15:07)
お世話になります.rscriptでRスクリプトを実行して、グラフを保存したいのですがうまくできません.
以下のプログラムを、task.Rとしています.

 library(ggplot2)
 ratings <- qplot(rating, data=movies, geom="histogram")
 ggsave(ratings, file="fig1.png")


Rコンソールにコピペして実行するとグラフが保存できるのですが、コマンドプロンプトで
  カレントディレクトリ>rscript task.R
として実行するとグラフが保存ができていません.コマンドプロンプトにはRコンソール実行時とほぼ同様のメッセージがでます.実行できているようですがグラフは保存されません.
  Loading required package : methods
  Saving 7 x 7 in image
  stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.
誤りなどあったらアドバイス頂けないでしょうか、よろしくお願いします.Win VISTA, R 2.15.1です

  • R version 2.15.1 + Ubuntu 12.04 LTSでやってみると、同様のメッセージが標準エラーに出力されますが、fig1.pngは期待通りに出力されています。ご参考まで。 -- 2012-07-10 (火) 16:32:03
    $ Rscript task.R 
     要求されたパッケージ methods をロード中です 
    Saving 7 x 7 in image
    stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.
    $ file fig1.png 
    fig1.png: PNG image data, 2100 x 2100, 8-bit colormap, non-interlaced
  • ありがとうございます.解決できました.-- taked? 2012-07-10 (火) 17:03:39

多次元の同時分布を求め、ある組み合わせを取る確率を求めたい

Saito? (2012-07-03 (火) 18:50:19)

いつもお世話になっております。
連続値を取る確率変数が複数種類あった場合に、その経験的な同時分布を求め、確率変数がある組み合わせをとる時の同時確率を求めたいです。
例えば、

> library(np)
> x <- rbeta(100, shape1=10, shape2=1)
> y <- rgamma(100, shape=1)
> z <- rnorm(100)
> fit<-npudens(~x+y+z)
> plot(fit)

とすると、3変量の場合の同時確率分布が得られるようですが、その後に例えば、x=0.1, y=0.5, z=-0.1となるような確率を計算をしたいと考えています(出来ればベクトルの形で与えられるようにして、x=c(0.1, 0.2, 0.3), y=c(0.1, 0.2, 0.5), z=c(0.2, 0.4, -0.1)などと与えて、3つの同時確率が出てくると嬉しいです)。

また、上記の計算はおそらく連続値を丸める必要があると思われるのですが、そうではなく、x=0.9-1.1、y=0.4-0.6、z=-0.2-0.2といったように、特定の区間に入る確率も計算したいです。

ネットを調べていると、同じような質問はあったのですが、
https://stat.ethz.ch/pipermail/r-help/2010-November/260994.html
それに対する返答が私には理解できず、手づまりとなっています。

その他、色々と調べたのですが、二変量の場合や、正規分布に従う場合などはいくつか例があるようなのですが、特に分布形を仮定しない多変量となると資料が少なく途方に暮れております。

どなたか分かる方がいらっしゃいましたらご教授頂けると幸いです。
どうぞよろしくお願い致します。

最頻出データの抽出方法

KANA? (2012-07-02 (月) 20:15:29)

Rにて下記のイメージように、ひとつのテーブルにある最頻出の読み方だけを抽出したいのですが、可能でしょうか。

AAAは、あああが3件・えーえーえーが2件のため「あああ」を抽出
UUUは、うううが2件・ゆーゆーゆーが1件のため「ううう」を抽出

■データ内容イメージ
テーブル名:table1

アルファベット,読み
AAA,あああ
UUU,ううう
AAA,あああ
EEE,えええ
AAA,えーえーえー
UUU,ゆーゆーゆー
EEE,いーいーいー
AAA,えーえーえー
EEE,いーいーいー
UUU,ううう
AAA,あああ

■抽出結果イメージ
AAA,あああ
UUU,ううう
EEE,いーいーいー

以上、よろしくお願いいたします。

  • これでは駄目ですか.ところで同順位があったらどうするんですか. -- 2012-07-02 (月) 21:00:29
    > x
     [1] "A" "U" "A" "E" "A" "U" "E" "A" "E" "U" "A"
    > y
     [1] "あ"   "う"   "あ"   "え"   "えー" "ゆー" "いー" "えー" "いー" "う"  
    [11] "あ"  
    > table(paste("(",x,",",y,")",sep=""))
    
      (A,あ) (A,えー) (E,いー)   (E,え)   (U,う) (U,ゆー) 
           3        2        2        1        2        1
  • 以下のようなことかな? 2012-07-02 (月) 21:52:22
    > d <- structure(list(アルファベット = structure(c(1L, 3L, 1L, 
    + 2L, 1L, 3L, 2L, 1L, 2L, 3L, 1L), .Label = c("AAA", "EEE", "UUU"
    + ), class = "factor"), 読み = structure(c(1L, 3L, 1L, 4L, 5L, 
    + 6L, 2L, 5L, 2L, 3L, 1L), .Label = c("あああ", "いーいーいー", 
    + "ううう", "えええ", "えーえーえー", "ゆーゆーゆー"
    + ), class = "factor")), .Names = c("アルファベット", "読み"
    + ), class = "data.frame", row.names = c(NA, -11L)) # ここまでテストデータ作成
    > ans <- xtabs(~., data=d)
    > cbind(apply(ans, 1, function(x) colnames(ans)[which.max(x)]))
        [,1]          
    AAA "あああ"      
    EEE "いーいーいー"
    UUU "ううう"      
    同順位の処理はなんとかする。 -- 河童の屁は,河童にあらず,屁である。?
  • 早速の回答ありがとうございます。 ・同順位の場合は、どちらか一方表示できれば大丈夫です。 ・今回処理したいデータには、アルファベット/読みともに数が多いため事前にすべてカバーするのは難しい状態です。 それでもできる方法をご教示いただけましたら幸いです。。 -- KANA? 2012-07-02 (月) 22:37:15
  • 「それでもできる方法」---提示したやり方でできると思いますが? -- 河童の屁は,河童にあらず,屁である。? 2012-07-02 (月) 22:40:09
  • 「どちらか一方表示できれば大丈夫」,そんなわけ無いのでは! -- 2012-07-03 (火) 16:34:14
  • プログラムの仕様は,発注者が決めればよいことで。
    まあ,同順位の場合も含め,また,それが何回あったかという情報も含めた結果を書き出す。for を使ったけど,まあ,たいした問題にはならないだろう。我慢できる時間内で結果が出ればよいのだから,あれこれ凝る必要はない。 -- 河童の屁は,河童にあらず,屁である。? 2012-07-03 (火) 18:14:35
    # テストデータを作成する
    gen <- function(n=10000,  len=2) {
    	m <- sample(len, n, replace=TRUE)
    	sapply(m, function(k) paste(LETTERS[sample(5, k, replace=TRUE)], collapse=""))
    }
    set.seed(111111)
    n <- 2000 # 2000 組(行)のデータ
    d <- data.frame(item=gen(n), def=gen(n, len=4))
    テストデータ(データフレーム)
         item def
       1   CD DCD   # CD は DCD みたいなこと
       2   BE   D
       3   AA   D
       4    B ADB
         中略
    1998    A    C
    1999    E CEEE
    2000   CC  BDA
    中間集計
    ans <- xtabs(~., data=d)
    分析結果
    (1) 全回提示した結果表示
    cbind(apply(ans, 1, function(x) colnames(ans)[which.max(x)]))
       [,1] 
    A  "C"  
    AA "A"  
    AB "B"  
    AC "C"  
    AD "B"  
      中略
    ED "A"  
    EE "A"  
    (2) 今回提示する結果表示
    col.name <- colnames(ans)
    row.name <- rownames(ans)
    for (i in 1:nrow(ans)) { # 集計表の各行について
    	x <- ans[i,]
    	max.val <- max(x) # 最大頻度
    	items <- x[x==max.val] # 最大頻度と同じ頻度を持つ要素
    	cat(row.name[i], ":", items[1], "-", names(items), "\n")
    }
    A : 13 - C    # A に対して C が 13 回
    AA : 5 - A 
    AB : 3 - B D  # AB に対して B, D がそれぞれ 3 回
    AC : 5 - C 
    AD : 4 - B C 
      中略
    ED : 3 - A B C 
    EE : 2 - A B C CEE D E
  • > アルファベット/読みともに数が多いため事前にすべてカバーするのは難しい状態です。
    table1をread.csvで読み込めばいいだけなので事前にカバーする必要はないです。
    d <- read.csv("table1.csv")
    > 「どちらか一方表示できれば大丈夫」,そんなわけ無いのでは!
    何を根拠に「そんなわけ無い」と言われているか分かりませんが、他に条件がない場合、合理的な選び方はないので、普通はどちらが選ばれてもかまわないはずですよ。一意性を気にするなら別ですが。 -- Iona? 2012-07-04 (水) 03:09:50
  • >>アルファベット/読みともに数が多いため事前にすべてカバーするのは難しい状態です。
    >table1をread.csvで読み込めばいいだけなので事前にカバーする必要はないです。
    そのとおり。 -- 河童の屁は,河童にあらず,屁である。? 2012-07-04 (水) 06:36:04
  • 遅くなりましたが、いただいた方法で解決できました。ありがとうございました! -- KANA? 2012-07-04 (水) 19:08:06

軸の上付き文字による指数表記について

ymbr? (2012-06-30 (土) 16:35:57)

お世話になっております。
2e+05などの大きな値を実数表記する際にoptions(scipen=○○)を使って『200000』と表示のではなく、上付き文字の指数を用いることで『2×10^5(実際は上付き)』のような書式で表示することはできますでしょうか?
よろしくお願い致します。

  • axis関数にexpressionクラスのオブジェクトを渡せば、上付き数字も表現できます。詳しくは?plotmathご覧ください。 -- Iona? 2012-07-01 (日) 10:36:58
    x <- 2:5 * 10^5
    y <- c(1, 2, 3, 100)
    plot(x, y, axes = FALSE)
    axis(1, at = 2:5 * 10^5, labels = parse(text = paste(2:5, "%*%", "10^5")))
    axis(2, at = c(0, 100), labels = expression(0, 1 %*% 10^2))
  • 出来ました!ありがとうございます!! -- ymbr? 2012-07-01 (日) 22:57:41

メモリのエラーについて

taked? (2012-06-29 (金) 17:46:33)

お世話になります.lm()で 線形モデルによる回帰を行いたいのですが、データフレームが大きいためかエラーとなります.

 > memory.size(max = FALSE)
 [1] 14.01
 > df <- read.csv("data.csv", as.is=T)
 > memory.size(max = FALSE)
 [1] 471.71
 # (中略)
 > memory.size(max = FALSE)
 [1] 747.44
 > LM <- lm(df$y ~ . , data = df )
  エラー:  サイズ 268.0 Mb のベクトルを割り当てることができません 
 > memory.size(max = FALSE)
 [1] 1210.4
 >memory.limit(size = NA)
 [1] 2047
 > object.size(df)
 229790744 bytes

(質問1) もともとの"data.csv"は約100MB(250列×20万行です)です.これを読込すると、object.sizeは約220MBとなりRが約450MBのメモリを使うのは正常でしょうか?
(質問2) lm()の実行前のメモリ使用量は約747MBですが、lm()などを実行するにはやはりメモリ(memory.limit=2047MB)が不足なのでしょうか?何か他の原因が考えられるでしょうか?
解決方法や回避策など(変数等を減らす以外で)アドバイスを頂けると幸いです.よろしくお願い致します.
R 2.14.1 , --max-mem-size=2047MB, Windows vista 32bit, メモリ 3.00 GB, 起動させているソフトはRとテキストエディタのみです.

  • lm関数のヘルプに書いてあることですが、biglmという大きなデータセット用のパッケージがあるようです。試してみてはいかがでしょうか。 -- Iona? 2012-06-30 (土) 07:06:41
  • 質問1についてですが、cvsファイルではデータは文字で記録されますから、カンマを含め最低で250*2e5*2/1024^2=95MB程度の容量になります。一方Rに読みこめば数値として扱われますから最低でも 250*2e5*8/1024^2=381MBの容量になります。ですから正常でしょうね。質問2についてですが、lm関数は大量の補助的情報も計算保持しますから、どうしてもメモリーを余計に使います。素朴な回避策は重回帰の理論に従い、必要最小限の計算だけで済ますことでしょうか。 -- 2012-06-30 (土) 10:40:45
  • 8 GBメモリを積んだマシンでWin 7 Pro x64でR-2.15.1 x64では,as.data.frame(matrix(rnorm(250*200000),200000,250))で架空データを作ってlm()を試したら問題なく実行できました。 -- 2012-06-30 (土) 12:25:29
  • 4GBのMacBook?(2.4GHz Intel Core 2 Duo)でのR2.15.1でも,経過時間は125秒(ユーザ52秒)とかかりましたが,できましたね。 -- 河童の屁は,河童にあらず,屁である。? 2012-06-30 (土) 19:10:55
  • R-2.15.1からデータフレーム操作関数の内部実装が大きく変わって高速化かつ省メモリになったので,もしかするとR-2.15.1にするだけでOKかも? -- 2012-06-30 (土) 22:13:02
  • アドバイスありがとうございます.R-2.15.1でエラーは回避できなかったのですが、有用な情報ありがとうございました.また、架空データで試して下さり大変参考になります.64bit、メモリ増設を検討したいと思います.皆さま貴重な情報ありがとうございました. -- taked? 2012-07-02 (月) 17:53:32

2変量ガウスコピュラ関数について

esta? (2012-06-29 (金) 05:07:05)

いつもお世話になっております。
2変量ガウスコピュラ関数について、確率密度関数をグラフで表示したいのですが、2変量ガウスコピュラ密度関数の中に標準正規分布の逆関数があります。この逆関数を表現できず困っています。標準正規分布の逆関数はどのように表現すればよいのでしょうか。

  • 「標準正規分布の逆関数」とは,どういうもの?確率に対する分位点を返すもの?たとえば,0.025 に対して -1.96,0.5 に対して 0,0.975 に対して 1.96 をとるようなもの?だったら,qnorm 関数。
    > qnorm(c(0.025, 0.5, 0.975, 0.7))
    [1] -1.9599640  0.0000000  1.9599640  0.5244005
    そうでないとしたら,もっと正確な定義を述べるよう望む。 -- 河童の屁は,河童にあらず,屁である。? 2012-06-29 (金) 06:43:46
  • 返信遅くなって申し訳ございません。qnorm関数で問題を解決することができました。ありがとうございました。 -- esta? 2012-07-01 (日) 16:22:51

総当り法(ロジスティック回帰分析)でのエラー

hiro? (2012-06-20 (水) 11:56:54)

Rを始めたばかりです。
現在、ロジスティック回帰分析にかけるために、総当り法でAICからモデル選択を行なっています。
変数が20個と多いので、all.logisticの結果はすべて表示されず、デフォルトだとdeviance順に20個しか表示されません。なので、print.all.logisticを使ってAICの小さい順にソートしたいのですが、エラーが出てしまいます。

> print.all.logistic(obj, sort.by=c("AIC"))
 以下にエラー data.frame(obj$deviance, obj$AIC, obj$formula) : 
   オブジェクト 'obj' がありません 

どのようにすればよいのでしょうか。
よろしくお願いいたします。

  • r-project.org と関係ない関数の使用法については,ここで質問するのは適切ではないと思いますよ(少なくとも,そのプログラムがどこにあるものなのかなどをちゃんと書かないと,普通の R ユーザは「そんな関数知らないね」だと思います)。
    総称関数の使い方を理解されていないようですね。
    テストデータとして lr.data を使う場合,
    > lr <- read.table("lr.data", header=TRUE)
    > obj <- all.logistic(lr)
    > print(obj, sort.by="AIC", models=100)
    のようにするようですけど,そのようにしていますか?上の3行を実行したらどうなります。同じようにエラーが起きますか?使用方法を理解せず,勝手な解釈で不適切な使用法でエラーがでても,自己責任ですよ。 -- 2012-06-20 (水) 12:15:12
  • エラーなく無事にできました。お早いお返事ありがとうございます。色々と理解不足があったようで、申し訳ありません。もっと勉強していきます。 -- 2012-06-20 (水) 22:38:04

Rだけでデータクリーニング

tadashi? (2012-06-17 (日) 18:15:17)

実際のデータを読み込むときには、データクリーニングをする必要があります。
そういった作業をRだけできるだけやる方法を書いてあるページはないでしょうか?
Rクックブックには、そういったのはRは不得意だから、やらないほうがいいとかいてありますが、もしかしたらあるのではないかと思っての質問です。
とりあえず、scan で全部読み込んで、それからいろいろ処理しましょうといような内容になるかと予想しています。

  • > Rクックブックには、そういったのはRは不得意だから、やらないほうがいいとかいてありますが
    Rクックブックがいう,「そういったのは」というのは,具体的にどういうことなのか,ちゃんと理解しましたか?
    たとえば,大きなデータを扱うのが不得手---どれくらいのが大きいの?あなたのデータはその基準からいうと大きいの?
    そのほか,何が書いてある?それらは本当に「Rは不得手なの?」
    また,単に,大きいデータの処理には時間が掛かる---実際に,あなたのデータである処理をする(例えば欠損値の補完)のに,どれくらいの時間が掛かるのだろうか?その時間は,あなたにとって耐え難いのだろうか?
    一般論ではなく,あなたの問題として評価することが必要でしょうね。
    ということなら,一般的なことを書いてあるページはないかも知れないし,あってもあなたには役に立たないでしょう。
    やらなきゃならないことなら,Rを使って取りあえずはやってみて,「これこれこのようなことをこういう風なプログラムでやったら,こんなに時間が掛かったのだけど,もっとうまいやりかたはあるでしょうか」と質問するのが,もあべたーーでは?
    > そういった作業をRだけできるだけやる方法を書いてあるページはないでしょうか?
    厳しい言い方のように思うだろうけど,「やりたいことをはっきり理解していて」,「Rを理解していれば」,「あることをRでやることは可能(計算時間はかかるとしても)」。しかし,前提の2つのうち,どちらかが不十分だと,不可能ですね。データ処理のあらゆることを想定して,対処法というか,こうやればよいんだよという「レシピ」を1から書いてあるページは...あるかな?ないという方に「1000万R」(Rってなんの単位やねん(^_^;))
    > とりあえず、scan で全部読み込んで
    少なくとも,scan で読み込むような「ぷあ〜〜〜〜」なデータ形式は,扱いたくないなあ。せめて,data.frame でおねげ〜〜〜〜しますです(^_^;)(^_^;)
    R も,この Wiki での経験も,ある程度あると思いますので,ほどほどに適切な質問をしてくださいね。さもないと... -- 河童の屁は,河童にあらず,屁である。? 2012-06-17 (日) 19:25:10
  • scan で読み込むような「ぷあ〜〜〜〜」なデータ形式は,扱いたくないなあ とは思いますね。でも結構ころがっています。 -- tadashi? 2012-06-17 (日) 20:05:48
  • > でも結構ころがっています。
    どういうかたちで「ころがって」いますか?
    scanで読めるということは,なんらかの規則性がある。ようするに scan 関数で何番目の要素をどんなデータタイプとして読めばよいということがわかっているということ。もう少し複雑で,たとえば,一番目に読んだデータで次に何を何個読むかなんてことが決まるようなデータもある。でも,そんな場合には,然るべきプログラムを書けばよい(書かねばならない)ということ。たとえ,inputLines 関数でまとめて読もうとも。しかるべきプログラムが書けるかどうかは,あなたのスキルによるだけ(Rの仕様による場合は,あるかな??たぶん,ない。すくなくとも,プログラム可能なシステムなら,プログラムによって,何でもできる)読み方をプログラムできないデータなんてのは,でたらめ!!!なデータに過ぎない。何らかの規則に従って記述されているデータは,その規則をプログラム化すれば読める。読むためのプログラムを書けないとすれば,それはプログラムの技量が足りないだけの話。
    Rでは読めない?ようなデータの実例があれば,Rユーザは,クイズを解くような興味をもって,よめるようなプログラムを書くのに励むのではないかな?(すくなくとも,私は,いっときの興味を持ってそのようなプログラムを書くのを楽しみとするだろう。) -- 河童の屁は,河童にあらず,屁である。? 2012-06-17 (日) 21:00:15
  • > そういった作業をRだけできるだけやる方法を書いてあるページはないでしょうか?
    まとめたページというのはなかなか無いようで個別に探した方が良さそうです。
    > Rクックブックには、そういったのはRは不得意だから、やらないほうがいいとかいてありますが
    「データクリーニング」という用語を知らなかったのですが、調べてみたところ欠損値補完や異常値処理、正規化などのデータを読み込んだ後の処理を指しているように思えるのですが違うのでしょうか。どちらにしても、「そういったの(=データクリーニング?)はRは不得意だから、やらないほうがいい」というようなことはないです。Rクックブックを読んだことがありませんのではっきり言えませんが、読み間違いをしていないでしょうか。そもそも解析の前段階として「データクリーニング」があるはずですから解析を行うにあたって「データクリーニング」は必須の作業です。それが不得意な統計解析言語に利用価値はないでしょう。 -- Iona? 2012-06-18 (月) 02:42:32
  • データクレンジングのこと? -- 2012-06-18 (月) 15:13:06
  • 最近は,データクレンジングともいうようだけど,[データクリーニング」の狭い範囲のことを指すようだね。_

    データベースの中から誤りや重複を洗い出し、異質なデータを取り除いて整理すること。データベースの精度を高めることにより、経営やマーケティングに有用な相関関係やパターンを探り出すデータマイニングなどに役立てることができる。データクリーニング。

    しかしまあ,昔っから,データクリーニングといってきた。 -- 河童の屁は,河童にあらず,屁である。? 2012-06-18 (月) 15:48:38
  • Wikipediaによると「データスクラビング」とも言うそうですよ。私も昔からデータクリーニングって言っていました。掃除する(cleaning)と洗浄する(cleansing)は「s」が付くか付かないかの違いに過ぎませんが。 -- 2012-06-18 (月) 17:08:00
  • それぞれの言葉が,いつごろから使われるようになったかを調べるのも,面白いかも知れませんね。 -- 河童の屁は,河童にあらず,屁である。? 2012-06-18 (月) 22:26:32
  • まとまったページがない?じゃあ,作ろうじゃないですか。協力宜しく。早いもの勝ち。 -- 河童の屁は河童の屁は,河童にあらず,屁である。? 2012-06-18 (月) 23:37:23
  • まとめページないみたいなんで、コツコツ勉強しつつ、探してみます。データの型も結構はまります、factor や、list で?になることしばしばです。ところでまとめページつくるとすると名称は、データクリーニングでいいでしょうか? R関係者だと別の名称がよく使われるのでしょうか -- tadashi? 2012-06-18 (月) 23:57:19
  • Rでデータクリーニングというページにしました。 -- 作りましたよ? 2012-06-19 (火) 00:25:46
  • おおすばらしい。fill=TRUE で、無理やり読むこむのですね。 -- tadashi? 2012-06-20 (水) 08:13:29

関数の最大値の求め方

esta? (2012-06-15 (金) 16:30:16)

はじめまして。R歴1週間の初心者です。

f<-function(x)exp(-3.0346+0.0558*x-0.0003*x*x)/{1+exp(-3.0346+0.0558*x-0.0003*x*x)}
plot(f,0,250)

これを実行するとfのグラフが表示されます。mathematicaで最大値とそのときのxの値を求めたところ、x=93のときf(93)=0.391765が最大値として得られました。これをRで求めるにはどのようにしたらよいのでしょうか?

The R Tipsを一通り読んでみましたが分かりませんでした。
どうかよろしくお願いいたします。

  • ?otpimize -- 2012-06-15 (金) 17:14:17
  • plot(f,0,250)はxとyの座標を返します。 -- 2012-06-15 (金) 19:29:06
    > z <- plot(f,0,250)
    > max(z$y)
    [1] 0.3917469
    > z$x[which.max(z$y)]
    [1] 92.5
  • z$x[which.max(z$y)]は近似値しか得られない。
    optim関数は最小値を求めるように作られているので,関数値が返す値に「マイナスを付けて」定義する。なお,今の関数の場合,f の分子,分母を分子で割ると簡単になる。結局の所,
    > func <- function(x) {
    + 	-1 / (1 + exp(3.0346 - 0.0558 * x + 0.0003 * x^2))
    + }
    > ans <- optimize(func, interval=c(0, 250))
    > cat(ans$minimum,を取得する関数や方法はありますでしょうか?~
    list.files() で作業フォルダ内のファイル名は取得できますが、他にも.Rdataの拡張子を持つファイルがある場合、hoge.Rdataを一意に決定できずに困っています。解決策やヒントなど、ご教示いただければ幸いです。
    動作環境は、Win XP、R version 2.14.2です。
  • commandArgs()の結果ではどうでしょうか -- Camino? -func(ans$minimum))
    93 0.3917648
    とすればよい。 -- 河童の屁は,河童にあらず,屁である。? 2012-06-15 (金) 23:23:12
  • みなさん丁寧にありがとうございます。おかげさまで出来るようになりました。自分も質問に対して答えられるくらいになれるよう努力します。 -- esta? 2012-06-16 (土) 03:23:18

doMC 並列処理

BCD? (2012-06-14 (木) 11:06:29)

いつもお世話になっております 。
Linux、R2.1.4環境下でlibrary(doMC)のregisterDoMC()を使ってforeach~%dopar%{で並列処理を行っているのですが、Rがクラッシュしてしまい処理を終えることができません。解決策をご存知の方がいらっしゃいましたら御教授願います。

  • Rのバージョンを間違っていないでしょうか。R 2.1.4というのは存在しません。
    質問をされるときはもう少し具体的に書かれた方がいいでしょう。
    メモリが足りないというようなことはないでしょうか。
    並列処理を使わずに計算を行った場合は計算を行えるのでしょうか。
    library(doMC)
    registerDoMC()
    foreach(i = 1:3) %dopar% sqrt(i)
    このような簡単な処理ならクラッシュせずに処理を行えるのでしょうか。 -- Iona? 2012-06-14 (木) 21:44:58
  • 情報不足で申し訳ありません。私が使っているRはR 2.14.0です。registerDoMCでコアを2以上に指定すると処理が停止してしまう場合があるようです(場合というのは数日前は同じ処理を複数コアで処理できた場合もあったからです。しかし今現在は複数コアを使うと処理できません)。コア数が1だと問題なく実行できます。複数のコアを使用した場合でのみメモリが足りなくなる場合があるのでしょうか?また、Ionaさんが指定した処理はコア数をいくつに設定しても処理することができました。 -- BCD? 2012-06-14 (木) 23:58:40
  • おそらくメモリが足りていないのではないかと思います。単純に考えればコア数が2倍になるとメモリ使用量は2倍になります。一度実行中にメモリ使用量を確認してみてメモリが足りていないようでしたら、R以外のプログラムを起動せずに実行する、メモリ容量の大きい期待を使用する、メモリを増設するなどの対策が必要だと思います。 -- Iona? 2012-06-15 (金) 07:53:46
  • 返信ありがとうございます。複数コアを使用するとその分メモリを食ってしまうのですね。ところで'一度実行中にメモリ使用量を確認してみてメモリが足りていないようでしたら...'というのはRの実行中にtopコマンドでメモリ使用状況を確認するということですか? -- BCD? 2012-06-15 (金) 11:27:32
  • > Rの実行中にtopコマンド
    そういうことです。 -- Iona? 2012-06-15 (金) 13:22:05
  • topコマンドでメモリを確認してみたところ、crashが起きているからなのかRのメモリ占有率を調べることができませんでした。少し時間がかかりますがsingle coreでも出来ない作業ではないのでとりあえずこの問題は放っておくことにしました。どうもありがとうございます。 -- BCD? 2012-06-17 (日) 13:06:25

RData 形式 日本語を windows,mac,linux で共通してつかえるのか?

tadashi? (2012-06-12 (火) 10:08:39)

前も聞いているのですが、できるんでしょうか? UTF-8で、CSVで保存すれば、なんとでもなるだろうというのはわかっているのですが、バイナリで共通してもてると便利だと思っています。それほどめんどうでなく、いい方法はないのでしょうか?

  • 内部コードは統一されているはずなので、できるのではないかと推察しますが、実際にはどうなのでしょうか?試された方はいらっしゃいますか? -- 2012-06-12 (火) 13:15:43
  • R勉強会@東京 でも話題になりましたが、あまりきちんと検証されていないようです。 -- tadashi? 2012-06-13 (水) 01:13:55

X軸ラベルの変更方法について

TK? (2012-06-09 (土) 21:27:13)

Rコマンダーで折れ線グラフを作成した結果思うようなグラフができたのですが、X軸の目盛が0,50,100....と50刻みで表示されました。これを0,30,60,90,....360まで30刻みにしたいのですが、作成方法を詳しくお願いします。
R初心者ですのでプログラムの書き込み場所手順等、詳しくお願いします。
今は、Rコマンダーでデーターセットしてグラフ作成する事しかわかってませんので宜しくお願いします。

  • >これを0,30,60,90,....360まで30刻みにしたいのですが
    なぜ,そのような目盛り付けが望ましく,デフォルトでの目盛り付けが望ましくないのか,単なる好み(要望)以外の理由があるのでしょうか?さしたる理由がないのなら,デフォルトで我慢するのがよいのではないでしょうかね。
    あるいは,R commander から脱却して,axis コマンドで,好きなように目盛りラベルを設定すると幸せになれるでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2012-06-09 (土) 21:33:03
  • 目盛の変更は、そのように設定する必要があるためです。R commander から脱却して,axis コマンドでの目盛ラベル設定方法がわかりません詳しくお願いします。 -- TK? 2012-06-09 (土) 21:55:52
  • > そのように設定する必要があるためです
    マジギレしてませんか...「必要がある」のならば,するしかありませんね。R commander でもできるのでしょうけど,素のRだってできないわけはないので,以下のように。
    layout(matrix(1:2, 1))
    plot(iris$Petal.Width, iris$Sepal.Length)
    plot(iris$Petal.Width, iris$Sepal.Length, xaxt="n", yaxt="n", xlim=c(0, 3))
    axis(1, at=seq(0, 2.5, by=0.25))
    axis(2, at=seq(4, 8, by=1))
    layout(1)
    要するに,plot コマンドで xaxt="n", yaxt="n" 必要があれば xlim, ylim そして,axis(1, ...), axis(2, ...) を使う。高水準描画関数はデフォルトの描画をしてくれるが,それを抑制して,低水準描画関数で細かな指定をする。デフォルトで我慢できないのなら,詳細指定は自分で設定するしかない。 -- 河童の屁は,河童にあらず,屁である。? 2012-06-09 (土) 22:09:39 jibundesettei.png
  • 初心者すぎて理解が足りないようです。 R commanderでグラフを作成後スクリプトへ入力し実行をクリックする方法でいいのでしょうか?根本的に理解不足の様で目盛の設定が上手くできません。 -- TK? 2012-06-09 (土) 23:31:05
  • TKさんの場合、「根本的な理解不足」問題を解決しないと、30刻みのグラフは描けないと思います。R commanderを捨ててRの入門書を片手に数時間は勉強してみてください。実習講義で学生が5分で理解するレベルの問題ですよ。語学と同じです。layout関数、plot関数、axis関数の意味と用法を調べるのです。例文を検討して、自分の書きたいことを英作文するように、Rの関数を使ってコマンド文を作成するのです。中途半端な通訳機(=R commander)をいつまでも使っていると、貴方のやりたいことがRに伝わりません。 -- 2012-06-10 (日) 13:33:52
  • ご教授有難うございます。R基本技の本を読み始めました。独学ですので簡単に考えてました。Rを使いこなせるよう努力致します。 -- TK? 2012-06-10 (日) 17:21:35

移動ブロック・ブートストラップについて

[[E&T]] (2012-06-06 (水) 21:34:40)

 Efron and Tibshiraniの"An Introduction to the Bootstrap"でブートストラップの勉強をしています。同書のp.99-102の「8.6 移動ブロック・ブートストラップ」に関して、質問があります。
 時系列データからランダムに3つの観測値からなるブロックを復元抽出して、新しい時系列を200系列作成します。それに対して1次の自己回帰モデルを当てはめ、回帰係数βのブートストラップ推計値を求めようというものです。
 これを追試しようとして、library(boot)のtsbootを適用すべき問題であろうと推測し、以下のようなコードを試してみました。(対象とする時系列は、library(bootstrap)のlutenhorm$V4です。)

library(bootstrap)
library(boot)
block.beta <- function(tsb){
 ar.fit <- ar(tsb, order.max=1)
 as.vector(ar.fit$ar)
}
lut.block3 <- tsboot(lutenhorm$V4, statistic=block.beta, R=200, l=3, sim="fixed")

すると、以下のようなエラーメッセージが出て、うまくいきません。

以下にエラー tsboot(lutenhorm$V4, statistic = block.beta, R = 200, l = 3,  : 
  replacement(置き換え)の長さが0です 

何か、根本的なところで私自身に誤解があるのかもしれませんが、原因がよく分かりません。どなたか解決策を御教示いただければ幸いです。

  • > 根本的なところで私自身に誤解があるのかもしれませんが
    私にもよく分かりませんが,l=3 というのは,この場合の指定としてはふさわしくない(正しくない)と言うことでしょう。通常もっと大きな数値を指定すると思います。「自己回帰モデルを当てはめて」ということからも,小さすぎると思います。なお,プログラム中では乱数によりブートストラップデータを作っていますので,l が十分大きくない場合には,同じ l を指定して分析しても,うまく行くときと行かないときがあります。いずれにせよ,l=3 では常にうまくいかないということになるようです。 -- 河童の屁は,河童にあらず,屁である。? 2012-06-06 (水) 22:59:42
  • 御指摘を受け、l=12として実行してみたら、確かにうまくいきました。お陰様でここ数日の疑問が氷解しました。  それにしても、Efron and Tibshiraniは3個のブロックをリサンプルするプログラムを、ループを使用して地道に解いていたのでしょうか?彼らはl=5の場合も実行していますが、これもtsbootではエラーとなります。 -- [[E&T]] 2012-06-06 (水) 23:25:59
  • > ループを使用して地道に解いていたのでしょうか
    そのころに,R はなかったからねえ。その方が幸せだったのでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2012-06-06 (水) 23:46:23

ARで伝達関数のゲインやコヒーレンス・位相を出したい

Rbeginer? (2012-06-05 (火) 11:10:03)

Rで時系列解析を考えている初心者です。

AR(自己回帰モデル)を用いた時系列解析に関する質問です。
RでARを用いた伝達関数のゲインやコヒーレンス、位相を計算することを検討しています。
調べていてもどうもたどり着けません。
Rでそもそも可能でしょうか、またパッケージを導入すれば可能なのでしょうか?
ご教授いただければ幸いです。

グラフの軸の目盛を内向きにしたい

sato? (2012-06-05 (火) 10:39:04)

R初心者です.
Rで折れ線グラフや棒グラフなどの単純な作図を行なっています.
軸の目盛りですが,デフォルトでは外向きとなっていると思います.
これを内向きにしたいと思って,いろいろ調べたのですが,よくわかりません.
ご教授くださいますようお願いいたいします.

  • plot(0, tcl=0.5) みたいなことでしょうか? -- 2012-06-05 (火) 10:53:27
  • ありがとうございました! 何時間も悩んでいたことがあっと言う間に解決しました! -- sato? 2012-06-05 (火) 11:16:53
  • plotやparでのグラフの見栄えの調整は、慣れるまではたいへんですよね。自分も最初は「表計算ソフトのように、クリックしてパパッと直せたらいいのに」と思っていました。しかし一旦慣れてしまえば、Rでの自動処理・計算の結果を、いつも一貫した様式の美しいグラフとして得ることができます。めげずに頑張ってください。 -- 2012-06-05 (火) 13:29:00
  • 最近,なぜRで作図するのかがだんだんわかって来ました.もっと簡単に書けるように精進します! -- sato? 2012-06-05 (火) 16:12:59

グラフ内に線を書き込みたい

BCD? (2012-06-02 (土) 21:07:42)

いつもお世話になっております。
グラフ内における座標について質問があります。

ベクトルがいくつかあり、それらをfor文で繰り返しを用いてそれぞれをplot関数で折れ線グラフを作成しています。各々のグラフにおいて作図領域の中の同じ位置にlines関数を用いて線を表示したいのです。それぞれのグラフでは座標位置が異なるのでlines関数に渡すxとy座標を統一することができません。for文を使って繰り返しの中で自動的に線を加えたいので各グラフにおける座標を取得することができれば良いと思うのですが方法が分からないのです。

何かご存知の方がいらっしゃれば御教授願います。

  • plot関数を実行するとpar("usr")にc(左端のx座標, 右端のx座標, 下端のy座標, 上端のy座標)が入ります。 -- Iona? 2012-06-02 (土) 23:00:48
  • 有り難う御座います。おかげで思い通りのことができました。 -- BCD? 2012-06-03 (日) 01:25:37

動画像のコマ送りとショートカットキー

Rstudent? (2012-05-31 (木) 09:29:52)

Rのグラフィックデバイスについて質問があります。

Mpeg等の動画像を手動で一定のフレーム数進め、その都度、動画像上のある点の座標を取得したいと考えております。
座標の取得はlocator()を利用すれば可能だと思いますが、以下について方法がありましたら、ご教示願います。

1.動画像を手動で進める方法
animationパッケージのani.start()を用いてHTML上で再生すると、コマ送りのボタンが表示されますが、このようなことをRのグラフィックデバイス上でできないものでしょうか。

2.ショートカットキーを用いてグラフィックデバイスにコマンドを与える方法
動画像を進める際にショートカットキーでコマ送りを行ったり、ショートカットキーで変数に値を入れたりすることができると非常に効率的になるのですが、そのような方法はあるのでしょうか。

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

  • その手のことをしたければ、適当なwidget (tcltkとかGtk2とか)で作り込むしかない気がする。tkrplotパッケージとか、rpanelパッケージのヘルプにある作成例を見てみればどうだろう。 -- 2012-05-31 (木) 13:58:56
  • Rでやるべきタスクだとは思わないけど、もしやるなら動画を静止画に分解→読み込んで表示〜locatorで座標取得のループ。 -- 2012-05-31 (木) 14:19:42

コンマ秒以下の経過時間の計算について

timesaver? (2012-05-21 (月) 18:48:18)

コンマ秒以下の経過時間を計算したい場合、例えば
as.difftime(c("0:3:20", "0:3:20.5"),units="sec")
とすると結果は
Time differences in secs
[1] 200 200
attr(,"tzone")
となり秒以下は無視されます。これを解決する簡単な方法はどなたかご存じ
ありませんか?過去記事やパッケージはないかと探したのですが見当たりませんでした。

  • そんなに一般的で複雑な仕様でないなら,自分で関数を書く。 -- 河童の屁は,河童にあらず,屁である。? 2012-05-21 (月) 19:18:33
    my.difftime <- function(time) { # units="secs" を仮定
    	unname(sapply(time, function(t) {
    		str <- unlist(strsplit(t, ":"))
    		if (length(str) != 3) return(NA)
    		return(sum(as.numeric(str)*c(3600, 60, 1)))
    	}))
    }
    > as.difftime(c("1:3:20", "2:3:20.5"), units="secs")
    Time differences in secs
    [1] 3800 7400
    attr(,"tzone")
    [1] ""
    > my.difftime(c("1:3:20.123", "2:3:20.523"))
    [1] 3800.123 7400.523
  • system.time とういうのがあるみたいですが、使えませんか? -- tadashi? 2012-05-21 (月) 19:51:33
  • 関数のチューンナップ あたりに関連しそうなのがあるような気がするのですが、どうでしょうか -- tadashi? 2012-05-21 (月) 19:53:33
  • as.difftime(c("0:3:20", "0:3:20.5"),format="%H:%M:%OS",units="secs") -- 2012-05-21 (月) 21:12:17
  • ↑追記:help(strptime)のExamplesでは if supported by the OS とのこと。河童さんので十分と思いますがhelpも使えますよと言う意味で。 -- 2012-05-21 (月) 21:21:53
  • ありがとうございます。%OSというのがあったなんて、、strptimeのヘルプに書いてありました(良く見ないとわからない).他の方もありがとうございます! -- timesaver? 2012-05-21 (月) 21:32:22
  • 河童さん、綺麗な関数書いていただいてありがとう御座いました。 -- timesaver? 2012-05-21 (月) 21:36:47
  • 検索をもう少し頑張ろうよ。1秒以下の扱いについて -- 2012-05-22 (火) 12:06:26
  • 自分でも忘れているけど。目的とする記事を発見するための検索語の決定も難しいのでね。検索をがんばるより、黙って関数を書いた方が速い。
    as.difftime とは目的が違うけど(あったりめーだけど)2時点間の経過時間を計算するなら,早い話,日付データを加えて(ダミーでもよいか),以下のようにするということかな。あなたのやりたいことは,どっち? -- 河童の屁は,河童にあらず,屁である。? 2012-05-22 (火) 13:55:44
    > difftime("2012-05-22 00:34:56.789", "2012-05-22 00:12:34.567", units="secs")
    Time difference of 1342.222 secs
  • 「黙って関数を書ける」ひとなら、もちろんそうしたほうが早いでしょうがね。「黙って関数を書けない」ひとが仕方なく質問をする場合には、先にもう少ししっかり検索しましょう、ということでしょう? -- 2012-05-22 (火) 14:31:01
  • 日付を付けるとコンマ以下も計算するとは、目からウロコです。記事は目にしていたのですが、ODBCに関するコンマ秒以下の読込み、と思い込んでしまっていました。申し訳ない。 -- timesaver? 2012-05-22 (火) 18:19:24
  • 差が1秒以上だとコンマ秒以下の計算は正しいけど、1秒以下だとすこし変になりますので注意が必要かと(そんな人いないかもしれないが) -- timesaver? 2012-05-22 (火) 18:57:06
    > difftime("2011-10-11 15:08:01.800 JST", "2011-10-11 15:08:02.900 JST", units="secs")
    Time difference of -1.1 secs
    > difftime("2011-10-11 15:08:01.800 JST", "2011-10-11 15:08:01.900 JST", units="secs")
    Time difference of -0.1000001 secs
  • これは,コンピュータ上での数値計算における常識です。
    コンピュータ上で,2のべき乗の和で表されない数値はすべて「近似値」として格納されているのです。我々がなじんでいる10進数世界では 0.1 は完全に正確に表せる数値ですが,コンピュータ(2 進数)の世界では 0.1 は正確に表せない循環小数なのです(10進世界での 1/3 が正確に表せないのと同じ)。コンピュータが表示される有効桁はたかだか15,6桁に過ぎません。
    順を追って,説明しましょう。
    > options(digits=20) # コンソールに表示する数値の桁数を20桁にする
    > time1 <- "2011-10-11 15:08:01.800 JST" # この日付は,
    > time1 <- as.POSIXct(time1) # コンピュータ上ではこのように格納される
    > unclass(time1) # 数値としては以下の通り
    [1] 1318313281.7999999523 # 10進数でのキレイな数になっていない
    attr(,"tzone")
    [1] ""
    > time2 <- "2011-10-11 15:08:01.900 JST" # もう一つの日付についても同じく
    > time2 <- as.POSIXct(time2)
    > unclass(time2)
    [1] 1318313281.9000000954 # 10進数でのキレイな数になっていない
    attr(,"tzone")
    [1] ""
    > unclass(time1)-unclass(time2) # 数値の差を取ると
    [1] -0.10000014305114746094 # -0.1 ではない,ということになった!!!!
    attr(,"tzone")
    [1] ""
    そもそも,"2011-10-11 15:08:01.800 JST" が 1318313281.7999999523 ということはどういうことか。それは,1970年1月1日を0として,経過日時を表す数値です。有効桁15桁では正確には表せない数値です。正確に表せない2つの数値の差も正確には表せないと言うことです。
    それでも何とかしたいと言うことなら,経過日時を表す数値が有効桁の範囲に収まるように,なるべく近くなるように,表すことでしょう。以下のようにすれば取りあえずは正しい答えが表示されますが,それは,たまたまであると言うことです。
    > difftime("1970-01-01 15:08:01.800 JST", "1970-01-01 15:08:01.900 JST", units="secs")
    Time difference of -0.10000000000218278728 secs # かなり,正確になったように見えるが我々の感覚では不正確
    > options(digits=7) # 当然と言えば当然だが,表示桁数を通常の7桁にすれば,
    > difftime("1970-01-01 15:08:01.800 JST", "1970-01-01 15:08:01.900 JST", units="secs")
    Time difference of -0.1 secs # 一見正しい答えが表示される(が,コンピュータ上では -0.1 ではない)
    ということですね。「コンピュータは,正確な答えを表示しているとは限らない」
    じゃあ,どうすればよい?
    自分で関数を書く。
    年の情報も数値に含めているから桁数が大きくなるのだから,少なくとも年月はおよばず日にちをまたがない(またぐとしてもたかだか数日)として,計算する関数を書く。
    > my.difftime2 <- function(time1, time2) {
    + 	t <- function(time) {
    + 	         sum(as.numeric(unlist(strsplit(time, ":"))) * c(3600, 60, 1))
    + 	      }
    + 	t(time1)-t(time2)
    + }
    > my.difftime2("15:08:01.800", "15:08:01.900")
    [1] -0.1
    プログラムが書けない?...がんばってもらうしかないなあ。
    あるいは,コンピュータが一生懸命どのような計算をしているか理解し,温かく見守り,出てくる結果を許容する。 -- 河童の屁は,河童にあらず,屁である。? 2012-05-22 (火) 22:18:51
  • べつに「プログラムが書けない」ということを擁護する意図はないんですがね。単に、河童の屁は,河童にあらず,屁である。さんの「検索をがんばるより、黙って関数を書いた方が速い」という指摘がすべてのひとにあてはまるわけではないと言っているのです。質問を投稿するなら、それに先立ってちゃんと検索してもらったほうがよいわけで。「検索語の決定が難しいから、検索はがんばらなくていい」という風にとれるコメントは、いかがなものでしょうか。 -- 2012-05-23 (水) 10:38:47
  • ここで述べられる所見は,「絶対的に」正しいものではない。そういうことは,どの掲示版でも同じでしょう。プログラムを書けないという場合には,こんなプログラムを使えば解決出来ますよという一例を示しているわけだし(少なくとも,私はそのように努めている(私のほかのコメントを見て評価してください。「しょうもない」と評価されるなら,私は消えます)。そのプログラムが不完全だとか,もっといいプログラムがあるよとか,既になんとかかんとかというプログラムがあるよとか,ヘルプを読めばその解決法は最初から提示されているよとか)コメントは,いろいろあるでしょう。
    プログラムを書けないということを否定するつもりはありません。Rを使える人はプログラムも出来るだろうなんてことは考えていません(Rは使えるがプログラムは書けません,あるいは,R は使える,R は堪能だと(言外に)言っている人が書いたプログラムが,なんだこれ?ということもありますし)。Rを使っていろいろやった結果,その過程をプログラム(関数)として自分のものに出来たという体験をできた人が多くなればよいなあと思っています(CやFORTRANでプログラムするよりは敷居が低いのではないかなと言うこと)。
    「なんとかかんとかという関数を,こういう風に使えば結果が出るよ」でも,他の SPSS や SAS や STATA と同列で当然よいのですが,+αを期待するなら,自分なりの(オプションとか何とか些細なことでも)使用法(使用例)の経験を積めればいいなあと思うわけです。はい。 -- 河童の屁は,河童にあらず,屁である。? 2012-05-23 (水) 21:33:17
  • 河童の屁の「屁理屈」ではありませんが,質問はどんどん自由にしてもらって良いでしょう。そもそもここは「Q&A」なんだから。
    ただし,質問は,質問の仕方についての説明があるように,「質問するには所与の要件を満たす」質問であるべし。その要件を満たさない質問には,答えなくてもよいし,「他にこういう条件を満たせば回答が得られるかも」という示唆をするのもよし。今回のように,過去の質疑応答のスレッドを参照せよと言うのも良し(ただし,今回のように,直接解決に結びつかない(結びつかない恐れのある)回答には補足説明)と言うことでしょう?
    様々な要求を持つ質問者に,事前に準備(検討)すべきことを望みたいというのは理解するにはばかりない。しかし,最初から「質問するにはこれこれのことをしてからにしろ」というのもどうかなあと思うわけです。「こんな無礼な(質問する前にすべきこともしていない)質問に答えたくない」と思う人は,答えなければよいのです(あるいは,「答えるためには以下の要件を満たしてください」と表明すればよいわけです。そんな場合には,そもそもコメントさえもしないでしょうけど)。 -- 河童の屁は,河童にあらず,屁である。? 2012-05-23 (水) 21:59:32
  • 嗚呼、どうやら長文でレスポンスいただいたようで。なにか個人批判のようなものだと受け取られたのであれば、誤解ですのでお考え直しください。 わたしは単に、パパッとプログラムを書く能力がないからこそ質問したのであろう質問者さんに対して、「検索をがんばるより、黙って関数を書いた方が速い」という指摘は的外れだといっているのです。(単純な論理だと思うのですけれど…。)そのうえで、「検索はがんばらなくてよい」という部分だけが都合よく受け取られて、過去ログも検索しない質問ばかりになったら困る、と。 もちろん、河童の屁は,河童にあらず,屁である。さんの過去のコメントは読ませていただいております。だからこそ、斯様の「自助努力が足りない」質問に対し、ときにはそのことを指摘されることがあるのも知っています。だとすれば「質問を書き込むまえに自分でできる(検索という)努力はしてもらう」という点をはっきりさせておく事に関しては、ご理解いただけると思ったのですが…。「最初から『質問するにはこれこれのことをしてからにしろ』というのもどうかなあと思うわけです。」というような御寛大な認識でいらっしゃったとは、恐れ入ります。 -- 2012-05-24 (木) 09:39:00
  • Rや統計解析法がブラックボックス化され、数値計算やPCの特性を知っているのと知らないとでは、大きな差がある。同じOSで異なるCPUの差異を知らない開発者や利用者もいる。システムが大きくなるに従い、質問さえ難しくなるでしょう。共感や合意を得られる質問や回答を、各自が判断し、相互に情報を得られるようにしたいものです。自分の課題に対して、河童の屁さんの発言は、「プログラムを書けるぐらい理解し、頑張って貰えればいいなぁ」と内容の願いだと認識しています。私は、屁さんの解決能力を評価し、羨望さえしていることをお伝えします。 -- Ooki? 2012-05-24 (木) 23:44:25

ランダム効果の推計に関して

optimal? (2012-05-20 (日) 01:03:58)

期間10年、9カ国、説明変数10から成るパネルデータを分析しています。分析対象は、経済学でいうところのグラビティモデルです。

プーリング推計と固定効果推計については出力できたのですが、ランダム効果推計を行おうとすると、下記のようなエラーがでてしまいます。
パネルデータには欠損値はありません。どなたか、対処法をご教示くださいませんでしょうか?なお、期間10年対象国21カ国(上記9カ国含む)のパネルデータ、期間10年対象国12カ国のパネルデータについては推計が出来ました。

> north.pl <- plm(form, data=north, model="pooling")
series    are constants and have been removed
> north.wi <- plm(form, data=north, model="within")
series    are constants and have been removed
> north.ra <- plm(form, data=north, model="random")
series    are constants and have been removed
 以下にエラー if (sigma2$id < 0) stop(paste("the estimated variance of the",  : 
   TRUE/FALSE が必要new{2012-07-14 (土) 04:53:48};
  • tadashiさん、Ionaさんありがとうございます。pythonのsmtplibをrJythonから利用する方法を調べてこのサイト(http://r.789695.n4.nabble.com/Email-out-of-R-code-td3530671.html)で、特にファイル添付できるnutterb 氏の投稿を参考にしています。送信はできたのですが本文に日本語を送信すると???となって受信されます。エンコードを明示的に指定しないといけないことが分かり修正を試みているのですがpythonも初心者なものでうまくいっておりません。大変お手数おかけしますが、nutterb 氏の投稿の中で修正箇所・コードについて教えて頂けないでしょうか? -- kbys? なところが欠損値です 使用環境は以下の通りとなります。
    R version 2.15.0 (2012-03-30)
    Platform: x86_64-pc-mingw32/x64 (64-bit)

    以上につき、ご教示お願い致します。
  • 本来 "series *, *, *, * is constant and has been removed" の "*, *, *, *" のところには,データフレーム中の複数の変数名がカンマで区切られて入ることになるのだけど,そこが空白になっているのは,使用したデータに問題があるのかな。ちなみに,エラーメッセージの意味は,「これらの変数(シリーズ)は定数なので除いた」ということですが,データの中に全て同じ値を取る変数があるのですか?お心当たりは? -- 河童の屁は,河童にあらず,屁である。? 2012-05-20 (日) 04:52:19
  • new{2012-06-18 (月) 17:08:00};
  • それぞれの言葉が,いつごろから使われるようになったかを調べるのも,面白いかも知れませんね。 -- 河童の屁は,河童にあらず,屁である。? 河童の屁は、河童にあらず、屁である。さん、ご回答有難うございます。series are constants and have been removedについては、ご指摘の通りで、データの中に全て同じ値を取る変数があります。推計式(form)には入っていないのですが、一応データから抜いてみたところ、series are constants and have been removedのエラーは出ませんでした。しかし、依然として「以下にエラー・・・欠損値です」という下2行のエラーメッセージが表示され、ランダム効果推計は行えません。下2行のエラーメッセージについてはお分かりになりますでしょうか。重ねて御礼申し上げます。宜しくお願い致します。 -- optimal? 2012-05-20 (日) 09:29:53
  • > 下2行のエラーメッセージについて
    わかりませんね。プログラムをたどっていけば,どこで,どういう理由でこのエラーが出るのかはわかるでしょうけど,そこまでやる気が出ない。
    form の内容や,north データがどんなものなのかを示せば別の面から検討することも出来ると思うけど。
    質問者の状況を再現できるように質問することも大切なことだと思いますよ。 -- 河童の屁は,河童にあらず,屁である。? 2012-05-20 (日) 09:48:18
  • 河童の屁は、河童にあらず、屁である。さん、ご回答有難うございます。formの中身は、 ctt ~ edu + gdppc + pop + tax + reg + pipr + tariff + trade + fdi +distanceとなっていて説明変数が10個の重回帰モデルです。northデータは、それぞれの変数につき90個(9カ国*10年)数値があり、全てログで表記されています。csvデータからパネルデータを得るまでのコマンドは以下の通り、northデータを上から5行まで以下にお示しいたします。私の説明不足で御手数おかけして申し訳ありません。 -- optimal? 2012-05-20 (日) 13:25:28
    > north <-read.csv("north.csv", header=T)
    > north <-plm.data(north, index=c("country","year"))
    > north
            country year      ctt      edu     gdppc  以下略
    1     Australia 2000 14.44600 2.276241 10.225650  以下略
    2     Australia 2001 14.88955 2.276817 10.276530  以下略
  • データを示すには全部を示さないと意味がない(こともある)。ただ,大きなデータをこの掲示版に貼るとみんなの迷惑になる(ので。前の記事中の部分的なデータも省略させてもらった)。
    「ファイル添付」で添付すれば宜しかろうと。 -- 河童の屁は,河童にあらず,屁である。? 2012-05-20 (日) 18:51:38
  • 河童の屁は、河童にあらず、屁である。さん、ご回答有難うございます。勝手がわからず御手数おかけして申し訳ありません。 [リンク削除] データはこちらになります、お時間ありましたらアドバイス頂けると幸いです。宜しくお願い致します。 -- optimal? 2012-05-23 (水) 05:29:00
  • データちゃんとアップロードされていませんよ。
    画面の上の方にある「ファイル添付」をクリックして,出てくるウインドウで,「選択...」ボタンをクリックしてパソコン上のファイルを選択して,「アップロード」ボタンをクリックすれば,ファイルがアップロードされます。
    アップロードされたファイルを参照する(リンクをはる)には,投稿記事中に「&ref(ファイル名);」とすればよいのです(&は半角にしてね)。 -- 河童の屁は,河童にあらず,屁である。? 2012-05-23 (水) 10:26:18
  • filenorth.csv ~
    河童の屁は,河童にあらず,屁であるさん、たびたび失礼いたしました。ようやくファイル添付の仕方が理解できました。これまではRjpWikiのトップページにファイルをアップロードしていたのですが、このQ&Aのページにアップすると手間が省けるのですね。-- optimal? 2012-05-23 (水) 18:01:32
  • method="random" の場合,期間n年,kカ国データなら,使える説明変数の個数は k-2 個でしょう。あなたのデータでは k=10 なので,説明変数は 8 個までしか使えないはず。国の数を減らしたデータを作って,幾つまで説明変数が使えるかを試してみれば良いでしょう。
    ちなみに,エラーが出ているのは,plm:::swar の下に示した箇所。
    plm:::swar
    function (formula, data, effect) 
    {
        within <- plm.fit(formula, data, model = "within", effect = effect)
        within$args <- list(effect = effect, random.method = "swar")
          中略
            if (balanced) {
                sigma2$one <- arg.other * deviance(between)/df.residual(between)
                sigma2$idios <- deviance(within)/df.residual(within)
                sigma2$id <- (sigma2$one - sigma2$idios)/arg.other
                if (sigma2$id < 0) # sigma2$id が NA であるため
                    stop(paste("the estimated variance of the", effect, 
                      "effect is negative"))
               以下略
    sigma2$id が NA なのは,モデルに対して解が求まっていないから。解が求まらないのは,説明変数が多すぎるから。 -- 河童の屁は,河童にあらず,屁である。? 2012-05-23 (水) 19:47:05
  • 河童の屁は,河童にあらず,屁であるさん、御解説有難うございます。Rやデータセットの問題かと思っていたら、そもそも推計手法の性質の問題だったとは盲点でした。お陰様で前に進むことが出来ました、ありがとうございました。 -- optimal? 2012-05-24 (木) 23:52:04

テキストとグラフをPDF出力する方法について

taked? (2012-05-18 (金) 17:40:50)

Rを使って、簡単なレポートを作成したいと思ってます。
pdf()関数で、グラフはpdfに出力できます。
例えば、任意のテキスト、データフレーム、グラフを並べてpdfに出力することは可能でしょうか?ご教授お願いします。

df <- data.frame(x=c(1:5), y=sample(100,5))
pdf("c:/test.pdf")
  plot(df)
dev.off()
  • 「任意のテキスト、データフレーム、グラフを並べてpdfに出力」というのがどういうことなのかはっきりとは分からないけど,テキスト,データフレーム,グラフを一つの pdf ファイルにするということなら,Sweave を使うとよいのでは?
    Sweaveマニュアル訳などを参照のこと -- 河童の屁は,河童にあらず,屁である。? 2012-05-18 (金) 18:12:51
    Rnw.png
       ⇩
       ⇩
       ⇩
    output.png
  • gplotsパッケージにtextplotという関数があります。mfrowパラメータ等で作図領域を分割すればお望みのことができると思います。 -- Iona? 2012-05-18 (金) 23:08:16
  • 返信遅くなり申し訳ありません。質問は「テキスト,データフレーム,グラフを一つの pdf ファイルにする」意味です、失礼しました。ポスター等ではなくレポート用途なので、Sweaveを試しているところです。どうもありがとうございました。-- taked? 2012-05-19 (土) 11:01:21
  • 質問が変わるようで恐縮ですが、引き続きご教授お願いします。 河童の屁は,河童にあらず,屁である。さんが書いたスクリプトを保存しました(test1.Rnw)。Rstudioから「Compile PDF」をクリックしPDFファイルを作成したいのですが、failedとなります(エンコードの問題とpdflatex.exeが実行できない?)。お手数おかけしますが、解決方法のアドバイス頂けると幸いです。 -- taked? 2012-05-19 (土) 11:50:33
    > grDevices::pdf.options(useDingbats = FALSE); utils::Sweave('test1.Rnw')   
    Writing to file test1.tex  
    Processing code chunks with options ...  
    1 : keep.source term verbatim  
    2 : keep.source term tex  
    3 : keep.source term verbatim pdf   
    You can now run (pdf)latex on 'test1.tex'  
    &#65533;x&#65533;&#65533;&#65533;&#65533;&#65533;b&#65533;Z&#65533;[&#65533;W&#65533;F #文字化け  
    1: 'test1.Rnw' has unknown encoding: assuming Latin-1   
    2: package 'xtable' was built under R version 2.14.2   
    >   
    Running texi2dvi on test1.tex...failed  
    Error running C:/w32tex/bin/pdflatex.exe (exit code 9)  
  • 前のコメントに書いたのは完全な Rnw テキストではありません(そのあたりは了解頂いているようですが,念のため)
    1: 'test1.Rnw' has unknown encoding: assuming Latin-1
    2: package 'xtable' was built under R version 2.14.2
    ということですが,Sweave 関数にエンコーディングの指示はしましたか?
    具体的には,Sweave(file, encoding="euc-jp", ...) などのように,encoding 引数で,実際に使用したエンコーディングを指定する必要があります。
    Windows だと Sweave はめんどうなんでしょうか。Windows の Sweave ユーザにフォローをお願いしたいと思います。 -- 河童の屁は,河童にあらず,屁である。? 2012-05-19 (土) 21:29:46
  • ご返答ありがとうございます。Sweave(file, encoding="euc-jp")なども試したのですが、うまくいきませんでした。WondowsのSweaveユーザーの方からアドバイス頂けますと幸いです。 -- taked? 2012-05-20 (日) 09:06:23
  • > Sweave(file, encoding="euc-jp")なども試したのですが
    Windows なら,encoding="cp932" では? -- 河童の屁は,河童にあらず,屁である。? 2012-05-20 (日) 10:32:52
  • ご返答ありがとうございます。おっしゃるとおりで、訂正します。Sweave(file, encoding="cp932")を試したのですが、まだうまくいっておりません。 -- taked? 2012-05-21 (月) 18:05:18
  • フォローがないですね。Windows だから cp932 と短絡したわけではないのですが,あなたが *.Rnw を作るのに使ったエディタは encoding として何を仮定するのでしょうか?
    アップロードした fileexample-cp932.Rnw のエンコーディングは cp932 なので,これをダウンロードして Sweave してみたらどうなりますか?(当方で Windows でやったところではうまくいきましたが)。
    ところで,今更ながらですが「You can now run (pdf)latex on 'test1.tex' 」といわれているのだから,test1.tex は正常にできているんでしょうかね?
    「'test1.Rnw' has unknown encoding: assuming Latin-1 」というのは,Sweave が出したエラーメッセージだと思っていたのですが,違うのかな?
    -- 河童の屁は,河童にあらず,屁である。? 2012-05-22 (火) 10:46:26
  • お陰さまで解決できました。TeXのmediabb.styがインストールされておらず、それが原因(?)だったかもしれません。test1.tex は本文等の日本語がNAになっており正常ではありませんでした。「'test1.Rnw' has unknown encoding: assuming Latin-1 」というのは,Rstudioから「Compile PDF」をクリックしたときのメッセージです。Rstudioのオプションで"cp932"を指定しているのですが、今もこのメッセージがでます。RのコンソールからSweave(file, encoding="cp932")の実行だとうまくいくようになったので、解決とさせて頂きます。河童の屁は,河童にあらず,屁である。さん、 Ionaさん、どうもありがとうございました。 -- taked? 2012-05-25 (金) 16:24:17

アクセスログの解析は、Rでは面倒なのでしょうか?

tadashi? (2012-05-17 (木) 14:28:27)

Apacheのcombined形式のログをRで読み込んで処理しようと思っていますが、読み込んだあとの処理(正規表現)で結構苦労しています。rubyでやれば超簡単なのですが、Rでは非常に難しいのでしょうか? やりたいことは、IPアドレスやエージェントなどの項目への切り分けです。一行のアクセスログを綺麗に分解したいのです。非常に面倒かどうかを知りたいのです。

  • あなたにとってどの程度のことなら[非常に難しい」のか,誰にも分からないので,答えはないでしょう。
    R の正規表現 ? regexp や ? grep してみましたか?
    perl という引数は logical. Should perl-compatible regexps be used? Has priority over extended. なので,perl でできることは,R でもできるということでしょう。ruby と perl でどれくらい違うか(ruby がどれほど超簡単か)知らないので何とも言えないけど。
    ruby で超簡単にできるなら,なにも苦労して R でやる必要はないでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2012-05-17 (木) 18:44:19
  • 誰にもわからないかどうかもわからないので少し他の人の回答まってみます。 -- tadashi? 2012-05-18 (金) 01:38:15
  • 大抵のことはRubyでできるならRでもできますよ。
    お節介かもしれませんが言っておきますと、「誰にも分からない」というのはあなたのレベルを他の人は知らないから簡単かどうか判断できないということですよ。熟練者なら簡単にできるでしょうし、初心者なら苦戦するでしょう。それから、そのやりたいことはあなたの書き方ではよく知らない人には分からないかもしれませんよ。もう少し具体的に書かないと。
    具体的な内容がよく分かりませんが、おそらく、gsub, strsplit, do.call(rbind, ...)を使えばデータフレームにできると思います。 -- Iona? 2012-05-18 (金) 23:13:46
  • 他の人の回答として書きます。代替法(Ruby)があるならそちらを優先すべきです。おそらく、あなたの目的はRを使うことでなく、Rを使って何かを得ることだと思うからです。Rは使う物であって、使われるものではないと思うからです。 -- akira? 2012-06-15 (金) 23:02:35

epsファイルの作成でエラー

Toy? (2012-05-16 (水) 22:03:33)

Windows XPとWindows 7でR version 2.15.0を使用しています。
プロットのタイトルやラベルに日本語を使用して、これをepsファイルに保存すると、

警告メッセージ: 
1:  'mbcsToSbcs' 中の '繧ウ繝ウ繝励Λ繧、繧「繝ウ繧ケ' で変換に失敗: <e3>をドットで置き換えました
(以下略)

のようなワーニングが大量に出て、作成されたepsファイルを見ると、確かに日本語の部分がドットに置き換えられています。
これは、既知のバグなのでしょうか?
それとも、何か対処法があるのでしょうか?

  • 「バグだ」というのは失礼でしょうね。既知ではあります。対処法も,ここなどで検索すると見つかるでしょう。例えば,Windows 7, R 2.10.0 でのグラフ中の日本語 -- 河童の屁は,河童にあらず,屁である。? 2012-05-16 (水) 22:54:23
  • バグだなどと申し上げて、大変失礼しました。御指摘のとおり、毎回、Rの新しいバージョンをインストールするときには、r\etc\Rprofile.siteを書き換えていたのでしたが、今回、Ver 2.15.0をインストールした際に、なぜか書き換えを失念してしまっていました。それで、おかしな結果となり、これはVer 2.15.0に何か問題があるのかと邪推してしまったのでした。御迷惑をおかけして、申し訳ありませんでした。 -- Toy? 2012-05-17 (木) 21:37:35

地域R勉強会

tadashi? (2012-05-12 (土) 14:18:50)

いろいろあるみたいです。たとえば、札幌R勉強会とかあるみたいですが、情報ご存知のかた、教えてください。

ファイル出力の方法を教えて下さい。

のざわ? (2012-05-03 (木) 15:18:29)

soundと言うライブラリで、色々な音が作れる事が判りました。(だだしWindowsマシンだけ)。ここで質問なのですが、折角作ったサウンドファイルをファイルとして出力し保存したい場合のやりかたが判りません。ファイル出力の方法を教えて下さい。宜しくお願いします。

  • saveSample じゃない?オンラインヘルプくらい読もうよ。library(help=sound)でパッケージ内にどんな関数があるか分かるし,その後は ? 関数名 で説明が読める。 -- 2012-05-03 (木) 16:14:10
  • 調べたつもりが見落としていたようです。お陰様で解決しました。 -- のざわ? 2012-05-03 (木) 20:47:30

mimRのエラー

タカ? (2012-05-03 (木) 06:37:33)

いつもお世話になっております。
グラフィカルモデリングを行うために、mimRをインストールしたのですが、説明書通りに打ち込んでもエラーになってしまいます。

> data(carcass)
> gmd.carc <- as.gmData(carcass)
> m.main <- fit(mim(".", data=gmd.carc))
MIM returned NULL or NA, can not continue 以下にエラー   
strsplit(mimFormula, "/") :  文字列でない引数です 

原因を御存じの方がいらっしゃいましたら、ご指導いただけると助かります。
よろしくお願いいたします。

使用環境は、
R version 2.15.0 (2012-03-30)
Platform: i386-pc-mingw32/i386 (32-bit)

dataframeの変数名を変数で指定したい

タカ? (2012-04-29 (日) 21:24:21)

いつもお世話になっております。

データフレームを作成する際、変数名を他の変数で指定したいのですが、

> x #xはデータフレーム
  var
1   5
2   4
3   3
4   2
5   1
> y="var2" #変数名をvar2にしたい
> z=c(1,1,1,1,1)
> x=cbind(x,y=z)
> x
  var y
1   5 1
2   4 1
3   3 1
4   2 1
5   1 1


上のように変数名をvar2として追加したいのですが、yになってしまいます。
変数で指定することはできないのでしょうか?
よろしくお願いいたします。

  • これでどうでしょう -- tadashi? 2012-04-29 (日) 23:51:42
    > x
      var
    1   5
    2   4
    3   3
    4   2
    5   1
    > z=c(1,1,1,1,1)
    > x=cbind(x,var2=z)
    > x
      var var2
    1   5    1
    2   4    1
    3   3    1
    4   2    1
    5   1    1
  • 返答ありがとうございます。直接ではなく、変数を介して名前をつけたいのですが、方法はありますか? -- タカ? 2012-04-30 (月) 00:29:13
  • たとえば -- 2012-04-30 (月) 05:57:17
    > colnames(x) <- c("var",y)
    > x
       var var2
    1    5    1
    2    4    1
    3    3    1
    4    2    1
    5    1    1
    
    もっと簡単には
    > colnames(x)[2] <- "var2"
  • 返答ありがとうございます。colnames(x)[2]<-"var"を使ってやってみます。 -- タカ? 2012-04-30 (月) 11:12:23

テストデータ作成

tadashi? (2012-04-27 (金) 16:33:04)

POSデータの詳細行のようなテストデータをつくろうと思っています。簡単にRでできることなのでしょうか?ある範囲の文字列(orange,lemon,apple) があってそれに何個というのをランダムにつけます。下記のようなデータです。

orange 2
lemon 3
apple 5
lemon 2
apple 4

のようなサンプルデータです。for などつかわずにできそうな気がするのですが、できるのでしょうか?
やりたいことは、文字列一覧からランダムに文字列を選んで、それにランダムに自然数をわりあてます。Rだとなんかさくっと出来る方法があるような気がする気がしています。

  • sample 関数を使えばよいのでは。 -- 河童の屁は,河童にあらず,屁である。? 2012-04-27 (金) 17:09:03
    n <- 10
    Max <- 20
    Kudamono <- c("orange", "lemon", "apple")
    d <- data.frame(kudamono = sample(Kudamono, n, replace = TRUE), 
                    kosuu = sample(Max, n, replace = TRUE))
    こんな風なデータフレームが出来ますけど?
       kudamono kosuu
    1    orange    18
    2    orange     5
    3     apple     7
    4    orange     6
    5     lemon     1
    6     lemon    11
            :
  • 例えば -- 2012-04-27 (金) 17:13:05
    > X <- as.data.frame(table(sample(month.abb[1:5],1000,rep=TRUE)))
    > X
      Var1 Freq
    1  Apr  196
    2  Feb  220
    3  Jan  204
    4  Mar  191
    5  May  189
  • そういうデータなら,data.frame(Var1=month.abb[1:5], Freq=sample(1000/5,5)) なんかでいいわけだ。 -- 河童の屁は、河童にあらず、屁である。? 2012-04-27 (金) 20:04:18
  • ありがとうございます。sample 関数がキモですね。単純な集計まわりを詳しく書いた本ってあるんでしょうか -- tadashi? 2012-04-29 (日) 11:51:56
  • 間瀬先生のRプログラミングマニュアルをひととおり読めばわかるでしょう。 -- 2012-04-29 (日) 15:05:31
  • エクセルでは処理できない量のデータを扱いたいためにRを使う人にはまだまだ学習ハードルが高いですね。 -- tadashi? 2012-04-29 (日) 23:56:09
  • ExcelとRを比較することが無意味。Excelは表計算ソフトでRは統計解析環境。ソフトウェアの目的が異なるし、ジャンルが異なる。Rと比較するならSPSS, SAS, Stataのあたり。Excelと比較するならCalcやsc。小さなツールを組み合わせて大きな仕事をする方が効率がよい。ExcelからRに乗り換えるのではなくExcelとRの両方を使えばよい。 -- 2012-05-01 (火) 15:56:48

複数グループの散布図の回帰直線を描くには?

yamda? (2012-04-22 (日) 11:51:20)

例えば,1月〜12月に対し,変数A(90,86,88,82,75,67,55,46,36,21,17,10)と変数B(72,61,52,49,39,36,30,27,23,20,16,12)が与えられているときに,AとBの回帰直線を同時に描くにはどのようにすればよいでしょうか?ご教示いただけますと,幸甚です。

  • 変数 A と変数 B の組が 12 ヶ月ぶんあるのですか?例に挙げられた A, B の要素数が 12 というのは偶然? -- 河童の屁は,河童にあらず,屁である。? 2012-04-22 (日) 12:03:58
  • 早速のご返信ありがとうございます。変な書き方をしてしまいましたが,偶然ではありません。月(12ヶ月)を横軸,値を縦軸としてAとBプロットし,それぞれの回帰直線を描きたいと考えております。 -- yamda? 2012-04-22 (日) 12:50:51
  • ああ。そういうこと。ならば,
    A <- c(90,86,88,82,75,67,55,46,36,21,17,10)
    B <- c(72,61,52,49,39,36,30,27,23,20,16,12)
    x <- 1:12
    plot(x, A)
    abline(lm(A~x))
    points(x, B, col="red")
    abline(lm(B~x), col="red")
    でよいんじゃない? -- 河童の屁は,河童にあらず,屁である。? 2012-04-22 (日) 13:03:46
  • ご教示いただいた方法で描画できました。大変助かりました。どうもありがとうございます。 -- yamda? 2012-04-22 (日) 13:26:51

文字列とデータフレーム操作

hayashi? (2012-04-19 (木) 20:51:21)

変数名y1,y2,y3,y4,y5,.....y100 があり,"y1 + y4","y1 + y2 + y4 +y5"のような文字列が与えられたときに,文字列に出現した変数名をカウントしたいのですが,どのようにすればよいか教えていただけないでしょうか

最終的に欲しい結果は,次のような結果です

  y1 y2 y3 y4 y5....y100
1  1  0  0  1  0....0
2  1  1  0  1  1....0

df <- - data.frame(y1=0, y2=0, y3=0, y4=0, y5=0)
r1 <- "y1 + y4"
r2 <- "y1 + y2 + y4 +y5"
df
x1 <- c(1, 0, 0, 1, 0)
x2 <- c(1, 1, 0, 1, 1)
df2 <- rbind(df, x1)
df2 <- rbind(df2, x2)
df2
  • 左辺に現れる変数名も自動で取り込むというようにも出来ますが,取りあえずそこは手作業で
    要するに,eval(parse(text=プログラム片)) のようにすること... -- 河童の屁は,河童にあらず,屁である。? 2012-04-19 (木) 22:18:22
    > set.seed(123456789)
    > df <- as.data.frame(matrix(sample(0:1, 50, replace=TRUE), 10))
    > colnames(df) <- paste("y", 1:5, sep="")
    > df
       y1 y2 y3 y4 y5
    1   1  0  0  0  1
    2   1  1  1  1  1
    3   1  1  1  0  1
    4   1  0  0  1  1
    5   1  0  0  1  0
    6   1  0  1  0  1
    7   0  0  0  1  1
    8   1  0  0  0  0
    9   0  1  1  0  0
    10  0  1  1  0  0
    > r1 <- "y1 +y4"
    > r2 <- "y1 + y2 + y4 +y5"
    
    > func <- function(str) {
    + 	r1.e <- paste("rowSums(df[,", 
    +              paste("c(", 
    +              paste(
    +              paste("'", unlist(strsplit(str, " *\\+ *")), "'", sep=""),
    +                collapse=", "), ")", sep=""), "])", sep="")
    + 	return(eval(parse(text=r1.e)))
    + }
    
    > df2 <- df
    > df2$r1 <- func(r1)
    > df2$r2 <- func(r2)
    > df2
       y1 y2 y3 y4 y5 r1 r2
    1   1  0  0  0  1  1  2
    2   1  1  1  1  1  2  4
    3   1  1  1  0  1  1  3
    4   1  0  0  1  1  2  3
    5   1  0  0  1  0  2  2
    6   1  0  1  0  1  1  2
    7   0  0  0  1  1  1  2
    8   1  0  0  0  0  1  1
    9   0  1  1  0  0  0  1
    10  0  1  1  0  0  0  1
  • ありがとうございます.自分の思っているものと少し違うので補足させていただきます. 変数(列)は100列で一定です.文字列データが与えられるごとに,行にカウントの情報を追加したいです.-- hayashi? 2012-04-19 (木) 22:55:23
     r1 <- "y1 +y4",
     r2 <- "y1 + y2 + y4 +y5"
    
        y1 y2 y3 y4 y5
     1   1  0  0  0  1  
     (略)
     11(r1)  1  0  0  1  0  
     12(r2)  1  1  0  1  1  
     (以下続く)
  • > 文字列に出現した変数名をカウントしたい
    というのに,実際は,r1, r2 などに現れた変数の位置に 1 現れなかったら 0 を持つベクトルを行に追加したいということ??(まあ,例にはそのように書いてあるなあ) -- 河童の屁は,河童にあらず,屁である。? 2012-04-19 (木) 23:05:15
  • はい.r1, r2 などに現れた変数の位置に 1 現れなかったら 0 を持つベクトルを行に追加したいということです.説明が悪くすみません. -- hayashi? 2012-04-19 (木) 23:13:20
  • 最初から,そう説明してくれればよかったのに
    > ncol <- 5 # 後で,100 にしてね
    > func <- function(str) {
    + 	result <- integer(ncol)
    + 	x <- as.integer(gsub("y", "", unlist(strsplit(str, " *\\+ *"))))
    + 	result[x] <- 1
    + 	return(result)
    + }
    > 
    > r1 <- "y1 +y4"
    > r2 <- "y1 + y2 + y4 +y5"
    > 
    > df <- data.frame(matrix(func(r1), 1))
    > colnames(df) <- paste("y", 1:ncol, sep="")
    > df <- rbind(df, func(r2))
    > df <- rbind(df, func("y1+y3+y5"))
    > # あと,好きなだけ繰り返す
    > df
      y1 y2 y3 y4 y5
    1  1  0  0  1  0
    2  1  1  0  1  1
    3  1  0  1  0  1
    で,いいいですか?細かな仕様は自分で調整 -- 河童の屁は,河童にあらず,屁である。? 2012-04-19 (木) 23:24:44
  • どうもありがとうございました.お手数おかけしてすみませんでした -- hayashi? 2012-04-19 (木) 23:34:38

数値の最大表示桁数

BCD? (2012-04-19 (木) 18:42:45)

非常に桁数の大きな計算をしています。例えば以下のような計算式です。

> (1e+307)*(1e+307)
[1] Inf

しかしながら、計算の桁数が大きいと計算結果が全てInfになってしまい実際の数値を知ることが出来ません。どうすれば計算結果をInfでなく数値として表示させることができるのでしょうか?よろしければ御教授願います。

  • gmp パッケージなどを使えば可能でしょう。それでも,若干の工夫は必要になるでしょうが。 -- 河童の屁は,河童にあらず,屁である。? 2012-04-19 (木) 19:29:52
    # フィボナッチ数列の 10000 項目を求める--- 2090 桁の数値
    library(gmp)
    a <- b <- as.bigz(1) # この場合は as.bigq でも同じ
    for (i in 3:10000) {
    	c <- a+b
    	a <- b
    	b <- c
    }
    print(c)
  • 巨大もしくは微小な数を通常の数値計算で扱う定石は途中の計算を対数化することです.ただし,すでにinfとされてしまう数の対数をとっても,infにしかなりません.例えば二項係数は巨大になりがちですが,Rには lchoose という最初から二項係数の自然対数値を求める関数が用意されています. -- QDY? 2012-04-19 (木) 20:56:03
    > x <- lchoose(1000, 500) / log(10) # 1000から500を選ぶ二項係数の常用対数値
    > x
    [1] 299.4318271518637288864
    > 10 ^ (x - floor(x))
    [1] 2.702882409454304912799 # つまり 2.7028...e+299
  • 桁数という場合,純粋に全桁が必要な場合(整数)と大きな有効桁数が必要な場合(実数)があるということ。後者の場合には,大きな有効桁というのは普通は必要ない。いずれにせよ,計算したいものによって,やり方もいろいろあるということ。 -- 河童の屁は,河童にあらず,屁である。? 2012-04-19 (木) 22:25:51
    > library(help=gmp)
    > chooseZ(1000, 500)
    Big Integer ('bigz') :
    [1] 27028824094543656951561469362597527549615200844654828700739287510
    662542870552219389861248392450237016536260608502154610480220975005067
    991754989421969951847542366548426375173335616246407973788734436457416
    111949760457104498575628788051460099421942675236691585660313686260248
    4428109296905863799821216320
    なんて具合にね。

パッケージのインストールの不都合

さと? (2012-04-18 (水) 09:58:44)

4月から新しい環境で仕事を始めたのですが、インターネットに接続してRに新しいパッケージをインストールしようとしたところ、

> utils:::menuInstallPkgs()~
 --- このセッションで使うために、CRANのミラーサイトを選んでください --- 
 以下にエラー m[, 1L] :  次元数が正しくありません 

なるエラーメッセージが出てインストールができませんでした。以前の職場ではそのような不都合はなかったのですが、原因がわからず困っております。
新しい職場のシステム管理者はR使いではないので原因がわからなかったのですが、何か解決のヒントをご教授いただければ幸いです。

実行デモ

教師? (2012-04-15 (日) 23:05:22)

講義で一連のR命令を実行していく様子を,プロジェクターでスクリーンに映したいと考えています.命令を書いたソースファイルを読み込み,一行ずつ実行し,その都度解説をしたいと考えています.
何か適当な工夫,もしくはそれ用のパッケージをご存知なら教えてください.
例えば,par(ask=TRUE) でひき続く画像出力を段階的に出力するイメージです.

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

  • 画面に,コンソールとエディタを表示しておき,エディタにプログラムを読み込んで,一行ずつ選択/実行していけばよいでしょう。プログラムの全体が前もって見通せるという点でもよい選択だと思いますけど? -- 河童の屁は,河童にあらず,屁である。? 2012-04-15 (日) 23:25:54
    example.png
  • 行単位ではなくて式単位になってしましますが、evaluateを使って、library(evaluate); f <- function(x) invisible(lapply(x, function(y) {replay(y); invisible(readLines(n=1))})); f(evaluate(file("xxx.r"))) とか? -- 2012-04-16 (月) 01:41:59
  • 早速情報有り難うございます.河童さんのご提案は今一良くわからないのですが,お使いのエディターには選択した行をR端末で直に実行する機能があるのでしょうか.お二人目のご提案は,ほぼ私が希望しているもののようです.式単位で実行も,むしろ好都合です.コメント(行)も含め,まず命令(式)を表示してくれ,次にCRを押せば実行結果を表示してくれるのは嬉しいですね.私自身は実行ログファイルを適宜編集のうえ,エディターで表示することを考えていたのですが,初心者向けにはやはり「どうなるんだろう?」と想像させながら教えていくほうが効果的と考えました.これ以外にもおすすめがありましたらお教えください.こうした使い方は結構需要がありそうな気がするので,専用パッケージでもあるのかなと考えておりました. -- 教師? 2012-04-16 (月) 08:39:51
  • 上のお二人目のやり方を少し整理してみました.この方法はRを使った講義で役に立つと思います.感謝します. -- 教師? 2012-04-16 (月) 10:45:26
    > Demo <- function(x) {require(evaluate);invisible(lapply(evaluate(file(x)),
    +    function(y) {replay(y); invisible(readLines(n=1))}))}
    > Demo("L1.R")        # L1.R はR命令を羅列したテキストファイル
    +                     # (以下CRを押すごとに命令とその結果がR端末に)
    Time difference of -1.1 secs
    表示される)
    Loading required  north.ra package: evaluate
    > ### R のデータタイプ
    
    > x <- 1    # 数値(倍精度実数)
    
    > x
    
    [1] 1
    
    > (x <- 1) # 付値と結果の表示を同時に行う
    
    [1] 1
    
    > (xx = 2) # 付値のもうひとつの形式
    
    [1] 2
    
    (以下省略)
  • > お使いのエディターには選択した行をR端末で直に実行する機能があるのでしょうか
    R のエディタですがな。私は河童じゃないし。 -- 河童の屁は,河童にあらず,屁である。? 2012-04-16 (月) 11:10:27
  • Mac版のRのエディタでは、実行したい行にカーソルを持っていき、四つ葉マーク+リターンでその行だけ実行できますよ。 -- 2012-04-16 (月) 11:33:55
  • 質問者さんは、ふたつ下でWin版Rについて質問されたのと同じ方でしょうか。もしそうなら、Linuxをお使いとのことなので、emacs+ESSでカーソル行や選択範囲の実行ができますよね。ただ、学生向け講義において、ESSをバリバリ使ってコードを実行すると、最初は学生の方が戸惑われるかもしれませんが。(コピー・ペーストの過程が表面上みえないため。) -- 2012-04-16 (月) 12:43:56
  • emacs+ESSも検討しましたが,簡単な操作だけで順次実行することはできそうもない(?)ので諦めました.なお,上の Demo 関数の表示でいちいち空白行が入るのが煩わしいといえば言えますね(次々欲が出てきます).できるだけたくさん画面に出したいので.無論このほうが見やすくはあります.はて,evaluate 関数を弄ればなんとかなるのか.cat("\n") に相当する端末の出力行をひとつ上に戻す制御文字があるんでしょうか.昔Cプログラムでそんなことをやった記憶がありますが. -- 教師? 2012-04-16 (月) 14:00:11
  • ふーむ…ESSのC-c C-nとかも「簡単」ではないということになると、エディタを開いておいてコンソールに送る方式は軒並みダメということになりそうです。ようするに、最初の投稿でおっしゃっているとおり、「ただエンターを押し続けていけば式入力と結果が次々表示される」みたいなものをご所望ということですね。ただ、それだと「いったん前の式に戻る」とか「ちょっと変えてもう一回やってみる」みたいな融通がきかず、意外に不便かもという気もします。 -- 2012-04-16 (月) 16:42:15
  • コンソール出力をファイルに保存してそれをWord なりなんなりのテキストエディタで表示して,先頭から順に見せていけばよいでしょう。簡単至極。先の方は,ウインドウの外にあるんだから,生徒にはまだ見えない。 -- 河童の屁は,河童にあらず,屁である。? 2012-04-16 (月) 17:12:31
  • いちおう先のレスで「ログをみせるのはナシで」という指定がされているのですから、実際にオンラインで実行させながらみせる方法を考えるべきでは。(もちろん、そのやりかたでも確かに「どうなるんだろう?」という想像はさせられるでしょうが。)デモなんて結局半分はエンターテイメントというか、学生に「そうやって動くのか」と体感してもらうためのものなわけですし。ライブ感というか、実際にその場で実行していく様(コードのみならず作業している様子全体)をみせるというのも、くだらないようで重要な要素だと思います。 -- 2012-04-16 (月) 18:01:21
  • 建設的なコメントをせよとのことのようなので,
    debug 関数を使う。つまり,実行させたいもの全体を引数なし関数として定義し,debug 関数で,それを1センテンスずつ実行させる。実行結果も表示されるし,任意の時点で任意の変数の内容も提示できるし。先のコメントで示された Demo ではノーチェックの for ループなども,ちゃんとステップ実行できるし。ただ,debug で表示されるステートメントは,これから実行するステートメントなので,ちょっと戸惑うかもね。それと,この方法では,暗黙の print とか ( ) でくくる print の結果が表示されない。
    > func <- function() {
    + n <- 10
    + s <- 0
    + for (i in 1:n) {
    + 	s <- s+i^2
    + }
    + print(s)
    + }
    > debug(func)
    > func()
    debugging in: func()
     #1 の debug: {
        n <- 10
        s <- 0
        for (i in 1:n) {
            s <- s + i^2
        }
        print(s)
    }
    Browse[2]> 
     #2 の debug: n <- 10
    Browse[2]> 
     #3 の debug: s <- 0
    Browse[2]> 
     #4 の debug: for (i in 1:n) {
        s <- s + i^2
    }
    Browse[2]> 
     #4 の debug: i
    Browse[2]> cat(i, s)
     0
    Browse[2]> 
     #5 の debug: s <- s + i^2
    Browse[2]> 
     #4 の debug: i
    Browse[2]> cat(i, s, n)
    1 1 10
    Browse[2]> 
     #5 の debug: s <- s + i^2
    Browse[2]> 
     #4 の debug: i
    Browse[2]> 
     #5 の debug: s <- s + i^2
    Browse[2]> 
     #4 の debug: i
    Browse[2]> 
     #5 の debug: s <- s + i^2
    Browse[2]> cat(s)
    14
    Browse[2]> cat(i)
    4
    Browse[2]> c
     #7 の debug: print(s)
    Browse[2]> Q
    これはこれで,なかなか大変。 -- 河童の屁は,河童にあらず,屁である。? 2012-04-16 (月) 22:49:15
  • どうしても上のDemoじゃダメなの? -- 2012-04-16 (月) 23:27:09
  • demo関数だと途中で前に戻ったりできないので、Rエディターでカーソル指定で実行するほうが楽です。windowsならばCTRL+Returnです。 -- 経験者? 2012-04-17 (火) 09:39:19
  • 今更ですが、WindowsではCtrl+Rです。リターンキーではなく、「R」キーです。命令が実行されずに焦ったので念のため。 -- うらないし? 2012-10-10 (水) 19:41:40

ノンパラメトリックとパラメトリック的なモデルの比較

北原? (2012-04-13 (金) 18:09:05)

Rとより一般的な統計の質問かもしれません。
AICはパラメトリックモデルの比較に使う指数だと知っていますが、ノンパラメトリックとパラメトリックモデルの比較にはどのようなものが使えるんでしょうか(Rで計算できる指数の中で)?

よろしくお願いいたします。

Windows版Rのインストールガイドのおすすめ

教師? (2012-04-09 (月) 19:40:44)

今年度からRを使った講義を受け持つことになった理工系大学の教員です.もっぱら Ubuntu Linux でしかRを使った経験がないのですが,おそらく学生は Windows を使っているものが多いのではと考えています.Windows 版 (日本語化)Rのインストールは今ではほぼ自動化されているのでしょうか.それとも多少の手動による設定が必要でしょうか.Windows のバージョンでかなり違うのでしょうか.

Windows 版 R のインストールについて現在最も参考になるサイト,もしくは本を教えてください.この Wiki で見つかるインストール法が最良でしょうか.

よろしくお願いします.

  • そうだと思います。 -- 河童の屁は、河童にあらず、屁である。? 2012-04-09 (月) 20:44:31
  • Window7 64bit 版を試しにインストールしてみました.勝手に日本語表示されましたが,これ以上弄る必要はないと理解してよろしいですか.岡田さんが書かれたインストール法PDFではフォントを日本語フォントに後から変えるように指示がありましたが.VISTA,XPだとまた違うのでしょうか. -- 教師? 2012-04-10 (火) 00:31:15
  • R-2.14.2あたりのインストーラから、インストーラ自身の日本語化がされてます。ですので、最新版のRインストールでしたらWin用のインストーラをダウンロードしてダブルクリック連打で大丈夫です。 -- 名無し? 2012-04-10 (火) 10:12:45
  • 情報ありがとうございます.Windows版の日本語Rのインストールは結構面倒らしいという印象を持っていましたが,それは過去の話だったんですね. -- 教師? 2012-04-10 (火) 18:27:12

95% CI の算出について

Hiro? - 2? (2012-04-09 (月) 12:22:04)

cmprsk_2.2-1 を利用して、競合リスクを考慮したevent のCumulative incidence を下記のようなプログラムで計算しました。しかし、これですと 95% CI が計算されません。どのようなコマンドを加えるとよいでしょうか。ご指摘いただいたように実際のデータをつけて再投稿いたします。
どうかお願いします。

install.packages("cmprsk")
library(cmprsk)
MYDATA
(症例は25例で、days:観察期間、censor:eventあり=1、eventなし=0、競合リスク=2)
(下記データをexcel上に作成)
   days censor group
1     3      1     1
2     4      1     1
3     4      1     1
4     5      1     1
5     6      1     1
6     5      1     1
7    11      1     1
8     6      1     1
9     2      1     1
10   19      2     1
11   21      2     1
12    3      1     1
13    2      2     1
14    3      1     1
15    3      1     1
16    7      1     1
17   28      0     1
18    5      1     1
19    5      1     1
20    3      1     1
21    3      1     1
22    4      1     1
23    5      1     1
24    4      1     1
25    3      1     1

MYDATA <- read.delim(pipe("pbpaste"), header=TRUE) #(ここで上記excelデータをコピー)
Event <- MYDATA
Event$censor <- ifelse(MYDATA$censor == 1, 1, 0)
Comp <- MYDATA
Comp$censor <- ifelse(MYDATA$censor == 2, 1, 0)
Mixed <- MYDATA
Mixed$censor <- ifelse(MYDATA$censor == 1, 1, ifelse(MYDATA$censor == 2, 2, 0))
result <- cuminc(MYDATA$days, MYDATA$censor, MYDATA$group, cencode=0)
result2 <- timepoints(result, Event$days)
result2$"est"
                  2      3      4      5      6      7     11   19    21    28 (days)
group 1 0.04 0.32 0.48 0.68 0.76 0.80 0.84 0.84 0.84 0.84(目的とする事象の累積%)
group 2 0.04 0.04 0.04 0.04 0.04 0.04 0.04 0.08 0.12 0.12(競合リスク)
  • result の中に分散が入ってます("var").これから信頼区間を求める感じでしょうか. -- 2012-04-11 (水) 20:51:51
  • var は,適切な名前ではないけど,その平方根が標準誤差にあたる。しかし,統計量の差の標準誤差が sqrt(VAR1+VAR2) であるあたりまでは分かるけど,その後ごたごたがあるようなないような。 -- へのへのもへじ? 2012-04-11 (水) 21:49:25
  • なるほど。result2$"var"で分散を求め、SONO -- Hiro? - 2? 2012-04-11 (水) 22:18:00
  • result2$"var"でその時点での分散を計算し、95%CI=累積%+/- 1.96 x 標準偏差として計算しました。ありがとうございました。 -- Hiro? - 2? 2012-04-11 (水) 22:24:47

国勢調査をR化したけど、

tadashi? (2012-04-06 (金) 00:58:14)

windows 用のまずつくってみました。
http://www.e-stat.go.jp/SG1/estat/List.do?bid=000001034991&cycode=0
の1番目のです。
ダウンロードは下記からできます。解凍してから読み込んでください。
http://it.isogaya.co.jp/koku001.zip
文字コードがshift-jis ぽいので、Linux ,Mac では読めないと思います。共通して読めるようにするのはどうしたらいいのでしょうか?

> load("koku001.RData")
> names(koku001)
 [1] "地域コード"     "地域識別コード" "境域年次.2010." "境域年次.2000."
 [5] "地域名称"       "人口22"         "人口17"         "人口増減数"    
 [9] "人口増減率"     "面積"           "人口密度"      

下記は、全国の人口を求めています。全国の集計を除いて、都道府県で人口を集計しています。当たり前ですが、全国の集計と同じ結果になります。

t <- subset(koku001, 地域識別コード == "a")
t[1, 6]
t <-t[2:48,]
sum(as.numeric(t$人口22))
  • 元の CSV ファイルを a <- read.csv("001.csv", skip=9, fileEncoding="cp932", na.string="-", check.names=FALSE) で読めば済むのかな??と。
    先にも書いたけど,テキストファイルで配布するのが無難。そうすれば,fileEncoding を指定すれば,どのプラットフォームでもちゃんと読めるから。 -- 河童の屁は,河童にあらず,屁である。? 2012-04-06 (金) 11:21:35
  • いろいろ試してみたいので、よろしくお願いします。read.csv もいろいろ癖がありますね。 -- tadashi? 2012-04-06 (金) 11:36:31
  • Rで使うこと前提ならRDSの方がプラットフォーム気にせず読めますよ。cvsは未だに改行コードとか、encodingとか気にしないといけないのでむしろ面倒。 -- 2012-04-06 (金) 11:45:46
  • ようするに元ファイルを河童さんの方法で読み込んで、それをsaveしたできたRDSを配布すれば、loadするだけでどの環境でも問題なく読める(はず)、ということです。 -- 2012-04-06 (金) 11:50:50
  • readRDS saveRDS を使うのですね。検索しても余り情報ないみたい。。。 -- tadashi? 2012-04-06 (金) 13:21:09
  • 使う分には saveとloadで十分です。 -- 2012-04-06 (金) 18:47:44
  • MacOSXでも元のCSVファイルは読めるけど。他の書き込みもそうですが、何をしたいのか意図がわからないですね。CRANにデータを登録するつもりなのかな。 -- 2012-04-07 (土) 23:37:01

read.table での文中ダブルクオーテーションの処理

tadashi? (2012-04-05 (木) 17:57:36)

アクセスログをread.table で読み込んでいますが、結構トラブルが発生して取り込めなくなっています。簡素化すると下記のようになります。

"a"     "b"     "c"
"aa"a"  "bbb"   "ccc"

read.table(file = "test.tsv", sep = "\t", header = TRUE) 

で読み込むと、

In read.table(file = "test.tsv", sep = "\t", header = TRUE) :
  'test.tsv' の readTableHeader で不完全な最終行が見つかりました

というメッセージがでます。データ作成をRuby でやっているので、そこで処理すればいいともいえるのですが、R の中ではダブルクオーテーションがはいっていて読み込みエラーがでるのは、どうやって処理するのが、よく行われているのでしょうか? 

  • その警告メッセージはquotationとは無関係で、通常は無視してOKです。 read.table(..., quote=NULL) としてやればquotationごと読み込みます。 -- 2012-04-05 (木) 18:07:45
  • え、通常は無視してオッケーなんですか。。。  -- tadashi? 2012-04-05 (木) 21:59:33
  • 不完全な最終行の警告は読み込んだファイルの最後が改行で終わっていないということを言っているだけです。正しく読み込めるので無視しても大丈夫です。 -- Iona? 2012-04-09 (月) 05:19:15

衆議院小選挙区と国勢調査のdataset

tadashi? (2012-03-26 (月) 00:17:16)

公開されているデータから、いろいろ面白い分析ができると思っています。衆議院小選挙区と国勢調査を結びつけて分析するような動きは日本であるのでしょうか? 現在、Rで小選挙区と国勢調査の地域コードをリンクしたRのdataをつくりました。こういったことに興味ある方はいらっしゃるのでしょうか?

  • なかなか興味深そうなデータですね -- okinawa 2012-03-27 (火) 21:20:21
  • dataencoding はなんなんでしょうかね?読んでみることもできませんでした。by Mac. -- 河童の屁は,河童にあらず,屁である。? 2012-03-27 (火) 22:19:46
  • ふつうにloadで読めるよ by Mac -- 2012-03-27 (火) 23:19:33
  • encoding UTF-8 です。公開データをRで扱いやすくするのは統計データ活用の可能性を広げる気がします。 -- tadashi? 2012-03-27 (火) 23:23:33
  • 45回の選挙結果のPDFがあるのですが、データ化が簡単にできないでしょうか。はてなで質問中です。http://q.hatena.ne.jp/1332894203 -- tadashi? 2012-03-28 (水) 10:53:49
  • PDFは画像でなくTEXTで作られていますか? -- okinawa 2012-03-28 (水) 18:00:57
  • Acrobat(Proで確認)を用いてhtmlで書き出したものを、Excelで読み込むことができます。 -- 2012-03-28 (水) 18:20:03
  • 質問はキャンセルされたのか,見えないですね。
    > データ化が簡単にできないでしょうか
    どのように「簡単化する」というのか分かりませんが,処理の過程も含めて文書化するなら,Sweave で処理する Rnw で書けばよいのでは?必要とする人が個々で Sweave&タイプセットしてもたかがしれているし,手順を含めて結果を示すという上ではベストでは?Acrobat とか Excel とかには極力依存しない方がよいでしょう。また,データについても,そのデータをどのように読み込むかを明示する方がよいでしょう。また,load は,あなたの場合は信用してよいでしょうが,よく分からないものを load するのは気持ち悪いです。効率的なものを考えたのでしょうが,テキストエディタでも内容を確認できるように read.table で読めるテキストファイルとして用意する方がモアベターかも。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-28 (水) 20:39:44
  • まずは、実験的な状況なので手軽にいきたいと思っています。しばらくは、load でいきます。PDFは、http://www.soumu.go.jp/main_content/000037488.pdf これです。ソースネクストの PDF to data でエクセル化もまずは試みてみます。 -- tadashi? 2012-03-28 (水) 21:56:50
  • このPDFは人手を入れずに整形は無理でしょう。本来は総務省が、機械可読な形式で提供するべきだと思いますが・・・。河童さん、loadで読むのとテキストエディタで読むのでどういう違いがありますか?気持ち悪いとは? -- 2012-03-28 (水) 22:46:23
  • 素性のよく分からないファイルは開きたくない。開くにしても,テキストエディタで中身が分かるようならば,まあ,開いてもよいかなとか,開く必要はないなあと判断できる。というように,思っています。誤解かもしれないけど。
    > 選挙結果のPDFがある お使いのエディターには選択した行をR端末で直に実行する機能があるのでしょうかのですが、データ化が簡単にできないでしょうか
    ああ,pdf ファイルからテキストデータを取り出すということなんですね。このファイル形式だと無理っぽい。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-28 (水) 23:04:21
  • > ふつうにloadで読めるよ by Mac
    そうですか。と,読んでみましたが読めませんね。何でだろう?
    > (e <- load("e"))
    [1] "shu45"
    「テキストエディット」で読んでみたけど,
    error.png
    になった。
    > encoding UTF-8 です。公開データをRで扱いやすくするのは統計データ活用の可能性を広げる気がします
    UTF-8 でもないようだが??
    また,テキストファイルでないことも明らか。
    error2.png
    R に限らず,もっとも扱いやすい汎用的なデータ形式はテキストファイルだと思いますけど。また,ファイルの内容とか,どのようにして読むとかの最小限の情報がないと,そもそも読んでみようかなど怖くてできない。
    読めるはずといわれて読んでみて読めないと,何かよからぬことが起きたかと疑ったり?? -- 河童の屁は,河童にあらず,屁である。? 2012-03-28 (水) 23:10:34
  • 思ったより人気ありそうですね。なんで先行してやっている人がいないのでしょう。気になります。 -- tadashi? 2012-03-29 (木) 00:27:17
  • いや、それ読めてますよ。>河童さん。 詳しくは ?loadを。R上でloadするだけなら、超馬鹿でかいファイルとかで処理が止まるくらい以外に、良からぬことが起きるなんてことはないでしょう。 -- 2012-03-29 (木) 11:29:53

パワースペクトルの両対数図

北原? (2012-03-21 (水) 21:39:27)

Rの初心者のものです。
Rでパワースペクトル解析(spectrum)を行い、plotで図を描いています。ところで、横軸(x軸)も対数をとった図にしたいんですが、どうすればいいんですか?
教えてください。

  • 実際に呼ばれるのは plot.default かな?オンラインヘルプを見ると,
    log 引数の説明で a character string which contains "x" if the x axis is to be logarithmic, "y" if the y axis is to be logarithmic and "xy" or "yx" if both axes are to be logarithmic. とあるんだから,log = "xy" とすればよいのでは。どうなるのか,やってみれば??
    以下は,y = x^2 を,普通の軸,片対数軸,両対数軸で描いたもの。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-21 (水) 21:47:09
    loglog.png
  • 早速のご回答どうもありがとうございました。しかし、spectrum(またはspec.pgram)関数の場合、答え通りにできません。plotのdefaultが "yes","dB","no"しかなさそうです。 -- 北原? 2012-03-22 (木) 09:08:11
  • spectrum の返すオブジェクトを str 関数で確かめれば,自分で plot 関数(実際には plot.default が呼ばれる)を使えば良いのです。
    layout(matrix(1:2, 1))
    spg.out <- spectrum(UKgas, method="ar")
    plot(spg.out$freq, spg.out$spec, log="xy", type="l")
    layout(1)
    これにより,以下の図が描かれます。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-22 (木) 09:54:12
    loglog2.png
  • なるほどですね。ありがとうございました。ついてにもう一つ質問します。両対数図はうまく描いたんですが、95%信頼区間を表すバーが見えません。あれも描けるでしょうか? -- 北原? 2012-03-22 (木) 10:12:21
  • > 95%信頼区間を表すバーが見えません。あれも描けるでしょうか?
    そこまで(それ以上)望むならば,spectrum での実際の描画は plot.spec 関数がやるので,plot.spec 関数を改造するか,それを参考にあなた用の描画関数を書くかすれば,「何でもできます」。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-22 (木) 10:22:58
  • plot.spec関数を用いていろいろやってみます。ありがとうございました。 -- 北原? 2012-03-22 (木) 11:24:22

三次元座標の移動について

順天太郎? (2012-03-21 (水) 09:30:32)

R 及び数学には初心者です。
質問させていただきます。
幾つかの点がxyz座標上にあります。
その点を P (1,2,3), Q (3,-2,4), R (-,2.-5, 8), 1:5, sep=, S(-2,4, 8), T (-2,-4, -3)とします。
あるxyz軸に対してか平面”(平面Aとする)を設定し、その平面がA1x + B1y + C1z + D1=0とした時、A1 = -0.01、B1 = 0.05, C1= -0.03, D1 =1 すなわち  -0.01x + 0.05y – 0.03z + 1 = 0で表されるとします。
2. 座標(?)全体を回転し、平面Aが平面xyと重なり、かつP, Q, Rの三点の中心を通る様にしたいです。(平面A’)。
3. この回転運動を行ったとき、上記P,Q,R,S, Tの新しい位置はどの様になるでしょうか?またその式はどの様に求められるのでしょうか。
 宜しくお願いたします。
 順天太郎

  • その質問はRとどのように関係があるのでしょうか。答えてくださる方がいるかもしれませんが,数学の質問を受け付けているサイトを探してそこで質問なさった方がいいかと思います。 -- Iona? 2012-03-26 (月) 03:28:09

igraphを用いたグラフ化

パン屋? (2012-03-20 (火) 20:57:18)

こんばんは。
igraphを用いてグラフを書きました。

c1 <- c("a", "a", "a", "b", "b", "c")
c2 <- c("b"," c", "d", "c", "d", "d")
c3 <- c(5, 10, 1, 0, 100, 20)
tmp1 <- data.frame(c1 = c1, c2 = c2, c3 = c3)
library(igraph)
tmp2 <- graph.data.frame(tmp1[1:6,], directed = F)
E(tmp2)$weight <- c3
print(tmp2, e = TRUE, v = TRUE)
plot(tmp2, vertex.label = V(tmp2)$name,
     layout = layout.fruchterman.reingold,
     edge.label = E(tmp2)$weight)

としたのですが、重み(c3)が結果に反映されてないようです。どのようにしたらよいかご教授いただけないでしょうか。よろしくお願いします。

R version 2.14.2 (2012-02-29)
Platform: i386-pc-mingw32/i386 (32-bit)
other attached packages:
[1] igraph_0.5.5-4
  • 重みを線の太さで表したいなら引数に edge.width = c3(または edge.width = E(tmp2)$weight)を追加する。 -- 2012-03-21 (水) 06:23:08
  • ありがとうございます。重みを線の長さで表す場合どうしたらいいのでしょうか。上記のプログラムでは線の長さが同じように見えます。 -- パン屋? 2012-03-21 (水) 08:00:44
  • 二次元ユークリッド空間では,任意の点群を任意の長さの線分で繋ぐことは不可能でしょう。点間の類似度行列を用意して Principal Coordinate Analysis などをすれば,多次元空間を 2 次元に射影した図が描けるかも。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-21 (水) 08:46:43
  • なるほど、そう言われればそうですね。だから多次元尺度構成法のような手法が存在するのですね。。 -- パン屋? 2012-03-21 (水) 10:57:26

mtext で空白を挿入

サワボノリ? (2012-03-16 (金) 23:49:52)

こんにちは。

plot(0, xlab="")
mtext(side=1, at=0.8, text="panda score=0", line=-4, adj=1)
mtext(side=1, at=0.8, text="cat score=1+", line=-5, adj=1)

とした時に 0 と 1 が揃うように表示したいのですが、やり方がわかりません。family="mono" であれば "panda score=0 " とするだけで良いのですが、 family="sans" の時はそうシンプルにはできません。
"+" と同じ幅の空白を挿入する方法がありましたら教えてください。
latex の \phantom{+} と同じようなものはないのでしょうか?

  • 直接の回答ではありませんが、私のやり方を紹介します。Rの凡例の記述能力は限られています。もし Latex を使っているのなら、 overpic.sty を使ってみてはどうでしょうか。これを使えば、任意の Latex 表現を画像の任意位置に重ね書きできます。今の場合は tabular 環境を重ね書きすれば等号、数字を自由に整列できます。一以下に、例をあげておきます。\rule 命令は枠線との隙間を調整しています。 -- 2012-03-17 (土) 11:10:30
    \begin{overpic}[
        bb= 0 0 504 504, trim=30 30 30 50, 
        width=0.48\linewidth, height=0.48\linewidth,   
        clip]{abc.eps}
       \put(65,35){\tiny
         \begin{tabular}[t]{|lcr|}                  \hline
           ○:ABC\rule[0pt]{0pt}{5pt}  &$=$ & 0  \\
           △:DEF\rule[-2pt]{0pt}{5pt} &$=$ & +1 \\\hline
         \end{tabular}}
    \end{overpic}
  • ありがとうございます。さっそく試してみます。 -- サワボノリ? 2012-03-17 (土) 13:12:49
  • 以下のようにすれば、等号の位置をあわせることは可能ですよね。
    mtext2 <- function(string, at, ...) {
      eq <- regexpr("=", string)
      len <- strwidth(substring(string, eq+1))
      mtext(text=string, at=at+len, adj=1, ...)
    }
    plot(0, xlab="")
    mtext2("panda score=0", 0.8, side=1, line=-4)
    mtext2("cat score=1+", 0.8, side=1, line=-5)
    このままでは汎用性がありませんから(等号がふたつ以上あるとおかしくなるなど)、あとは必要と実際の使用環境に応じて例外処理などをつけたせばよいかと。 -- 2012-03-17 (土) 23:20:20
  • そろえたい = の右側の幅を計算して、右揃えの位置を調整するということですか。大変勉強になりました。 -- サワボノリ? 2012-03-18 (日) 00:58:45

system()のスペース処理について

Cent? (2012-03-13 (火) 13:43:33)

こんにちは。Ceut OS 5.1, R 2.13.2を使用しています。

名前にスペースが含まれているディレクトリにsystem()でunixコマンドを実行したいのですが、スペースが邪魔でエラーになってしまいます。簡素化した例を挙げると

#"aaa bbb"というディレクトリにUNIXコマンドを実行する
dir_name <- "aaa bbb"
dir.create(dir_name)
path <- paste(getwd(),"/",dir_name, sep="")
system(paste("ls ",path," > ",path,"/ls_res.txt",sep=""))

この場合、以下のエラーメッセージが表示されます。

ls: bbb: そのようなファイルやディレクトリはありません
ls: bbb/ls_res.txt: そのようなファイルやディレクトリはありません

gsub()でディレクトリ名の"aaa bbb"の半角スペースをエスケープしてからsystem()に渡せば良いと思ったのですが、

gsub("aaa bbb","aaa\ bbb",path)

gsub("aaa bbb","aaa\\\\ bbb",path)

としてみましたが、 "/root/aaa\ bbb"という文字列をつくり出すことができません。どのようにすればsystem()で処理できるでしょうか?

宜しくお願いします。

  • パスを ' でくくってやればよいです(ダブルクオート " でくくっても同じだけど,あなたのプログラムを一番簡単に直すには ')。
    プロンプトでやってみれば分かりますが
    % ls aaa bbb
    ls: aaa: No such file or directory
    ls: bbb: No such file or directory
    はだめだけど,以下の2つはちゃんと動く
    % ls 'aaa bbb'
    xxx.txt	     test99.dat     test99.txt     test99.log
    % ls "aaa bbb"
    xxx.txt	     test99.dat     test99.txt     test99.log
    これが理解できれば,R から system 関数を使って操作するのも同じこと。
    具体的には以下の通り。
    dir_name <- "aaa bbb"
    dir.create(dir_name)
    path <- paste(getwd(),"/",dir_name, sep="")
    system(paste("ls '",path,"' > '",path,"/ls_res.txt'",sep=""))
    つまり,あなたのスクリプトで system に渡される文字列は
    > paste("ls ",path," > ",path,"/ls_res.txt",sep="")
    [1] "ls /foo/bar/aaa bbb > /foo/bar/aaa bbb/ls_res.txt"
    なのですが, ' を挿入した文字列は以下のようになるのです。
    > paste("ls '",path,"' > '",path,"/ls_res.txt'",sep="")
    [1] "ls '/foo/bar/aaa bbb' > '/foo/bar/aaa bbb/ls_res.txt'"
    で,こうやって ' でくくられていればパス名に空白を含んでいても構わない。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-13 (火) 17:15:14
  • ありがとうございました。
    シングルクォーテーションとダブルクォーテーションはどちらも同じものという認識でしたが、このような使いわけのために存在していたのですね。
    追加で質問させて頂きたいのですが、変数pathを"'path'"と実行するとシングルクォーテーションはただの文字として認識され"'path'"と出力されますが、'"path"'と実行すると"\"path\""と出力されます。
    最初の'が"\に、最後の"'が\""になったように見えるのですが、なぜこのように出力されるのでしょうか? -- Cent? 2012-03-13 (火) 19:21:40
  • " と ' の関係は,詳しい説明もあります。本来はどちらかの内部では別のものを使うことができるということですが,より詳細な規則があるということですね。?"'" でオンラインヘルプを見ることが出来ます。その中に,Single and double quotes delimit character constants. They can be used interchangeably but double quotes are preferred (and character constants are printed using double quotes), so single quotes are normally only used to delimit character constants containing double quotes. と書かれています。
    なお,あまり &br;を多用しない方が読みやすい記事になると思います。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-13 (火) 21:14:06
  • ありがとうございました。オンラインヘルプまであるとは驚きです。勉強になりました。 -- Centos? 2012-03-14 (水) 08:40:51

行単位の随時処理

SAS ユーザ? (2012-03-10 (土) 14:10:23)

Rで行単位にテキストファイル※を読み込み随時処理を行うことは可能でしょうか?
目的は一度にメモリに乗り切らないような大量データの処理です。
AWKやSASのデータステップをイメージしています。
readlines、及びscanは一度に全ファイルを読み込みに行くので目的に沿いません。

※可能であればデータフレームに対しても同様の処理を行いたいです。

  • readLines/scanで読み込み行数を指定すればいいんじゃなかった? -- 2012-03-10 (土) 14:49:10
  • 2回目以降も毎回先頭からn行読むだけなのでだめっぽい。 -- 2012-03-10 (土) 15:14:39
  • ファイルが read.table で読める構成ならば,read.table の skip と nrows を適正に使えば目的がかなうだろう。
    しかし,これも所詮は目的行を読むために,毎回先頭から不要部分を読み飛ばすわけで,非効率この上ない。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-10 (土) 15:32:56
  • HDの容量が十分あるのなら,最初にファイルを連番ファイル名で行毎に分割しておけば良いのでは.そうしたファイル分割の方法はネットで検索すれば色々見つかります. -- 2012-03-10 (土) 20:38:42
  • あまりニーズは無いのでしょうか。目的に沿う直接的な方法はなさそうですね。事前ファイルの分割は、今流行の並列処理に通じますね(違うか)。みなさんありがとうございました。 -- SAS ユーザ? 2012-03-11 (日) 18:11:08
  • >2回目以降も毎回先頭からn行読むだけなのでだめっぽい。 いやいや、そんなことはない。 -- 2012-03-11 (日) 18:27:07
  • f <- file("hoge"); open(f); readLines(f, 1); readLines(f, 1); で。 -- 2012-03-11 (日) 18:35:53
  • なるほど。file関数の返り値はファイルディスクリプタで、現在の位置ポインタ情報も持っている。そしてreadLinesはその情報を元にファイルを処理するから、行単位の処理をしてもそこまで効率悪くないということですか。勉強になりました。ありがとうございます。 -- SAS ユーザ? 2012-03-11 (日) 20:07:18

データフレームの繰り返し処理

tadashi? (2012-03-09 (金) 17:36:51)

アクセスログをRで分析するために、データフレームの繰り返し処理をしたいのですが、ある程度、詳しく書いたページはないでしょうか?
for (適当な変数名 in データフレーム) { データフレーム名$変数 etc}
で使えるようなのですが、普通は使わないのでしょうか?

  • 抽象的な話ではなく,こういう風なデータをこういう風なプログラムでやってみたらうまくいかないのだけどどうしたらよいでしょうかとか,うまくいくのだけどもっと速度を上げるにはどうしたらよいでしょうかというような,具体的な質問でないと答えきれないでしょう。
    それ以前の問題なら,もう少しRを勉強してからと言うことになるかも知れない。
    「普通は使わない」の「普通」とはどの程度かとか,普通でなくても正確な答えが出れば何の問題もないといこともあるでしょう?
    for (file.name in c("a.dat", "b.dat", "c.dat")) {
    	x <- read.table(file.name)
    	x を使った処理
    }
    としてもよいし,処理の部分を関数にして
    処理 <- function(ファイル名) {
      処理の実体
    }
    実際の実行はそれぞれのファイルに対してということで
    sapply(c("a.dat", "b.dat", "c.dat"), 処理)
    とやってもよいだろう。後者の場合は,試験的にというか,少数個のデータについて,
    処理("foo.dat")
    などということが出来るということだろう(前者でも出来るけど,for の中を書き換えなきゃならん)。
    ということがわかると,このようなことは別にたいしたことではないので,わざわざ「詳しく書いたページ」を必要とするものではない,従って,そのようなページは探しても見つかる可能性は少ないということが理解できるのではないだろうかな? -- 河童の屁は,河童にあらず,屁である。? 2012-03-09 (金) 21:46:42
  • いろいろやり方があるんですね。ありがとうございます。 -- tadashi? 2012-03-09 (金) 23:40:06 いろいろためしてみたら、こんなことができるのですね。
    paste の部分 if (t$a1 != t$a2 ){1}else{0} のようにして、a1 != a2 だったら、1 をたてたいのですが、どう書くといいのでしょう。
    > data.frame(t$a1,t$a2,paste(t$a1,t$a2))
      t.a1 t.a2 paste.t.a1..t.a2.
    1    a    a               a a
    2    b    c               b c
    3    c    b               c b
  • R では,論理演算の結果は TRUE/FALSE となりますが,それを数値演算に使うときには 1/0 にみなされます。したがって,「a1 != a2 だったら 1」とするには (a1 != a2)+0 とするのがよいでしょう。無駄なように見えますが,別法 ifelse(a1 != a2, 1, 0) より効率がよいのです。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-10 (土) 10:14:05
  • 残念うまくいきません。論理演算は使えないのでしょうか
    > data.frame(s21$seq,s21$ip,s21$ip1,(s21$ip != s21$ip1 )+0)
    以下にエラー Ops.factor(s21$ip, s21$ip1) :  因子の水準セットが異なっています
    できた。式の間に空白をいれてはいけないのですね。
    > data.frame(t$a1,t$a2,result=(t$a1!=t$a2)+0)
      t.a1 t.a2 result
    1    a    a      0
    2    b    c      1
    3    c    b      1
    > t<-data.frame(a1=c('a','b','c'),a2=c('a','c','b'))
    > data.frame(t$a1,t$a2,result=(t$a1!=t$a2)+0)
      t.a1 t.a2 result
    1    a    a      0
    2    b    c      1
    3    c    b      1
  • 投稿欄の上にリンクがある投稿における注意事項を読んでください。書式に反した書き込みで掲示版が乱れます。
    > 式の間に空白をいれてはいけないのですね。
    そんなことはありませんよ。エラーの原因はそこではありません。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-10 (土) 12:32:40
  • すみません。どこが書式に反しているのでしょうか? わからないので教えてください。 -- [[ta- rbind(df, func(r2))
    dashi]] &new{2012-03-10 (土) 21:07:14};
  • 一番の問題は,「編集画面」で記事を書いた(もしくは,編集時に投稿者名,投稿日時を消去した)こと。そのほかは私が整形したので,悪いところはなくなっています。投稿直後に確認しましたか?それと違っているところが直したところです。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-11 (日) 07:46:24
  • おっと、編集画面で記事を書いてはいけないのですね。失敗の時に編集で消せるとあったので -- tadashi? 2012-03-11 (日) 09:36:02
  • それから、コメント欄では、wiki の書式が使えないので、コメント挿入後に、編集を使うということなのでしょうか -- tadashi? 2012-03-11 (日) 09:38:54
  • read.table で読み込むときに因子化されるのが問題でした。 -- tadashi? 2012-03-11 (日) 18:52:41
  • なんとかできるようになりました。
    やりたいことは、1行ずらして並べて、ipアドレスがかわるとことにフラッグをたてることです。
    fr='20111010.tsv'
    文字での読み込みにして、因子化を避けます。
    as.is=c(TRUE) は、一個だけだと文字列を全部そのまま文字列にするようです。
    log<-read.table(
    file=fr,header=FALSE,sep="\t",as.is=c(TRUE))
    通常のログの形式の先頭に、unix timestamp などをつけています。
    names(log)<-c(
    "utime","yyyy","mm","dd","hour","minute","second",
    "ip","identd","user","datetime","request","code",
    "bytes","referer","agent")
    ip と時刻で並べ替え、
    t<-order(log$ip,log$utime)
    log<-log[t,]
    ip,utimeを切り出します。この時点で、因子化されてしまいます。
    s1<-data.frame(ip=log$ip,utime=log$utime)
    s2<-data.frame(ip=log$ip,utime=log$utime)
    t<-data.frame(ip="999.999.999.999",utime=0)
    ずらして並べます。
    s2<-rbind(s2,t)
    s2<-s2[-1,]
    t<-nrow(s1)
    s1<-cbind(seq=1:t,s1)
    s2<-cbind(seq=1:t,s2)
    names(s2)<-c('seq','ip1','utime1')
    s12<-merge(s1,s2)
    因子をcharacter に戻します。
    s12$ip<-as.character(s12$ip)
    s12$ip1<-as.character(s12$ip1)
    ip アドレスが変わるところに 1 をたてます。
    s12$test<-(s12$ip != s12$ip1)+0
    head(s12)
    
      seq             ip      utime            ip1     utime1 test
    1   1   114.80.93.71 1318209476   114.80.93.71 1318209532    0
    2   2   114.80.93.71 1318209532   114.80.93.71 1318209532    0
    3   3   114.80.93.71 1318209532 119.235.237.16 1318186208    1
    4   4 119.235.237.16 1318186208 119.235.237.16 1318207179    0
    5   5 119.235.237.16 1318207179 119.235.237.19 1318187392    1
    6   6 119.235.237.19 1318187392 119.235.237.19 1318257867    0
  • かなりよくなりましたね。ただ、これは、マニュアルにも記載されていないことですが、投稿記事中に空行(先頭文字だけが空白である行とは違う)があるとインデントがマイナスになる(記事の文章が左にはみ出す)ということになります(今の状態で存在する空行を削除するとそれが解除されることが分かるでしょう)。「そんなこまかいこといいじゃないか?」まあ。そうですね。私の Wiki でもないのだしね。
    それと,これも細かいことだけど,投稿記事中で強制改行する(~を挿入する)ことの是非もあるでしょうね。-- 河童の屁は、河童にあらず、屁である。? 2012-03-11 (日) 20:22:31
  • pukiwiki が使えないと質問するのは大変ですね。エクセルしかやったことがない人があRを使おうとするとまだまだハードルは高いですね。 -- tadashi? 2012-03-11 (日) 20:44:24
  • > pukiwiki が使えないと質問するのは大変ですね
    このWikiの持ち主でもないので,こんな事を言う資格もなにもあったもんじゃないので。ある程度は気にして頂ければとは思いますけど,べつに普通に質問して頂ければよいですよ。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-11 (日) 20:49:06

集計表の作成

のす? (2012-03-09 (金) 06:21:30)

よろしくお願いします

   A  B  C  D
1 赤 青 黄 白
2 赤 黄 白 白
3 青 白 白 黒
4 白 黄 赤 黒
5 黒 白 青 青
6 赤 赤 赤 赤

このような表から

   A B C D
赤 3 1 2 1
青 1 1 1 1
黄 0 2 1 0
白 1 2 2 2
黒 1 0 0 2

このようなクロス集計表を得たいのですが、どのようにしたら出来るのでしょうか。
いままでtableを使って列ごとに処理した後、エクセルで成型していました。

環境は Win7 64, R2.14.1です。

  • データフレームを d として,以下のようにすればよいでしょう。行の順番が指定したとおりでなければというなら,プログラム中の levels 引数へ明示すればよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-09 (金) 10:39:04
    > sapply(lapply(d, factor, levels=names(table(sapply(d, levels)))), table)
       A B C D
    黄 0 2 1 0
    黒 1 0 0 2
    青 1 1 1 1
    赤 3 1 2 1
    白 1 2 2 2
  • 別解。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-09 (金) 12:13:31
    > a <- data.frame(color = c(sapply(d, factor)),
    +                 group = rep(LETTERS[1:4], each=6),
    +                 count = rep(1, 24))
    > xtabs(count ~ color + group, a)
         group
    color A B C D
       黄 0 2 1 0
       黒 1 0 0 2
       青 1 1 1 1
       赤 3 1 2 1
       白 1 2 2 2
  • ありがとうございます。いろいろと試しているますが、理由がわからないことがあるので教えてください。
    最初に教えていただいた方法では、データによっては
    以下にエラー table(sapply(d, levels)) : 
      全ての引数は同じ長さでなければなりません
    というエラーが出力されるのですが、理由がわかるでしょうか。データに問題があるかと思い、いろいろと試していますが、規則性がよくわかりません。-- のす? 2012-03-09 (金) 15:34:06
  • 理由?引数の長さが違うということなのでしょう。データはあなたが持っているので,エラーが出る最小限のデータと共に提示すれば原因はわかるでしょう。
    なお,投稿における注意事項を読んでいないようで,不適切な投稿様式で困ります。自己流ではダメですよ。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-09 (金) 17:21:17
  • そうですね。ありがとうございました。 -- のす? 2012-03-10 (土) 05:20:21
  • エラーの解析の結果はどうだったでしょうか?
    ヒマだったので,こちらでもやってみました。エラーはかなり頻繁に出ますね。そのような状況を考慮していない,バグありプログラムだったことが判明しました。
    以下のようなデータがエラーを引き起こします。
       A  B  C  D
    1 黄 黄 赤 黄
    2 黄 黄 白 青
    3 白 黄 赤 白
    4 赤 黄 黄 白
    5 赤 黄 黒 白
    6 黄 黄 白 黒
    エラーが起きる原因は,sapply(d, levels) の結果得られるリストの要素数が異なるということです。
    > sapply(d, levels)
    $A
    [1] "黄" "赤" "白"
    
    $B
    [1] "黄"
    
    $C
    [1] "黄" "黒" "赤" "白"
    
    $D
    [1] "黄" "黒" "青" "白"
    つまり,この例だと A の要素数は3,B の要素数は 1,C,D の要素数はともに4というようになっているのがまずく,この結果に table 関数を作用させると,
    > table(sapply(d, levels))
     以下にエラー table(sapply(d, levels)) : 
       全ての引数は同じ長さでなければなりません 
    というエラーが出てくるのですね。
    そして,なぜ,そういうエラーがでるのだろうと思って,以下をやってみてびっくりしました。
    > table(list(a=c("a", "b"), b=c("a", "c"), c=c("c", "x")))
    どんな答えが出てくるか,プログラムを実行せずに予測してみてください。私は,出てくるのとは全く違った答えを予想していたのです。
    そして,私が期待していた答えにするためには,以下のようにしなければならないのだと分かった次第です。
    > sapply(lapply(d, factor,
    +        levels=names(table(unlist(sapply(d, levels))))),
    +                           ~~~~~~~                 ~
    +        table)
       A B C D
    黄 3 6 1 1
    黒 0 0 1 1
    青 0 0 0 1
    赤 2 0 2 0
    白 1 0 2 3
    当然ながら,別法による答えと同じになることは確かめました。
    > a <- data.frame(color = c(sapply(d, factor)),
    +                 group = rep(LETTERS[1:m], each=n),
    +                 count = rep(1, n*m))
    > xtabs(count ~ color + group, a)
         group
    color A B C D
       黄 3 6 1 1
       黒 0 0 1 1
       青 0 0 0 1
       赤 2 0 2 0
       白 1 0 2 3
    思い込みとは恐ろしいものです。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-21 (水) 18:32:02
  • 河童さん ありがとうございました。解析は、教えていただいた別解を採用し、終了しております。エラー分析については、解説いただいた内容で十分理解できました。この度は大変勉強になりました。 -- のす? 2012-03-30 (金) 10:01:41

Rでグラフなどの出力をMathematicaのノートブック風にできないでしょうか?

kejuyan? (2012-03-08 (木) 00:06:40)

Rでグラフなどの出力をMathematicaのノートブック風にできないでしょうか?
私の環境は、Windows7,R-2.12です。
色々調べたところTeXmacs? + Rという組み合わせで実現できるような記述も見つけたのですが、設定の仕方が分かりませんでした。
TeXmacs? + Rに限らず、Windows7でRの出力をMathematica風に出来る方法があれば、具体的な設定方法も含めてご教授宜しくお願いします。

  • http://kougaku-navi.net/maxima.html によれば,「TeXmacs?というソフトを使えば,Maximaと連携して計算結果の数式を綺麗に表示することができますということで,R じゃなくて Maxima になりそうでは?
    Mathematica のノートブックというのも実際に使ったことはなくてググってみたのですが,数値処理結果を含む文書を対話的に作成・管理するものということでしょうか。
    R との連携ということならば,「あまり対話的ではない」けれども,Sweave が候補になるかな?Sweave は R と LaTeX の連携で R プログラムと分析結果(図も)を含む文章を作るシステムです。それらを一括管理できる統合システム RStudio だとあなたの希望に近くなるのかな? -- 河童の屁は,河童にあらず,屁である。? 2012-03-08 (木) 08:45:28

データフレームを正規表現を条件にして抽出する

tadashi? (2012-03-05 (月) 15:26:37)

apache のアクセスログのデータフレームで、user-agent のところで、bot の文字がはいっているデータ(列)を抽出したいのですが、どうするのがいいのでしょうか、正規表現で、簡単にできると思うのですが、書き方がわかりません。
subset(データフレーム、条件(正規表現))のように書くと思われるのですが、可能ではないでしょうか?

  • 「bot の文字がはいっているデータ(列)を抽出したい」のですか,「bot の文字がはいっているデータ(行)を抽出したい」のではないですか。
    以下のような簡単な例が役に立ちますか? -- 河童の屁は,河童にあらず,屁である。? 2012-03-05 (月) 16:31:21
    > (d <- data.frame(
         UserAgent=c("foo", "bar", "bot", "baz", "robots"),
         x=LETTERS[1:5]))
      UserAgent x
    1       foo A
    2       bar B
    3       bot C
    4       baz D
    5    robots E
    # データフレームの UserAgent 列に "bot" という文字列を含む行を取り出す
    > d[grepl("bot", d$UserAgent),]
      UserAgent x
    3       bot C
    5    robots E
  • ばっちりです。ありがとうございます。おっと、行ですね。間違いですみません。grep でも grepl (最後がエル)でもこのデータでは同じになりますね。 -- tadashi? 2012-03-06 (火) 17:50:40

ファイルが読み込めない

ユーザー? (2012-03-05 (月) 11:11:10)

read.tableコマンドでCSVファイルを読み込もうとしましたがう下記のような警告がでてうまくいきません。どうすればよいでしょうか?
以下、コマンドと警告です。

> Ar1TestData <- read.table("C:\Users\g-fujimoto\Dropbox\Ar1TestData.csv",header=TRUE)
エラー:  "C:\U"で始まる文字列の中で8進文字なしに'\U'が使われています
  • Windows では,パスの区切り文字を \ ではなく \\ にしないといけません。/ でもよいのですが。また,どうでもよいですが csv ファイルを読むときには read.csv を使うと吉。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-05 (月) 13:41:11
  • ありがとうございました。うまくいきました。 -- ユーザー? 2012-03-06 (火) 09:01:25

WindowsからのイベントID(E) 63のエラー警告について

saito? (2012-03-04 (日) 10:20:33)

OS Windows7 x64を使用しておりますがイベントID(E)63のエラー報告がされます。メッセージは次の様です。"C:program files\R\r-2.14.1\Tc\bin64\tk85.dll"のアクティブ化コンテキストの生成に失敗しました。マニフェストまたポリシーファイル"C:program files\R\r-2.14.1\Tc\bin64\tk85.dll"行9のエラーです。要素"assemblyIdentity"の属性"processerArchitecture"に無効な値"x64"が指定されています。
上記のようなエラーメッセージですが気に病むような問題なのか無視しても構わないのか判断に迷っております。何方か解決策をご教授願えないでしょうか?お忙しい中申し訳ありませんが宜しくお願い致します。

パッケージのソースコードについて

みのむし? (2012-03-02 (金) 15:24:49)

Rを使って計量経済学の分析をしています。

最近ある研究者が自分の開発した手法をRで使うためのパッケージを開発して、学術目的に限り無料で配布しています。

私は彼の手法を少し改良したものを実際の分析で使いたいと考えています。
そこで、彼の作成したパッケージに手を加えたいのです。

ところが、ダウンロードしたパッケージを見ると、拡張子がrdbやrdxとなっており、もととなったコードを読むことができません。

Rのパッケージのソースコードを読むにはどうすれば良いのでしょうか?
どなたかご教示いただければ大変幸いです。

  • rdb rdx r の3語で google 検索してみると,いろいろ出てきますが,R help archive: Re: [R] opening RDB files あたりを読む。つまるところ,これらのファイルにあなたの望む情報(コード)はないということ。その研究者に連絡してみればいかが?
    「あなたの手法を少し改良したものを実際の分析で使いたいと考えています。そこで、あなたの作成したパッケージに手を加えたいのです。ソースを開示して頂けませんか」と。
    そもそも,そういう連絡が取れないような状況では,「彼の作成したパッケージに手を加えたい」というのは無理でしょう。 -- 河童の屁は,河童にあらず,屁である。? 2012-03-02 (金) 16:41:20
  • お返事ありがとうございます。下記の2月20日の質問では、Rのソフトのコードを非表示にはできなとのことでしたので、てっきりすべてのパッケージのコードも表示されているものと思っておりました。中にはソースが非表示になっているパッケージもあるということですか?ライブラリーにあるパッケージも見ましたが、拡張子がrdbやrdxとなっていてコードが読めないものもありました。しつこくて申し訳ありません。 -- みのむし? 2012-03-02 (金) 22:35:59
  • > 中にはソースが非表示になっているパッケージもあるということですか?
    そいうことを言っているつもりはないですけど。
    リンク先の記事を読みましたか?
    > The *.rdb etc are the new compact package file formats introduced around R v2.0.0; these are binary files that won't make much sense to look at.
    例えば有名どころの MASS パッケージ。Mac版だと,/Library/Frameworks/R.framework/Versions/2.14/Resources/library/MASS の下には特にソースらしきものはないですよね。しかし,例えば lda 関数がどうなっているかは MASS:::lda.default などとやればソースは見えますよということ。.rdb や .rdx とは違うでしょということ。
    しかし,問題はそこにはないといっている。作者に問いあわせる・了承を得る事が先決でしょうということ。フリーウエアなんだから了承なんか得なくてもいいという考え方もあるだろうが,「学術目的に限り」とか限定を付けていることも考えると,無断で好き勝手に改変した場合,相手は快く思わないことも十分にあり得るだろうと言うこと。
    > 研究者が自分の開発した手法をRで使うためのパッケージを開発して、学術目的に限り無料で配布
    ヒントを求めようというなら,何という名前のパッケージで,どこでダウンロードできるのかなどの情報も必要かな? -- 河童の屁は,河童にあらず,屁である。? 2012-03-02 (金) 23:33:10

データの抽出

tsujimo? (2012-03-01 (木) 00:41:25)

最近Rを触り始めました

#用語がおかしかったらお知らせください,なるべく改めて行きたいと思います

データフレームからデータを抽出するのに以下を試みましたが,結果がどうも解せません
c(1,3)で抽出しようとしたものは何が抽出されたのでしょうか?
どういうデータが取りこぼされたのでしょうか?

#結果のデータを見比べて見ても特に規則性は見えませんでした

> nrow(raw[which(raw["Q1"]==c(1), useName=TRUE, arr.ind=TRUE),])
[1] 8526
> nrow(raw[which(raw["Q1"]==c(3), useName=TRUE, arr.ind=TRUE),])
[1] 14750
> nrow(raw[which(raw["Q1"]==c(1,3), useName=TRUE, arr.ind=TRUE),])
[1] 11546

ある行"Q1"を選択肢に複数の不連続な選択番号で抽出したかったのですがどうすれば良かったのでしょうか?
複数の不連続な選択番号(ここではc(1,3))を関数の引数として受け取りたいとも考えています
ループ版は作れたのですが悲しい位遅いです
以上よろしくお願いします

  • %in% -- 2012-03-01 (木) 02:39:56
  • 挙動がおかしいなと思う場合は,全体が見通せる簡単なデータ例を作って,途中の結果を表示させてみればよいでしょう。そうすれば,思っているのとどこが違うかわかり,どうすればよいかのヒントも見つかるかも知れません。直前の人のコメ\tントで分かればよいですが,%in% は,一番最後に挙げたように使います。 -- 河童の屁は,河童にあらず,屁である。? &new{2012-03-01 (木) 09:09:12}-cbind(seq=1:t,s1)
    s2;
    > set.seed(1)
    > (raw <- data.frame(Q1=1:5, x=sample(LETTERS, 5))) # 簡単な例を作る
      Q1 x
    1  1 G
    2  2 J
    3  3 N
    4  4 U
    5  5 E
    > raw[which(raw["Q1"]==c(1), useName=TRUE, arr.ind=TRUE),]
        Q1 x
    1    1 G
    1.1  1 G
    # arr.ind を指定するのがおかしい
    > which(raw["Q1"]==c(1), useName=TRUE, arr.ind=TRUE)
         row col
    [1,]   1   1
    # raw へ渡される引数(行番号)がおかしいことが分かる
    > raw[which(raw["Q1"]==c(3), useName=TRUE, arr.ind=TRUE),]
      Q1 x
    3  3 N
    1  1 G # 意図しないものも抽出されている なぜだろうかと考える
    > which(raw["Q1"]==c(3), useName=TRUE, arr.ind=TRUE)
         row col
    [1,]   3   1
    > raw[which(raw["Q1"]==c(1, 3), useName=TRUE, arr.ind=TRUE),]
        Q1 x
    1    1 G
    1.1  1 G
    > which(raw["Q1"]==c(1, 3), useName=TRUE, arr.ind=TRUE)
         row col
    [1,]   1   1
    > raw[raw[,"Q1"] %in% c(1, 3),] # これが解
      Q1 x
    1  1 G
    3  3 N

セル平均と切片

そとの? (2012-02-28 (火) 10:15:35)

ネットでみつけたデータを使って回帰分析の勉強をしています。

d <- read.table("http://personality-project.org/r/datasets/R.appendix2.data", header=T)
lm1 <- lm(Alertness ~ Gender * Dosage, data=d)

上の回帰分析で求められる切片と下の計算で得られる平均が同じになることはわかったのですが、両者のsdの違いが説明できません。

mean(d$Alertness[d$Gender=='f' & d$Dosage=='a'] )
summary(lm1)$coef[1,2]
sd(d$Alertness[d$Gender=='f' & d$Dosage=='a'] )

このふたつは同じになるものではないのですか?直接的なRの質問でありませんが、よろしくおねがしいます。

  • Std. ErrorはStandard errorのことでStandard deviationとは違いますよ -- 2012-02-28 (火) 10:51:15
  • すみません。間違えました。 sd(d$Alertness[d$Gender=='f' & d$Dosage=='a'] )/sqrt(15) #= 1.122 となり、やはり違いました。 -- そとの? 2012-02-28 (火) 12:23:04
  • なぜ同じになると思ったのですか?単に,標準偏差と標準誤差というような用語の定義上の問題じゃないですよ。
    重回帰分析の定数項の標準誤差の定義式を確認しましたか?定義式は例えば http://aoki2.si.gunma-u.ac.jp/lecture/Regression/mreg/mreg3.html でも見ればよい。
    それとd$Alertness[d$Gender=='f' & d$Dosage=='a'] の標準偏差とか標準誤差(ちなみに,あなたは標準偏差をsqrt(15)で割ったけど,d$Alertness[d$Gender=='f' & d$Dosage=='a'] は 15, 12, 22, 14 の4個のデータなのに,なんで sqrt(15) で割るんですか?)と同じになりません。 -- 河童の屁は,河童にあらず,屁である。? 2012-02-28 (火) 23:08:08

pisa2009データ 150メガバイトに必要はメモリは?

tadashi? (2012-02-25 (土) 10:38:36)

http://pisa2009.acer.edu.au/downloads.php の生徒の回答(テキストで、非圧縮で1G程度)をRに読み込むと、150メガくらいになります。64bit のwindows で、メモリは、何Gぐらいあると快適に動くのでしょうか?

lmtest, zooのロード

akira uegaki? (2012-02-22 (水) 23:10:18)

Mac OS X (10.7.2)ですが、パッケージlmtestをインストール後、これをロードしようとすると、「エラー: パッケージ '‘zoo’' をロードできませんでした」となって、ロードできません。したがって、DWテストができません。Windowsで同じことをしたときは簡単に成功したのですが。いろいろネット上で探ってみたのですが、わかりません。どなたか、ご教示ください。

  • lmtest は zoo を必要とするわけです。zoo はインストールされているのですか? -- 河童の屁は,河童にあらず,屁である。? 2012-02-23 (木) 07:51:23
  • ありがとうございます。lmsetをインストールすると、zooもインストールされると勝手に思い込んでいました。別途インストールすることによって、解決しました。 -- akira uegaki? 2012-02-23 (木) 09:29:20
  • ありがとうございます。lmsetをインストールするとzooも勝手にインストールされると思い込んでいました。別途インストールすることによって解決しました。 -- akira uegaki? 2012-02-23 (木) 09:31:03
  • 自動的に依存パッケージもインストールされるようにするためには、オプションdep=TRUEです -- 2012-02-23 (木) 14:22:52
  • 将来的にdepが一意でなくなる可能性も否定できないので、人に助言するときはdependencies = TRUEと略さずに書いた方がよいのでは。 -- 2012-02-23 (木) 18:42:13
  • Windows でもそうなんだけど,パッケージのインストールはマウスでクリクリやるのが間違いなくてよい。Mac なら,パッケージとデータ-->パッケージインストーラで「依存パッケージも含める」にチェックを入れておく。インストール済みのパッケージの全てをアップデートするとか,管理も便利。 -- 2012-02-23 (木) 19:00:15

dataset パッケージ

tadashi? (2012-02-21 (火) 18:16:56)

dataset パッケージ library/datasets/html/00Index.html にいろいろデータがあるのですが、少し詳しく解説しているページがあったら教えてください。

  • CRANにある R Function Help Page という日本語文献の12章を参照してください。 -- 2012-02-21 (火) 19:37:22
  • 新しいページを作った--パッケージ 'datasets' の情報 -- 2012-02-22 (水) 08:11:32
  • ここにもあります。 -- akira? 2012-02-22 (水) 09:35:07
  • 日本の統計情報もあるといいですね。 -- tadashi? 2012-02-23 (木) 11:09:58
  • 日本の人口統計だけならfmsbパッケージにある程度入っています -- 中澤? 2012-02-23 (木) 15:43:36

Rで開発したソフトの配布

ひろ? (2012-02-20 (月) 23:09:37)

Rで開発したソフトを配布したいのですが,ソースコードが丸見えなため,どうにかできないかと悩んでおります.
1.Rの難読化か機械語にコンパイル方法ありますでしょうか?私が調べてみたところ存在せずでした.(RCC(R2C++)は入手できず,Pコンパイラやらはありましたが...)
2.compilerパッケージでコンパイルしてみましたが,ソースコードが添付されてしまいます.ソースコードやコメントを除去する方法はございますでしょうか?英語のマニュアル読んでみましたが,それらしきは見当たりませんでした.もしかしたら,英語苦手なので見落としている可能性はありますが.

  • そのような有用なソフトは,ライブラリとして登録するのが適切でしょう。多くの有用なプログラムが,多くの人の助けになっています。
    フリーソフトのRでつくったのだから、その精神を受け継いでソースも公開すれば悩みはなくなりますでしょう。お金儲けをしたいというなら別だけど...
    ソースも公開するという前提があるからソースは隠すという手段が用意されていない、そんなことは想定外ということでは?
    受け取る側だって、内部でどのようなことが行われているか、正しいかどうか検証できないようなソフトは安心して使えないと判断するのではないかな? -- 河童の屁は,河童にあらず,屁である。? 2012-02-21 (火) 08:59:48
  • "河童の屁は,河童にあらず,屁である"さんのおっしゃられる通りだと思います.ただ,仕事柄いつ飯食えなるかわからなくなるかわからないので... -- ひろ? 2012-02-22 (水) 15:03:44
  • どうしてもソースを簡単に見せたくないなら、C言語か何かでそのRコードを包んで、その言語からRを呼び出すようにすればよいのでは。例えばこことか参照されては。 -- 2012-02-22 (水) 19:08:14
  • Rのライセンス体系がソースコードを非開示にできるものか私はしりません。ただ、調べた方が良いと思います。ただ、著作権は発生するように思います。 -- akira? 2012-02-22 (水) 19:18:33

windowsでUTF8の対応について質問

ひろ? (2012-02-20 (月) 15:10:24)

UTF8に依存した文字コードを含む文字列データをR言語を使って処理しようとしています.Linuxと違ってWinではUTF8の読み込める物の,エラーメッセージが文字化けしたりと困っておりまして,そこでお聞きしたいのが,

1. WindowsでもUTF8はShift-JISの同様に簡単に処理できますか?UTF8の文字列を扱う度iconvを使って変換が必要でしょうか?
2. Mac/Linuxへの移行を検討した方がいいでしょうか?
3. Windows版Rは近い未来にUTF8に対応するか否か?

  • 1に対して。例えば read.table には fileEncoding という引数がありますよね。それで utf-8 と指定すればちゃんと読めませんか?私は逆の立場ですが,fileEncoding=”cp932" とすれば,windows で作られたファイルをちゃんと読めますよ。 -- 河童の屁は,河童にあらず,屁である。? 2012-02-20 (月) 19:24:46
  • 「readTableHeader? で不完全な最終行が見つかりました」「不正な入力がありました」と表示されます.念のため,2x2のUTF-8で保存された文字列は読めたので,ソースがおかしいのかもしれません.Rでは内部コードを修正なくも," 河童の屁は,河童にあらず,屁である"さんはcp932であれば,読み込んだ後grepを使った文字コード比較は問題なくできてらっしゃいますでしょうか? -- ひろ? 2012-02-20 (月) 22:54:18
  • 不完全な最終行というのは、ファイルの最後が改行文字で終わっていないフィルです。Excelをcsvファイルで保存すると、この不完全な最終行を持つファイルになります。困ったもんです。そんな場合は、しょうがないので、一度エディタで読み込み最終行で改行してから保存するという、めんどうなことをやってます。 -- 河童の屁は,河童にあらず,屁である。? 2012-02-21 (火) 09:07:56
  • 改行EOFは正しくありました.おかしいと思って調べてみたところCSVの整形に問題がありました.CSVはネットからプログラムで取得した結果であり,その取得プログラムにバグがあることが分かりました.これを訂正しまして,改めてご連絡させていただきます. -- ひろ? 2012-02-22 (水) 15:07:43
  • 問題解決しました.ありがとうございまいた. -- ひろ? 2012-03-30 (金) 18:09:37

モデルに基づくクラスター分析(mclust)"hc for EEE model is not currently supported"

おちあい? (2012-02-20 (月) 04:47:08)

モデルに基づくクラスター分析の勉強のために、以下のスクリプトをあるウエブサイト(http://mjin.doshisha.ac.jp/R/29/29.html)から使用しています。

> install.packages("mclust")
> iris2<-iris[51:150, 1:4]
> library(mclust)
> plot(EMclust(iris2))
> mhc <- hc(modelName="EEE", data=iris2) # もとはEEE

ここまで来ると

 以下にエラー hcEEE(data = iris2) : 
 hc for EEE model is not currently supported

が表示されます。
他のモデル、EII、VII、VVVではこのエラーは表示されません。
EEEのモデルを採用し処理を続けるにはどうしたらよいのでしょうか。アドバイスを頂けたらと思います。
使用環境
R version 2.14.0 (2011-10-31)
Platform: x86_64-pc-mingw32/x64 (64-bit)
Windows 7

  • not currently supported といわれているのだからどうしようもないと考えるのが普通でしょう。
    hcEEE の 29 行目に stop があるが,それを除いたとしても,それ以降に出てくる temp がそれ以前のどこにも定義されていないので,動くはずもないです。 -- 河童の屁は,河童にあらず,屁である。? 2012-02-20 (月) 08:33:37
        stop("hc for EEE model is not currently supported")
        temp[[4]] <- temp[[4]][1:2]
        temp[[5]] <- temp[[5]][1:2]
               : 以下略
  • アドバイスありがとうございます。どうやっていくかもう少し考えようと思います。 -- おちあい? 2012-02-24 (金) 01:02:11

パッケージが読み込めない

ひらやま? (2012-02-18 (土) 10:40:35)

分布モデル作成に有用なdismoパッケージを使っているのですが、先日から突然このパッケージが読み込めなくなってしまいました。読み込もうとすると「応答なし」となって固まってしまいます。その他のパッケージは問題なく読み込むことができ、dismoパッケージのみこの症状が出ます。
以下のことは試してみましたが解消されません。
・パッケージの更新
・パッケージの削除、再インストール
・旧バージョンのパッケージの使用
・Rをアンインストールし、再インストール 
また、昨日まで問題なくdismoパッケージが読み込めていた別PCでも、今朝になると全く同じように読み込めなくなっていました。昨夜から今朝にかけて行っていた作業内容はパッケージdismo内のmaxent()というコマンドを使って、架空データで10000回の分布モデル作成でした。
どのように対処していいものか悩んでおります。ご助言いただけますと助かります。よろしくお願いします。
使用環境
OS: Windows 7
R version: 2.14.1
対象package: dismo

barplot

ただばやし? (2012-02-04 (土) 14:51:06)

積み上げグラフを書いていて、バーを塗りつぶした上に模様を描きたいと考えています。(例えば群集組成を示す図で生物の属ごとに色を与え、種ごとに模様を変えたい)
barplotで図を書いているのですが、angleとcolで模様を変えたり模様に色を付けることはできるのですが、バー自体を塗りわけることができず困っております。
ご助言頂けますと助かります。
よろしくお願いします。

  • parコマンドで重ね書きすることができ、解決しました!ありがとうございました。 -- ただばやし? 2012-02-04 (土) 17:20:59
  • 最初の方でよいのですか?「群集組成を示す図で生物の属ごとに色を与え、種ごとに模様を変えたい」は満たしていないように思いますけど。つまり,色とハッチングはいつも同じ組合せになっているけどよいのですか?
    そういうことで,最初のコメントは消去したのです。
    最初のプログ%A%薀爐反泙楼焚爾猟未蝓
    x <- matrix(sample(10:50, 20), 4)
    dimnames(x) <- list(LETTERS[1:4], letters[1:5])
    barplot(x, col = c("#aa000070", "#00aa0070",
                        "#0000aa70", "#aa660070"))
    par(new = TRUE)
    barplot(x, col = 1:4, angle = 1:4 * 45, density = 10)
    barplot1.png
    で,次のがあなたの要望に添うものではないかな?と
    棒の塗りつぶしとハッチングは排反なので,両方を満たすことはできないようです。barplot で棒の中での色を変え,棒のハッチングは rect で行うようにすればよいのでしょう。
    mp <- barplot(x, col = seq_len(nrow(x)) + 1)
    rect(mp - 0.5, 0, mp + 0.5, colSums(x), col = "black", density = 10,
         angle = 45 * seq_len(ncol(x)))
    barplot2.png
    しかし,できあがったものを見れば分かりますが,棒のハッチングを変えても,そもそも,棒は別々の位置に書かれているのだから違う棒だということは自明。例のような場合には棒をハッチングする意味はほとんどないのでは? -- 河童の屁は,河童にあらず,屁である。? 2012-02-04 (土) 17:38:43
  • つくりたい積み上げグラフは始めにしていただいた回答で問題なく作ることができました。また、追加のご説明までして頂き、ありがとうございました。今後の参考にさせていただきたいと思います。 -- ただばやし? 2012-02-05 (日) 12:31:21

ARFIMAのdについて

のざわ? (2012-02-04 (土) 08:36:34)

宜しくお願いします。

以下のようなプログラムで和分を実数と整数(1)にしてsummaryを見ているのですが相関係数もAICも全く変わりません。
何かバグでもあるのでしょうか?

library(fracdiff)
AP.d <- fdGPH(AirPassengers)$d
AP.fra <- fracdiff(AirPassengers, nar = 3, dtol = AP.d, nma = 1)
summary(AP.fra)
AP.fra <- fracdiff(AirPassengers, nar = 3, dtol = 1.0, nma = 1)
summary(AP.fra)
  • dtol が何であるかは分かっておられる?
    interval of uncertainty for d. If dtol is negative or NULL, the fourth root of machine precision will be used. dtol will be altered if necessary by the program.
    例えば dtol=NULL(デフォルト)や dtol=-1,さらには dtol=1e-4 などとすると結果は(当然ながら)変わりますね。
    > 何かバグでもあるのでしょうか?
    というのなら,あなたは,何が正解かを知っていなければなりません。何の根拠もないのにバグなどという言葉を持ち出すべきではないでしょう。あなたの使い方がまずいだけというなら,なおさら。
    fdGPH は Estimate the fractional (or “memory”) parameter d in the ARFIMA(p,d,q) model なのだから,それを dtol に与える(dtol=AP.d)のは変では? -- 河童の屁は,河童にあらず,屁である。? 2012-02-04 (土) 13:12:49
  • なるほど、そういう事ですか。あれこれのサイトに、こういう例題が掲載されていたので、こう使うものだと思っていました。有難うございます。 -- のざわ? 2012-02-05 (日) 09:47:51

arima関数エラーをtry()でキャッチする方法について

Yuki? (2012-02-01 (水) 16:10:38)

多数の時系列データをARIMAモデルで予測したいと考えています。
try関数によりエラーとなった場合は次のデータに行くようなプログラムを作成しようとしていますが、try関数を使ってもうまく戻り値を捉えることができず困っています。対処方法をご存じの方がいらっしゃいましたらお教え頂けますか?
私が引っかかっている箇所は以下になります。
利用データ:(エラーとなった1データのみ記載しています。実際はループして処理をしています。)

myts <-ts(c(92,85,77,178,174,161,93,81,120,136,84,117,92,108,87,97,82,99,
            142,205,142,75,60,92,113,93,128,64,72,71,89,98,103,127,97,101,
            86,81,85,57,79,86,83,99,89,132,136,89,85,107,50,22,97,148,102,
            79,79,80,40,99,178,77,97,89,81,73,126,129,160,98,23,86,105,113,
            120,106,105),freq=7, start=c(7,13))

arimaで処理が正常に終わる場合、以下のように、

> (class(try(fit <- arima(myts,order=c(1,1,1),method="CSS-ML"),silent=true)))
[1] "Arima"

が返ってきますので、下記のようにifelse関数を用いてmyresに戻り値を格納し、myresの値を利用して、FALSEの場合、例外処理に行くようにしたいと考えました。

> (myres <-ifelse(class(try(fit <- arima(myts, order = c(1, 1, 1),
   method = "CSS-ML"), silent = true)) == "Arima", TRUE, FALSE) )
[1] TRUE

正常にARIMAで予測できる場合は、期待通り「TRUE」が返ってきます。 しかし、エラーとなるmethod="ML"で実行すると、期待した「FALSE」が返ってきません。

> (myres <-ifelse(class(try(fit <- arima(myts, order = c(1, 1, 1),
   method = "ML"), silent = true)) == "Arima", TRUE, FALSE) )
 以下にエラー value[[3L]](cond) :  オブジェクト 'true' がありません 
 追加情報:   警告メッセージ: 
In arima(myts, order = c(1, 1, 1), method = "ML") :
  possible convergence problem: optim gave code=1

のようにエラーとなりますが、myresの値は更新されず、以下のように前の値のままです。

> myres
[1] TRUE

念のため、myresをrmしてから確認すると、以下のようにmyresに値が帰っていないことがわかりました。

> rm(myres)
> (myres <-ifelse(class(try(fit <- arima(myts, order = c(1, 1, 1),
   method = "ML"), silent = true)) == "Arima", TRUE, FALSE) )
 以下にエラー value[[3L]](cond) :  オブジェクト 'true' がありません 
 追加情報:   警告メッセージ: 
In arima(myts, order = c(1, 1, 1), method = "ML") :
  possible convergence problem: optim gave code=1
> myres
 エラー:  オブジェクト 'myres' がありません 

利用環境は以下のとおりです。

Rのバージョン:2.14.1
OS:WindowsXP SP3
利用パッケージ:
stats     graphics  grDevices utils     datasets  methods   base  

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

  • 凡ミスでしょう。try の引数 silent に,あなたは true を与えていますよ。TRUE でしょ?
    「オブジェクト 'true' がありません」といわれているではありませんか。素直にエラーメッセージを解釈しましょう。-- 河童の屁は,河童にあらず,屁である。? 2012-02-01 (水) 16:59:04
    > (myres <-ifelse(class(try(fit <- arima(myts, order = c(1, 1, 1),
    +    method = "ML"), silent = TRUE)) == "Arima", TRUE, FALSE) )
    [1] FALSE ←←← FALSE になりますよ
     警告メッセージ: 
    In arima(myts, order = c(1, 1, 1), method = "ML") :
      possible convergence problem: optim gave code=1
    それと,ifelse は不要。以下と同じ。
    > (myres <-class(try(fit <- -data.frame(ip=arima(myts, order = c(1, 1, 1),
    +    method = "ML"), silent = TRUE)) == "Arima" )
  • ご回答どうもありがとうございました。凡ミスで大変失礼いたしました。お恥ずかしい限りです。お陰さまで前に進めました。ありがとうございました。 -- yuki? 2012-02-01 (水) 17:21:01

expressionについて

まあくん? (2012-01-26 (木) 10:32:57)

expression()の使い方ですが、

expression(paste(bgroup("(", atop(n, x), ")"), p^x, q^{n-x}))

temp <- "q^{n-x}"
expression(paste(bgroup("(", atop(n, x), ")"), p^x, temp))

のように書き換えたいのですが、うまくいきません。どのようにすればうまくいくでしょうか?

  • ちょっとまだるっこしいのだけど,以下のようにすればいかが? -- 河童の屁は,河童にあらず,屁である。? 2012-01-26 (木) 12:30:05
    temp <- "q^{n-x}"
    eval(parse(text=paste('expression(paste(bgroup("(", atop(n, x), ")"), p^x, ',
                          temp, '))', sep='')))
  • ありがとうございました。 -- まあくん? 2012-01-26 (木) 15:50:22

コレスポンデンス分析の散布図表示

のす? (2012-01-23 (月) 18:02:07)

投稿ルールも読まず、汚い投稿をしてしまい重ね重ね申し訳ありません。
お詫びします。
先ほどの、質問ですが、以下の様な処理を行った場合、「小学生…」のグラフと、「イチゴ…」のグラフが重ねて出力されます。
ところが、「Excelで学ぶコレスポンデンス分析」(高橋信 著)の123ページには「大学生、高校生…」のグラフと、「なし、いちご…」のグラフとを別々に描いてもかまわないと記述されています。
これをRで行い、2つのグラフが得られるようにしたいのですが、よくわかりません。
よろしくお願いします。
環境はwin7(64)
R ver 2.14.1です。

library(MASS)
y <- data.frame(小学生 = c(4, 3, 4, 7, 3), 中学生 = c(5, 9, 6, 7, 4),
                高校生 = c(6, 2, 3, 7, 6), 大学生 = c(7, 1, 4, 6, 7))
rownames(y) <- c("イチゴ", "みかん", "ぶどう", "りんご", "なし")
y.coa <- corresp(y, nf=2)
biplot(y.coa, main="好きな果物調べ")
  • こんな図を描きたいのですか?でも,2つの図を一緒にした biplot でないと意味がないですよ。 -- 河童の屁は,河童にあらず,屁である。? 2012-01-23 (月) 18:26:25
    layout(matrix(1:2, 2))
    old <- par(mar=c(3, 3, 1, 3), mgp=c(1.6, 0.6, 0))
    plot(y.coa$rscore)
    text(y.coa$rscore, label=dimnames(y.coa$rscore)[[1]], pos=4, xpd=TRUE)
    plot(y.coa$cscore)
    text(y.coa$cscore, label=dimnames(y.coa$cscore)[[1]], pos=4, xpd=TRUE)
    par(old)
    layout(1)
    biplot.png
  • ありがとうございます。重ね重ね失礼いたしました。ご教授いただいた通りの事を考えていました。変数が多くなりすぎたら、このような処理もできるかと思い、質問しました。以後、しっかり勉強します。この度は、心から感謝しております。 -- のす? 2012-01-23 (月) 18:33:48
  • 先ほどの書き込みは削除しました。ご了承ください。 -- のす? 2012-01-23 (月) 18:44:15

陰関数のplotについて

るち? (2012-01-23 (月) 15:11:05)

はじめまして。
今T^2管理図の管理限界楕円を図に出したいのですが、その前に陰関数を図に表せるかが知りたいと思っています。

円であれば半径の指定さえすれば表示できることはわかるのですが、楕円になる陰関数での図式化の方法があれば教えていただけたらと思います。

  • T^2管理図を知らないので、直接的な答えにならないと思いますが、楕円なら例えば下記のようにして描きます。 -- 2012-01-23 (月) 16:09:54
    > i <- seq(from = 0, to = 2 * pi, length = 50)
    > plot(6 * cos(i), 2 * sin(i), type = "l", asp = 1)
  • ありがとうございます。これを陰関数でも適応することは可能でしょうか?例えば(x-a)^2+(y+b)^2=cとした場合に定数が変数であっても適応できるようにしたいのです。 -- るち? 2012-01-23 (月) 16:20:25
  • 高校数学程度の知識があれば、上に示した例を使って、ご要望のケースにもちろん対応できるでしょう。自分の頭で考えるのがどうしても嫌で、既存の関数が必要なら、shapeパッケージのfilledellipse()とか。さらに情報が必要なときは、RSiteSearch("ellipse")を実行する。 -- 2012-01-23 (月) 17:55:37

npパッケージのnpcmstestでbwsで具体的にbandwidthを指定すると「仮引数 ”bws” が複数の実引数にマッチしました」というエラーがでてしまいます

ななみ? (2012-01-21 (土) 21:55:03)

はじめまして。npパッケージでモデルの検定をしています。

model <- lm(Y ~ X, y = TRUE, x = TRUE)
X <- data.frame(X)
npcmstest(model = model, xdat = X, ydat = Y, bws = 1)

のようにバンド幅を指定すると

「仮引数 ”bws” が複数の実引数にマッチしました」

というエラーがでてしまいます。
どなたか、これに対する解決方法をご存じでしたらお教え頂きますようお願い致します。

  • 再現できる最小のサンプルデータがないと答えるのが難しいと思う。bwsが一意でないエラーに見えるけど、サンプルがないと何とも言えない。 -- 2012-01-23 (月) 15:58:06

関数内で、引数を文字列として使用したい

masa? (2012-01-19 (木) 14:13:00)

お世話になります。
ヘルプやこのサイトを検索して見つけられず、非常に基本的な点ではと思うのですが、ご教授ください。
下記のような関数で階層化クラスタリングを行おうとしています。dataset の名称を文字列として、ところどころ(# here の行)で使いたいのですが、下記のままだとオブジェクトの内容そのものが入ってしまいます。

myhc <- function(varset, dataset) {
	hc <- hclust(dist(model.matrix(varset, dataset)), method= "ward")
	plot(hc, main= paste("Cluster Dendrogram for Solution", dataset, sep=""),  # here
	     xlab= paste("Observation Number in", datasetname), 
	     sub="Method = Ward; Distance = Euclidian", 
	     hang=-1)
	rect.hclust(hc, k = 5, border = "red")
	dev.print(jpeg, filename = paste(dataset, ".jpg"), width = 800, height = 600) # here
}
sessionInfo()~ [#w973c77e]
R version 2.14.1 (2011-12-22)
Platform: i386-pc-mingw32/i386 (32-bit)

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] splines   graphics  stats     utils     grDevices tcltk     base

other attached packages:
[1] RODBC_1.3-4      Rcmdr_1.8-1      relimp_1.0-3     car_2.0-11
[5] survival_2.36-10 nnet_7.3-1       MASS_7.3-16

loaded via a namespace (and not attached):
[1] tools_2.14.1
  • すみません1つ上の「関数内で、引数を文字列として使用したい」の続きです -- masa? 2012-01-19 (木) 14:13:39
  • 肝心の質問は「関数 myhc に dataset としてたとえば kome を渡した時に関数の最終行で kome.jpg が生成されるようにするには、どうしたらいいでしょうか?」 -- masa? 2012-01-19 (木) 14:23:26
  • function(x) deparse(substitute(x)) -- 2012-01-19 (木) 15:15:02
  • おっしゃるとおり,基本的ですが,filename = paste(deparse(substitute(x)), ".jpg", sep="") などとするんですよ。要するに,deparse, substitute を使う。 -- 河童の屁は,河童にあらず,屁である。? 2012-01-19 (木) 15:15:08
  • 迅速にありがとうございます、うまくいきました。 (sessionInfo() 記述の統合も恐縮です) -- masa? 2012-01-19 (木) 15:54:56

merge()でbyに複数列指定する方法

zou? (2012-01-16 (月) 16:33:26)

merge()で、by= に複数列指定する方法があれば教えて下さい。

(x <- data.frame(
   name1 = c("tanaka", "tanaka", "tanaka", "suzuki", "suzuki", "suzuki"),
   year1 = c("2000", "2001", "2005", "2000", "2005", "2008"),
   test1 = 1:6))
(y <- data.frame(
   name2 = c("tanaka", "tanaka", "suzuki", "tanaka", "suzuki", "suzuki"),
   year2 = c("2000", "2001", "2000", "2005", "2005", "2008"),
   test2 = c(11, 12, 14, 13, 15, 16)))
 # m1 <- merge(x, y, by.x = "name1", by.y = "name2", all = TRUE))

ほしい結果は次のものです。よろしくお願いします。
なお、ソートして結合するやり方ではなく、merge()を使いたいです。

tanaka 2000 1 11
tanaka 2001 2 12
tanaka 2005 3 13
suzuki 2000 4 14
suzuki 2005 5 15
suzuki 2008 6 16
  • オンラインヘルプを良く読みましょう。"Columns can be specified by name, number or by a logical vector:" って書いてありますよ。Example の最後の例も参照のこと。 -- 河童の屁は,河童にあらず,屁である。? 2012-01-16 (月) 16:47:01
    > merge(x, y, by.x = c("name1", "year1"), by.y = c("name2", "year2"),
    +       all = TRUE, sort = FALSE)
       name1 year1 test1 test2
    1 tanaka  2000     1    11
    2 tanaka  2001     2    12
    3 tanaka  2005     3    13
    4 suzuki  2000     4    14
    5 suzuki  20, 05     5    15
    6 suzuki  2008     6    16
  • ありがとうございました。よくヘルプを読んでおらず、お手数おかけしました。 -- zou? 2012-01-16 (月) 17:34:40

Rcmdrへの日本語を含むファイルパスのデータのインポート

mamiy? (2012-01-16 (月) 11:52:48)

いつもお世話になっております。

R2.13.2を使用していましたが、最近、R2.14.1に変更しました。
R2.13をアンインストールしてから、R2.14.1をインストールしたのですが、Rcmdrにて、日本語を含むパスのファイルのデータインポートでエラーが出ます。

[3] エラー:  
  <86><e3><82>ケ繝育畑繝<87>繝シ繧ソ/test.csv", header=TRUE, sep=",",
  na.strings="NA", dec=".", strip.white=TRUE)に不正なマルチバイト文字があります

R2.13.1でもR2.13.2でもエラーはなく、日本語を含むファイルパスのものも、データインポートできていたのです。何か設定などしなければいけないのでしょうか。
データのインポートを実行した際にRコマンダーのスクリプトウィンドウに表示されるスクリプトを選択して、右クリックで「実行」を選択すると、エラーは出ません。アクティブデータセットには、セットされませんが。
ご存じの方、おられましたら、お教えください。よろしくお願いいたします。
sessionInfo()の結果は

R version 2.14.1 (2011-12-22)
Platform: i386-pc-mingw32/i386 (32-bit)

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

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

よろしくお願いいたします。

forループとplotの組み合わせを高速化したい

宗二? (2012-01-15 (日) 16:02:34)

よろしくお願い致します。下のプログラムは、2列×10行の配列bを作り、要素が999の行で区切られたそれぞれの部分を線プロットしています。

a1 <- seq(1, 10, by = 1)
a2 <- seq(1, 5.5, by = 0.5)
b <- cbind(a1, a2)
b[1, ] <- b[4, ] <- b[10, ] <- 999
separator <- which(b[, 1] == 999)
for (i in 1 : (length(separator) - 1)) {
    data <- b[(separator[i] + 1) : (separator[i + 1] - 1), ] 
    if (i == 1) {
        plot(data, xlim = c(1, 10), ylim = c(1, 10),
             type = "l")
    } else {
        par(new = TRUE)
        plot(data, xlim = c(1, 10), ylim = c(1, 10),
             type = "l", axes = F, ann = F)
    }
}

このサンプルのように区切りの数が少なく、forループの数が少なければ問題ないのですが、区切りの数が莫大になると、作図するのにかなり時間がかかってしまいました。そこで、forループを使わないで高速化できないか考えたのですが、具体的な方法が浮かばず悩んでいます。何か高速化するいい方法、もしくはアイディアがあればご教授お願いします。

  • b[, separator] <- NA; plot(b, type = "l") -- 2012-01-15 (日) 17:34:44
  • なるほど。999などの実数ではなく、NAだと自動で除外してくれるんですね。初歩的な質問で失礼しましたが、ご教授ありがとうございました。 -- 宗二? 2012-01-15 (日) 17:54:11
  • 代入(付値)に = を使うとか,カンマの後に空白を置かないのは,悪しきプログラミングスタイルです。
  • 悪文失礼しました。訂正ありがとうございます。 -- 宗二? 2012-01-15 (日) 18:57:47

ロジスティック回帰?

竹下? (2012-01-15 (日) 08:03:21)

こんにちは。
response variable が割合 (p) なのですが、 lm( log(p / (1-p)) ~ x ) とするのは統計学的に良いやり方なのでしょうか?

  • 悪いやり方です。1/10 と 10/100 や 100/1000 などは統計学的に全く意味が違います。元データを使うべきです。統計学においては常識です。
    また,プロビットモデルやロジスティックモデルを意図しているのでしょうが,lm ではなく,glm を使うべきです。 -- 河童の屁は,河童にあらず,屁である。? 2012-01-15 (日) 18:09:31
  • どうもありがとうございます。たしかにおっしゃるとおりです。もし、分母がわからない場合はどうするのがいいのでしょうか?つまり、とある機械がはじき出した数値を使うのですが、その数値が反応をしめした細胞の割合なのです。分母は一定という仮定を暗にしています。 -- 竹下? 2012-01-16 (月) 10:51:56

場合分けに応じた新しい列を追加

asap? (2012-01-12 (木) 18:36:36)

今ある行列irisに、n列の場合分けに応じた新しい列を追加したいのですが、どのようにすればよいでしょうか
新しい列の変数には次のような値を入れたいのですが

if (iris$Species[i] == "setosa") {
    iris$Sp[i] <- 1
} else {
    iris$Sp[i] <- 0
}
  • iris$Sp <- ifelse(iris$Species == "setosa", 1, 0) または,
    iris$Sp <- (iris$Species == "setosa") + 0 でよいでしょう -- 河童の屁は,河童にあらず,屁である。? 2012-01-12 (木) 19:32:07
  • どうもありがとうございました -- asap? 2012-01-16 (月) 16:31:35

geoRパッケージの標本バリオグラムについて

まち? (2012-01-11 (水) 21:49:52)

geoRパッケージのvariogで標本バリオグラムの計算を行うと最大距離を持つポイントが省かれてしまいます。
同じデータでgstatパッケージvariogramを使うと省かれません。
パラメータの指定が悪いのでしょうか?
自己相関が無くなる距離なので推定には問題ないと思いますが気になります。
よろしくお願いします。

library(geoR)
library(gstat)
# データの読み込み
data(ca20)
# geoR
vcloud <- variog(ca20)
(vcloud)
plot(vcloud)
# gstat
ca20gstat <- cbind(ca20$coords[, "east"], ca20$coords[, "north"],
                   ca20$data)
colnames(ca20gstat) <- c("east", "north", "data")
ca20gstat <- as.data.frame(ca20gstat)
vfgstat  <- variogram(data ~ 1, loc = ~east+north, data = ca20gstat,
                      cutoff = vcloud$max.dist,
                      width = vcloud$max.dist / 13)
(vfgstat)
plot(vfgstat)

下記の 13 行目で geoR の場合 $n が 12 点でなく 11 点になってしまいます。
geoRの場合

  $n     $u       $v
1   543   43.77376  55.50552
2  1648   131.3213  78.09254
3  2364   218.8688  97.05838
4  2246   306.4163  117.1554
5  2531   393.9638  129.0646
6  2152   481.5114  146.4889
7  1708   569.0589  151.9713
8  1309   656.6064  153.6482
9   694   744.1539  144.7442
10  343   831.7014  146.8878
11  144    919.249  131.8958
12   59   1006.796  139.2288
13   11   1094.344  139.2727

gstatの場合

     np       dist     gamma
1   543   60.35719  55.50552
2  1648  132.58886  78.09254
3  2364  220.90992  97.05838
4  2246  305.65494 117.15539
5  2531  391.80321 129.06460
6  2152  482.02453 146.48885
7  1708  568.46999 151.97131
8  1309  652.62969 153.64820
9   694  739.59074 144.74424
10  343  826.14460 146.88776
11  144  913.61963 131.89583
12   59  995.10190 139.22881
13   12 1082.94416 165.16667

使用環境

R version 2.12.1 (2010-12-16)
Platform: i386-pc-mingw32/i386 (32-bit)
gstat_1.0-8
geoR_1.6-35

R-2.14以降、Tcl/Tkのスライダーを使うとグラフが一部消える

hiro? (2012-01-10 (火) 16:39:38)

R-2.14.1 for Windows(32bit)を使っています.
R-2.13.2までは、以下のサンプルでスライダーを動かすと、グラフはヒストグラムとカーネル密度共に滑らかに表示されます.
しかし、2.14以降、スライダーを動かしている間は一部のグラフが表示されなくなりました.この例ではカーネル密度が時々消えます.
グラフが複雑化すると、目立って見苦しくなります.
複数のWindowsPC(XP/Win7)で試しましたが、100%再現します.
もし解決策を御存知の方がいらっしゃれば、ご教示頂けないでしょうか.
宜しくお願いします.

library(tcltk)
draw.graph <- function(...) {
  upper <- as.double(tclvalue(Slider))
  hist(x, freq = FALSE, ylim = c(0, upper),
       col = "cyan", border = "white")
  lines(den, lwd = 3)
}
x <- rnorm(200)
den <- density(x)
tt <- tktoplevel()
Slider <- tclVar("0.5")
slider <- tkscale(tt, from = 0.1, to = 1,
            resolution = 0.01, showvalue = TRUE,
            variable = Slider, orient = "horizontal",
            command = draw.graph)
tkgrid(tklabel(tt, text = "upper"), sticky = "w")
tkgrid(slider)
tkfocus(tt)
  • CRANには現在tcltkというパッケージはなく、代わりにtcltk2というパッケージがあります。代わりにつかったらどうなりますか。私の場合(Linuxですが)うまく動くようですが。 -- 2012-01-10 (火) 17:50:59
  • tcltkパッケージはR本体にバンドルされるものです(Rコマンダーでも使われます)。tcltk2パッケージはtcltkパッケージにdependしますので、tcltkパッケージの完全な代替にはなり得ないと思います。 -- hiro? 2012-01-10 (火) 18:44:23

添付ファイル: filenorth.csv 674件 [詳細] fileerror2.png 1055件 [詳細] filecmdscale.png 1069件 [詳細] filebarplot2.png 539件 [詳細] fileexample-cp932.Rnw 546件 [詳細] filehtml.png 1015件 [詳細] fileloglog2.png 1258件 [詳細] fileerror.png 1063件 [詳細] fileboxplot.png 1375件 [詳細] fileexample.png 1184件 [詳細] filestaxlab01.png 1412件 [詳細] filechclust01.png 1188件 [詳細] fileRnw.png 1132件 [詳細] filebakaexcel.png 569件 [詳細] fileboxplot2.png 1262件 [詳細] filehist.png 1380件 [詳細] filerotated.png 1429件 [詳細] filebarplot1.png 1132件 [詳細] fileスクリーンショット 2012-06-09 22.08.55.png 492件 [詳細] filefactor.png 1422件 [詳細] filejibundesettei.png 1141件 [詳細] filealpha.png 1103件 [詳細] fileloglog.png 1275件 [詳細] fileスクリーンショット 2012-11-20 20.03.00.png 792件 [詳細] filebiplot.png 567件 [詳細] filejibundesettei.png.png 639件 [詳細] fileoutput.png 675件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Google
WWW を検索 OKADAJP.ORG を検索
Last-modified: 2015-03-01 (日) 01:15:59 (1569d)