R および RjpWiki に関する質問コーナー

過去の記事のアーカイブ


Q&A (初級者コース)/13 の目次


場合分けに応じた新しい列を追加

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) でよいでしょう -- 河童の屁は,河童にあらず,屁である。? 2012-01-12 (木) 19:32:07

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

メモリの割り当てについて

kate? (2012-01-06 (金) 17:47:23)

メモリーのエラーがでます。

エラー:  サイズ 176.4 Mb のベクトルを割り当てることができません 
> memory.limit()
[1] 2047
> memory.size()
[1] 817.03

上記のエラーを疑問に思うのですが、2047MBの割り当てに対して、現在817MB使用で、あと約1200MB使えるという認識は違うのでしょうか?解決策を教えていただけないでしょうか
Win vista 32bit ,R2.14.1です。

  • WindowsではRは使っていませんから憶測ですが、そもそも搭載メモリ量は2GBですか。だとすると他のプログラムが使っているメモリの事を忘れてはいませんか。他のプログラムをできるだけ少なくして見たら結果が変わるかもしれません。 -- 2012-01-06 (金) 21:38:46
  • ありがとうございます。おっしゃる通りでした -- kate? 2012-01-07 (土) 08:37:16

gstatライブラリーのvariogramについて

Yasu? (2012-01-05 (木) 14:41:54)

データとして(東経,北緯,高さ,値)の3次元空間の座標値と属性値からなるものを解析対象としています。
このデータに対して,東経,北緯,高さから計算される2点間の距離を尺度としてバリオグラムを計算したいのですが,どのようにすれば良いのか分かりません。
東経,北緯から計算される距離を用いたバリオグラムの計算はできました。

  • help(variogram)のサンプルコードを参考にして以下のようにすれば良いのでは。 -- 2012-01-05 (木) 18:17:15
    > data(meuse)
    > variogram(log(zinc) ~ x + y + elev, meuse)
  • ありがとうございました。 -- Yasuo? 2012-01-06 (金) 09:11:06

繰り返し処理について

manabe? (2012-01-05 (木) 14:11:49)

month <- c("1月", "2月", "3月", "4月", "5月", "6月",
           "7月", "8月", "9月", "10月", "11月", "12月")

全ての『月』の文字を取り除くにはどのようにすれば良いのでしょうか?
逆に、1:12を使って上記のベクトルを作るにはどのようにすれば良いのでしょうか?

  • sub("月", "", month) と paste(1:12, "月", sep="") -- 河童の屁は,河童にあらず,屁である。? 2012-01-05 (木) 14:26:46
  • ありがとうございました。大変助かりました。 -- manabe? 2012-01-05 (木) 14:53:56

変数を使って,levels()などの関数を使う方法

ぞうに? (2012-01-05 (木) 01:54:36)

いくつかのデータセットがあり各変数のlevels()を求めたいのですが,for文を使ってはできないのでしょうか?よろしくお願いします.
例えば,以下のデータセットがあります

sex    <- c("F", "F", "M", "M", "M")
height <- c(158, 162, 177, 173, 166)
weight <- c(50, 50, 60, 60, 70)
( x    <- data.frame(SEX=sex, HEIGHT=height, WEIGHT=weight) )

求めたいことは以下の事なのですが,

levels(factor(x$SEX))
levels(factor(x$HEIGHT))
levels(factor(x$WEIGHT))

イメージとしては以下のような形で求めたいのですが,うまくいきません.for文を使ってできないでしょうか?

colname <- names(x)
for(i in 1:3) {
  levels(factor(x$colname[i]))
}

以下,参考にしましたが解決できませんでした
http://q.hatena.ne.jp/1316156944

  • x[, colname[i]]とすればいいのです。もっといえばx[, i]でOK。そもそもforを使わずにlapply(lapply(x,factor),levels)でもOKでは? -- 2012-01-05 (木) 02:03:17
  • 解決しました.特に後者が参考になりました.どうもありがとうございました -- ぞうに? 2012-01-05 (木) 03:10:50
  • lapply を二重に使うのは初めてみました。sapply(x, function(z) levels(factor(z))) の方がわかりやすいかな。 -- 2012-01-05 (木) 10:23:55

function定義と代入の違い

Aizawa? (2012-01-03 (火) 00:30:20)

functionの使用方法が理解できず悩んでいます。
abc <- function()(print("ABC")) と関数定義をすれば、> abcと入力した時点でprint("ABC")が実行されて"ABC"と返ってきそうな気がします。しかし、実際には、function()(print("ABC"))、と返ってきます。これだと、abcにfunction以下の文字式が代入されているだけに想えます。print文が関数として登録されているのではないようでしょうか。何か、関数定義に関して基本的なことを勘違いしているように想われます。全く初歩的な質問で恐縮ですが、どなたか疑問を解いて頂けると嬉しいです。

  • ついでに言えばprint文を囲む丸括弧は余計(というより間違い)です。 -- 2012-01-03 (火) 08:22:51
    > abc <- function() (print("ABC"))
    > abc()
    [1] "ABC"
    [1] "ABC"
    > abc <- function() {print("ABC")}
    > abc()
    [1] "ABC"
    > abc <- function() print("ABC")
    > abc()
    [1] "ABC"
  • print文を丸括弧で囲うと "ABC" が2度出るのはどういう理由ですか? -- 将門? 2012-01-03 (火) 09:19:18
  • そう言う仕様なんです。以下を参照 -- 2012-01-03 (火) 10:12:52
    > (a <- 999)
    [1] 999
    > print(a <- 999)
    [1] 999
  • わかりました。ありがとうございます。 -- 将門? 2012-01-03 (火) 12:42:36
  • つまり、最初の出力 "ABC" は print("ABC") の出力で、二度目の "ABC" は print("ABC") の返り値 "ABC" にたいするコマンド ("ABC") の出力です。-- 2012-01-03 (火) 15:30:29
  • 御礼がおそくなりました。 -- Aizawa? 2012-01-08 (日) 11:38:03
  • 御礼が遅くなりました。 -- 2012-01-08 (日) 11:40:08
  • AAA -- 2012-01-08 (日) 11:47:53
  • コメントは1行だけでしょうか? 長くなるときは出だしだけ投稿して編集ボタンを押すとのことですが、編集ボタンがどこにあるのか、わかりません。 -- Aizawa? 2012-01-08 (日) 12:06:12
  • 初めてのページを訪れたら,ページの最初に書いてある注意事項などを良く読み,それまでの投稿例を観察するのがよいでしょう。ページをよく観察する。
    あなたの知りたいことは,このページの先頭から四行目にある。
    Q&A (初級者コース)/13
    http://www.okada.jp.org/RWiki/?%A3%D1%A1%F5%A3%C1%20%28%BD%E9%B5%E9%BC%D4%A5%B3%A1%BC%A5%B9%29%2F13
    [ トップ | Tips紹介 | 中級Q&A | 初級Q&A | R掲示板 | 日本語化掲示板 | リンク集 ]
    [ リロード ]   [ 新規 | 編集 | 凍結 | 差分 | ファイル添付 ]   [ 一覧 | 検索 | 単語検索 | 最終更新 | バックアップ | ヘルプ ] 
    やり損なった不細工な投稿も編集できる。 -- 河童の屁は,河童にあらず,屁である。? 2012-01-08 (日) 23:05:43

なぜか発生した誤差で、四捨五入が妨げられる

MasHARA? (2011-12-30 (金) 20:55:44)

Rのroundで小数第2位を丸めるために、round(1.05,1) を実行すると、日本の四捨五入とは異なり、1.1ではなく、1.0になります。
これは、切り上げ後の値の末尾の数字が偶数になるようにする、「JIS Z 8401」の2.c)で決められている丸め方のようですが、Rのプログラミングの練習を兼ねて、自分で四捨五入のための関数を作ることにしました。 正の数のみを扱うものとして、以下のような関数を作りました。

> gonyu <- function(x, digits = 0) {
>	     ceiling(x * 10 ^ digits) * 10 ^ (-digits) - 
+           round(ceiling(x * 10 ^ digits) *
+           10 ^ (-digits) - x, digits)
>	}

作業環境は、Windows XP SP3で、version 2.13.0のRを使用しています。
この関数を試したところ、ほとんどの場合は問題なく四捨五入になりますが、時々、以下のように四捨五入にならない場合が発生しました。
例えば、関数の定義後、次の式を評価すると、

> gonyu(1.45, 1)

返ってきた値は、1.4 でした。

> gonyu(2.45,1)

であれば、ちゃんと 2.5 が帰ってきます。そこで、問題の発生した

> x <- 1.45
> digits <- 1

としてから、関数の中を一つ一つ見ていきました、すると、

> ceiling(x * 10 ^ digits) * 10 ^ (-digits) - x

が 0.05 を返すものの、

> round(ceiling(x * 10 ^ digits) * 10 ^ (-digits) - x, digits)

は、なんと 0.1 を返したのです。

> round(ceiling(1.45 * 10 ^ 1) * 10 ^ (-1) - 1.45, 1)

も、なぜか0.1を返してきます。

> round(0.05, 1)

を実行すれば、ちゃんと、0 (ゼロ)を返してきます。

> ceiling(1.45 * 10 ^ 1) * 10 ^ (-1) - 1.45

は 0.05 を返してくるが、表示されていない桁で誤差を含むのでは、と思い、

> ceiling(1.45 * 10 ^ 1) * 10 ^ (-1) - 1.45 - 0.05

を実行すると、返された値は、4.163336e-17 でした。
後ろにある引き算、2つをカッコでまとめて、

> ceiling(1.45 * 10 ^ 1) * 10 ^ (-1) - (1.45 + 0.05)

とすると、返される数字は、ちゃんと 0 です。
一体、この表示されない誤差は生じたり、生じなかったりするのでしょう。御存じの方が居られれば、御教授のほど、御願い申し上げます。

  • 浮動小数点の丸め誤差です。 -- 2011-12-30 (金) 23:05:02
  • > 誤差は生じたり、生じなかったり
    実数計算では避けられないもの。計算順序などを工夫することによって,軽減されることもあります。どうしても必要なら,固定小数点(整数)演算をするとよいでしょう。 -- 2011-12-31 (土) 09:22:02
    > func <- function(x, n)
    + {
    + 	a <- x * 10 ^ (n + 1)
    + 	b <- a - floor(a / 10 ^ n) * 10 ^ n
    + 	return(round(a + 5 * (b >= 5), -1) / 10 ^ (n + 1))
    + }
    > func(1.45, 1)
    [1] 1.5
    > func(1.449999999999999, 1)
    [1] 1.4
    > func(2.5, 1)
    [1] 2.5
    > func(2.449999999999999, 1)
    [1] 2.4
  • 御回答を賜り、有難うございます。~「浮動小数点」、「多倍長演算」、「固定小数点」について調べるなかで、なるほど、十進数で0.1と書けるものも、二進数にすると循環小数になるので、扱い方が簡単ではないことを知りました。 -- MasHARA? 2011-12-31 (土) 09:38:18

scatterplot3dについて

takayuki? (2011-12-27 (火) 20:39:17)

3次元の散布図を書くのに,scatterplot3dを使用しています。Z軸についてグラフを回転させたいのですがそのようなことは可能でしょうか。もし可能であればご教授お願い致します。

  • rglパッケージのplot3dではどうでしょうか? -- Iona? 2011-12-29 (木) 01:49:52

スクリプトからのコンソール画面消去は実行することが出来ますか?

Montecarlo? (2011-12-26 (月) 19:35:10)

現在では以下のマウス操作またはショートカットにてコンソール画面を消去することが出来る事は確認しています。

「編集」→「コンソール画面を消去」
または
「Ctrl」+「L」

この作業をスクリプトの命令から再現することは出来ますでしょうか。
ご存じの方がいらっしゃいましたら、よろしくお願い致します。

  • あなたはキット Windows なんだろうから,http://onertipaday.blogspot.com/2007/05/how-to-clear-screen-in-r.html に書かれている方法でできるんじゃないかな?
    Mac だとできなかったけど。
    それでもうまくいかなかったら clear screen R で検索すれば見つかるかも。 -- 河童の屁は,河童にあらず,屁である。? 2011-12-26 (月) 19:50:42
  • 「河童の屁は,河童にあらず,屁である」さん、素早い回答ありがとうございます。
    ご指摘のWebPage?も参考にしてみます。コマンドプロンプトの「cls」ように簡単には行かないようですね。
    ご回答ありがとうございました。 -- Montecarlo? 2011-12-26 (月) 20:14:01
  • http://onertipaday.blogspot.com/2007/05/how-to-clear-screen-in-r.html に書かれているどちらの方法でも,できましたね。 -- 河童の屁は,河童にあらず,屁である。? 2011-12-27 (火) 11:08:53

例えば dgamma の lse を求める

(2011-12-22 (木) 17:40:53)

回帰解析をしたいのですが、plot(x,y) を見ていたら、ガンマ分布の pdf を当てはめてみたくなりました。2つパラメータがありますが、それぞれを最小二乗法で求めるにはどうしたらいいのですか?

さらに、例えば勝手に自分が作った関数のパラメータを使うことも可能ですか?でっちあげの例ですが、

y <- function(x,a,b){ log(a*x + x^-(a/(2*b)) } 

として、x と y が与えられた時に、a と b を推定したいということです。

よろしくお願いします。

  • nls という関数を調べればよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2011-12-22 (木) 19:11:59
  • 河童の屁は,河童にあらず,屁である。さん、どうもありがとうございました。 -- 2011-12-23 (金) 00:59:01

type="b"のplotと整合するlegend()の使い方

T? (2011-12-21 (水) 20:02:30)

超初心者質問で大変恐縮なのですが、ヘルプを読んでも解決せず、質問します。
例えば、

matplot(outer(1:5, 1:3), type="b", pch=1:3, lty=1:3)
legend("topleft", LETTERS[1:3], pch=1:3, lty=1:3, col=1:3, seg.len=4)

とすると、左上に凡例が表示されますが、線にシンボルが上書きされた type="o" のような表示になります。
グラフは type="b" で描いていますので、凡例も同様にしたいのですが、legend() のヘルプを読む限りは、type="b" と同じ表現になるオプションはないようです。
もちろん、legend(..., type="b") とすると、エラーになります。
上記 2 行の出力画像を貼った方がよければ貼ります。
ヘルプの見落としのような気もいたしますが、よろしくお願いします。

  • 解答ではありませんが,私は type="o" の方がキレイだと思います。 -- 河童の屁は,河童にあらず,屁である。? 2011-12-21 (水) 21:30:49
  • できないようです。legend関数の中身を見てみましたが、線をsegment関数で描いているのでtype = "b"の形式にはできないです。諦めるか無理矢理作るか(なかなか座標の計算等が面倒だと思います)でしょうか。 -- Iona? 2011-12-22 (木) 03:22:57
  • 回答ありがとうございます。座標を計算して、自作する方向も検討したいと思います。 -- T? 2011-12-22 (木) 09:45:12
  • 自作しました。汎用性は低いですが、こんな感じで他のグラフにも対応しようと思います。ありがとうございました。 -- T? 2011-12-22 (木) 10:24:02
    matplot(outer(1:5, 1:3), type="b", pch=1:3, lty=1:3)
    a <- legend("topleft", LETTERS[1:3], pch=1:3, lty=1:3,
                col=1:3, seg.len=4, plot=FALSE)
    i <- par("cxy")
    sapply(1:3, function(j) {
      with(a, {
        segments(rect$left+i[1]/2, text$y[j], rect$left+i[1]*1.9,
                 text$y[j], col=j, lty=j)
        segments(rect$left+i[1]*3.1, text$y[j], rect$left+i[1]*4.5,
                 text$y[j], col=j, lty=j)})
    })
    points(rep(a$rect$left+i[1]*2.5, 3), a$text$y, pch=1:3, col=1:3)
    text(a$text$x, a$text$y, LETTERS[1:3])
    with(a$rect, lines(c(left+w, left+w, left), c(top, top-h, top-h)))

cat関数の特殊文字について

Montecarlo? (2011-12-21 (水) 18:10:04)

文字列を表示する「cat」関数があると思いますが、大文字小文字のアルファベットを調べたところ、以下3個の文字が何を表しているかGoogle等で調べてみても分かりませんでした。
「\b」「\r」「\v」
実行コード

cat("\a") #音が鳴る
cat("\b") #不明
cat("\f") #フィード文字(半角スペース?)
cat("\n") #改行
cat("\r") #不明
cat("\t") #タブ
cat("\v") #不明(半角スペース?)

この3個特殊文字の意味をご回答頂ければ幸いです。よろしくお願い致します。

  • 「ASCII 制御文字」で検索します。これらを使うと、プログレスバーを作成するとか、いろいろなことができます。 -- 2011-12-21 (水) 20:04:12
  • 回答ありがとうございます。ご指摘の「エスケープシークエンス」で検索したら、全て理解出来ました。ありがとうございました。 -- Montecarlo? 2011-12-21 (水) 20:15:39

結果の解釈

いぬ? (2011-12-21 (水) 10:18:21)

成績が勉強時間の2乗に比例しているのか3乗に比例するのか調べたいです。
式としては
y=a0+a1*x+a2*x^2
y=a0+a1*x+a2*x^2+a3*x^3
という式です。

手元の資料からは決定係数と調整済みの決定係数が1に近い方がいい、特に調整済みの決定係数が近いほうがいいと読み取れます。
また、t検定、F検定、AICも見たほうがいいと思うのです。

どれを1番優先してみればいいのでしょうか?
それとも違うものを見たほうがいいのでしょうか?
どなたか教えてください。

あとRでanovaの結果の見方がわかりませんので教えていただきたいです。

  • lrtest(f1, f2) でいいんじゃないかしら? -- いいんじゃない? 2011-12-21 (水) 15:45:09
  • lrtest() は rms パッケージにある尤度比検定をする関数ですね。 -- 2011-12-22 (木) 17:16:13

RDA解析の解釈

ほし? (2011-12-21 (水) 00:13:46)

初めて投稿させていただきます。
パッケージVeganのRDAを用いた解析・解釈に苦戦しております。
20以上のデータを用いて解析を行い、plotで表にしました。
しかし、表には4つ程のデータ名しか表示されません。
また、summaryで詳細な情報を見ても、表示されたデータ名についてしか書かれていません。
これは、表示されなかったデータは取るに足らないデータであったということなのでしょうか?
初歩的な質問で恐縮ですが、どなたかアドバイスの程よろしくお願いいたします。

  • どのようなスクリプトで解析を行ったのかを書いておくとアドバイスがもらえやすいですよ。

    > plotで表にしました。
    plotで表にするとはどういうことでしょうか。グラフではないのですか?
    rda関数のExamplesを実行してみても表にはなりませんが。

    > データ名 というのは具体的に何を指しているのでしょうか。 -- Iona? 2011-12-21 (水) 06:17:14

  • 失礼しました。解析は以下のように行いました。
    > test <- read.csv("sample.csv", header=TRUE, row.names="x")
    > testa <- read.csv("sample.csv", header=TRUE, row.names="x")
    > testb.rda <- rda(test~.testa, nangteng, scale=TRUE)
    > testb.rda
    ここで、次に表示される
    Call: 
    にはtestbのデータ名(エクセル第二行目からの第一列です。サンプル名といった方がよかったかもしれません。。)はすべて表示されますが、
    > plot(testb.rda)
    によってグラフ(表ではなくグラフでした。申し訳ありません。)を表示したところ、testbのデータだけ質問のようになってしまいます。
  • 書き込んだときはあとから読み直した方がいいですよ。無駄なやりとりが増えますし。
    testbとはtestaの誤字ですよね。あとrda(test~.testa,...)のドットはミスですよね。

    その書き方だとnangtengは使用されませんが大丈夫ですか? data引数はyという名前の列を持つzというデータフレームを指定すると、
    rda(x ~ z$y)
    rda(x ~ y, data = z)
    と書けるというものです。

    rda関数のExamplesで試してみたんですが、
    dune.Manure <- rda(dune ~ Manure, data = dune.env)
    dune.Manure
    では、dune.envの行名は表示されませんが、summary()の間違いではないですか? でも、一度目の投稿によるとsummary()では表示されないんですよね? -- Iona? 2011-12-22 (木) 00:51:45

deprecatedとは?

S? (2011-12-20 (火) 18:14:37)

表を作って平均をとろうとすると、次のような警告がでます。

mean(<data.frame>) is deprecated

R2.13では出なかったのですが、R2.14で出るようになったと思います。これは何でしょうか?

  • 「データフレームに対して mean 関数はもう使えなくなりましたよ」ということです。
    これからは,
    colMeans か sapply を使ってね!というのですが,私もすぐには納得できませんねぇ。 -- 河童の屁は,河童にあらず,屁である。? 2011-12-20 (火) 21:32:28
    > mean(iris[,1:4])
    Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
        5.843333     3.057333     3.758000     1.199333 
     警告メッセージ: 
    mean(<data.frame>) is deprecated.
     Use colMeans() or sapply(*, mean) instead. # これからは,こうしてね!という示唆
    > colMeans(iris[,1:4]) # つまり,こんな風にとか
    Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
        5.843333     3.057333     3.758000     1.199333 
    > sapply(iris[,1:4], mean) # こんな風にとか
    Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
        5.843333     3.057333     3.758000     1.199333 
    愚かなるユーザは,「エラーメッセージを出して,正解を出す」のなら,「エラーメッセージを出さずに正解を出せばいいじゃないか」と思うのです。お偉いさんは,何を考えているんだろうか。ストイックなんでしょうなぁ。でも,愚かなる衆生はそんなのに従わされなくても言いと思うのだけど。
    現在の mean.data.frame の定義は
    > mean.data.frame
    function (x, ...) 
    {
        msg <- "mean(<data.frame>) is deprecated.\n Use colMeans() or
                sapply(*, mean) instead."
        warning(paste(msg, collapse = ""), call. = FALSE, domain = NA)
        sapply(X = x, FUN = mean, ...)
    }
    となっているわけだけど,
    > mean.data.frame
    function (x, ...) 
    {
        sapply(X = x, FUN = mean, ...)
    }
    にすれば良いだけだろうと思うのだ!
    実は,sd 関数にも同じ問題がある。
  • エラーメッセージではなく、warningです。deprecatedっていうのは、「これからつかえなくなるかもよ、だからもう使うなよ」っていうことなので、warningを出さないと意味が無いでしょう。mean(data.frame)に関しては、sd/medianとかとの絡みで混乱を起こしやすいということでdeprecateになりました。 -- 2011-12-20 (火) 22:20:01

一般化線形モデルの推定結果の図示(offset項を入れた時)

カス? (2011-12-20 (火) 14:03:20)

offset項を入れた時の推定結果を図示するには、どのようにすればよいのでしょうか?
二項分布でリンク関数を"cloglog"にした場合と、ポアソン分布(リンク関数はデフォルトの"log")の場合についてご教授いただけないでしょうか?
例えば、二項分布でoffsetなしの場合、

bi <- glm(y ~ x, family = binomial(link = "cloglog"))
lines(x, 1-exp(-exp(b + a*x)))

とすれば良いと思うのですが、二項分布でoffsetありの場合

bioff <- glm(x ~ y + offset(log(z)),
             family = binomial(link ="cloglog"))

この推定結果の図示はどのようにすればよいでしょうか?
また、同様にポアソン分布でオフセットなしの場合、

po <- glm(y ~ x, family = poisson)
lines(x, exp(b+ax))

とすればよいと思うのですが、

pooff <- glm(y ~ x + offset(log(z)), family = poisson)

の場合はどうでしょうか? よろしくお願い致します。

read.csvで、header=TRUE, row.names=1として読み込んだとき

matak? (2011-12-15 (木) 12:15:41)

CSVファイルを例えば、

> data <- read.csv("read_sample.csv", header=TRUE, row.names=1)

という風に読み込んだ時、CSVファイルの一番左上のセルだけ読み込まれないですよねぇ。
結果、読み込んだ行列で何らかの演算を行って、書き込んだCSVファイルも一番左上のセルが空白になってしまいます。
どうすれば一番左上のセルも読み込み&書き込みできるでしょうか。
読み込むCSVファイルの1行目および1列目は文字列で、第2行第2列目以降から数値データなので、header=TRUE, row.names=1で読み込んだ方が都合がいいのですが。

  • > CSVファイルの一番左上のセルだけ読み込まれないですよねぇ。
    ではなく,ファイル中の row.names で指定した列を「行名」とするからですよねぇ。あなたのいう「一番左上のセル」って,存在しないのですよ。データフレームの1行1列目はデータの一番左上 data[1,1] であって,あなたのいう「一番左上」ではありません。row.names を指定しなければ,番号が行名になり,ファイル中の1列目もデータフレームの1列目になります。しかし,それでは数値演算する際に,「都合が悪い」というのでしょう。でも,そういう仕様なのだからしようがない(笑)
    結局のところ「存在しないものは書けないし,書く必要はない」ということではないですか?
    ちなみに,read.csv は header=TRUE がデフォルトなので,header=TRUE を指定する必要はありません。。 -- 河童の屁は,河童にあらず,屁である。? 2011-12-15 (木) 13:50:55
  • オプションとしては存在しませんが、いくらでも方法はあるでしょう。 -- Iona? 2011-12-21 (水) 04:03:49
    data <- read.csv("sample.csv")
    data[, -1] <- function(data[, -1])
    write.csv(data)

行列の行に対してcumsumを適用することは出来るでしょうか?

Montecarlo? (2011-12-12 (月) 21:25:13)

初の投稿で、なにぶん至らない点があるかと思いますがよろしくお願いします。
使用環境は以下です。

R version 2.14.0 (2011-10-31)
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 

質問になりますが、行列の行に対してcumsumを適用することは出来るでしょうか?

> x <- c(1, 1, 1, 0, 0, 0, 0, 1, 1, 1,
         1, 1, 0, 1, 1, 1, 1, 0, 1, 0,
         1, 0, 0, 1, 0, 1, 1, 0, 1, 0,
         0, 0, 0, 1, 1, 1, 0, 1, 1, 0,
         0, 1, 1, 0, 0, 1, 1, 0, 0, 1,
         0, 1, 0, 1, 1, 0, 1, 0, 0, 1,
         1, 0, 0, 0, 0, 1, 0, 0, 1, 0,
         1, 1, 0, 0, 1, 0, 0, 0, 1, 1,
         1, 0, 1, 0, 0, 1, 1, 0, 0, 1,
         1, 0, 0, 0, 0, 1, 1, 1, 0, 0)
> y <- matrix(x, nrow=10, ncol=10, byrow=TRUE)

を実行すると、私の意図通りに10*10の行列ができあがります。
ここからが詰まっているところです。
この「y」の行に対するcumsumを適用したいと思っています。
列に対するcumsumは

> apply(y, 2, cumsum)

によって計算出来ていることは確認しています。
ですが

> apply(y, 1, cumsum)

ではうまくいかないのです。(結果はapply(y, 2, cumsum)に似ていますが違った答えが返ってきます。)
質問事項としてまとめると以下の点となります。
1.行に対してcumsumを適用することは可能か(cumファミリー全般)
2.列はうまくいくのに行でうまくいかない事からすると、cumsumの挙動はどのようになっているのか
以上2点について分かる方がいらっしゃいましたらお願い致します。

  • 結果をよく観察しましょう。
    行数列数が同じで結構大きいから分かりにくいので,以下のような小さな行列で実験してみればよいでしょう。
    > (y <- matrix(1:12, 3, 4))
         [,1] [,2] [,3] [,4]
    [1,]    1    4    7   10
    [2,]    2    5    8   11
    [3,]    3    6    9   12
    > apply(y, 1, cumsum)
         [,1] [,2] [,3]
    [1,]    1    2    3
    [2,]    5    7    9
    [3,]   12   15   18
    [4,]   22   26   30
    > t(apply(y, 1, cumsum))
         [,1] [,2] [,3] [,4]
    [1,]    1    5   12   22
    [2,]    2    7   15   26
    [3,]    3    9   18   30
    つまりのところ,t(apply(y, 1, cumsum))でよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2011-12-12 (月) 21:48:54
  • 「河童の屁は,河童にあらず,屁である。」さん、ありがとうございます。 cumsumに関する知識を深めることが出来ました。 とても感謝致します。 -- Montecarlo? 2011-12-12 (月) 22:01:21

readBin関数のサイズ指定

Alin? (2011-12-12 (月) 17:05:20)

C言語のint型、4バイト長のバイナリデータ(sample.bin)をreadBin関数を使って読み込もうとしているのですが、

> conn <- file("sample.bin", "rb")
> readBin(conn, integer(), n=100*100, size=4)

のようにして読み込むと正常な値が読み込まれず(100*100はデータの要素数です)、

> readBin(conn, integer(), n=100*100, size=2)

のようにして、sizeを2に指定すると、正常な値が読み込まれます。
これはRで扱うデータ型(?)の基本的な概念が、C言語等と異なっているからなのでしょうか?

  • > C言語のint型、4バイト長のバイナリデータ
    ああ,基本的な,勘違い。
    C の int は 2 バイト。R での integer は 4 バイト。4 バイト integer は C では long。 -- 河童の屁は,河童にあらず,屁である。? 2011-12-12 (月) 18:03:15
  • 仰るとおりでした。RではなくCで出力したデータの方の問題でした。勉強不足でご迷惑おかけしました。 -- Alin? 2011-12-13 (火) 11:41:22

ccfでp-value

vivaTS? (2011-12-12 (月) 13:32:48)

R64 2.14.0 (Lion)を使用しています。
ccfで計算される2変数の時系列相関のp値, 95%信頼区間を求めるには,どのような方法があるのでしょうか。

プロキシサーバーの設定について

? (2011-12-06 (火) 17:13:05)

お世話になります。
CentOSにR 2.13.1をインストールし、プロキシサーバー経由でパッケージのアップデートをしようとしています。
Rのインストールディレクトリに以下のコマンドを記述した.Rprofileを保存しているのですが、update.packeges()で「HTTPステータスは407 Proxy Authentication Requiredです」といわれて接続できません。

options(CRAN="http://cran.md.tsukuba.ac.jp/bin/windows/contrib/2.13")
Sys.setenv("http_proxy"="http://(アドレス):(ポート番号)")

また、.Rprofileを削除してRの起動直後の画面に上記のコマンドを入力しても接続できませんでした。
Windows XPのR 2.13.1ではマイドキュメントに上記の.Rprofileを保存することでアップデートが可能なことを確認しています。
Linuxの場合はWindowsと異なる設定が必要なのでしょうか?対応策をご存知であれば教えてください。
宜しくお願いします。

  • 自己解決しました。ホームディレクトリに置いた.Rprofileに Sys.setenv("http_proxy"="http://(ユーザID):(PASS)@(アドレス):(ポート番号)/") で接続できました。Windowsの場合はユーザIDとPASSを入力するためのウィンドウが開きますが、Linuxの場合はGUI環境であっても.Rprofileにあらかじめ記載していないとダメなようです。ご参考まで。 -- ? 2011-12-07 (水) 09:17:21

文字列ベクトルからの共通要素の抽出

K? (2011-12-06 (火) 10:29:04)

こんにちは。WinXP R 2.13.2を使用しています。
文字列ベクトルA,B,C・・・があり、これらに共通する要素を抽出したいと考えています。
例えば以下のような場合は"aaa"が共通しているので、"aaa"を抽出したいということです。

A <- c("aaa","aaaa","aaaaa")
B <- c("bbb","aaa","bbbbb")
C <- c("aaa","ccc","cccc")

実際には文字列ベクトルとその要素は数百個あります。apply()を使えばスマートに記述できそうな気はするのですが、どうにもできませんでした。
どなたか御助言を宜しくお願いします。

  • 文字列ベクトルがどのようなオブジェクトとしてまとめられているのか?例に挙げられたように,別々のベクトルになっているわけはないでしょう。文字列ベクトルの長さ(要素数)は全て同じなのかとか。
    いずれにせよ,スマートに記述しようというのは後の課題にして,以下のように intersect を繰り返し適用するのでまずは十分ではないでしょうか?要素数 n=500 個のリスト,各要素は要素数 503 の文字列ベクトル,各要素は 1 〜 5 文字の文字列という,相当大きいデータを作る。テストデータを作るのに 9 秒ほどかかるが,共通文字列の抽出にはわずか 0.05 秒ほど。プログラムを凝る必要はないということでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2011-12-06 (火) 11:28:38
    system.time({
    	### テストデータを作る
    	### 要素数 n=500 個のリスト
    	### 各要素は 503 個の要素を持つ文字列ベクトル
    	###   テストのため最後の 3 つ, foo, bar, baz は全ベクトルに含まれる
    	### 各要素は 1 〜 5 文字からなる
    	set.seed(1234567)
    	n <- 500
    	k <- 500
    	d <- vector("list", n)
    	for (i in 1:n) {
    		str <- character(k)
    		for (j in seq_along(str)) {
    			str[j] <- paste(sample(letters,
                             sample(5, 1), replace=TRUE), sep="", collapse="")
    		}
    		d[[i]] <- c(str, "foo", "bar", "baz")
    	}
    })
    system.time({
    	### 重複する文字列の抽出
    	ans <- intersect(d[[1]], d[[2]])
    	for (i in 3:n) {
    		ans <- intersect(ans, d[[i]])
    	}
    	print(ans)
    })
    実行結果は
    テストデータの作成にかかった時間
        ユーザ   システム       経過  
         9.297      0.257      9.508
    
    共通要素
    [1] "foo" "bar" "baz"
    
    共通要素を抽出するのにかかった時間
        ユーザ   システム       経過  
         0.049      0.001      0.055
  • ありがとうございました。ベクトルの要素数は全て同じです。Rではfor文ではなくapply()で処理した方がよいという話を聞いていましたが、わかりやすくて自分の記述しやすいほうが実用的かも知れませんね。 -- K? 2011-12-06 (火) 15:09:26

ヘッダに括弧が含まれるCSVから正しくヘッダを取得したい

ひろ? (2011-12-05 (月) 12:55:27)

ヘッダに括弧が含まれるCSVから正しくヘッダを取得したいのですが,方法がわからずに困っております.
下記例ではファイル中のヘッダは「ほげ(ほげ)」なのですが,read.csvで読み込むと「ほげ.ほげ.」と括弧→.となり困っております.
もし改善方法をご存知でしたらご教示いただければ幸いです.
環境:win7 64bit + R 2.14.0 64bit
調べたこと:?read.csvや?read.tableの結果からparenthes,bracket(丸かっこ)の単語がないか.googleで本サイト(site:)指定/指定なしに対して,「括弧 R言語 ヘッダ名or列名」で調べてみました.
testCSV.csvの中身は下記通りです.

ほげ(ほげ)
1
2
3


> read.csv("input/testCSV.csv", header=TRUE)
  ほげ.ほげ.
1          1
2          2
3          3
  • read.csv("input/testCSV.csv", header=TRUE, check.names=FALSE)でどうでしょう。 -- 竹澤? 2011-12-05 (月) 13:12:12
  • > 竹澤様.上記で解決いたしました.勉強不足でした.ありがとうございました. -- ひろ? 2011-12-05 (月) 13:23:10
  • 「ほげ(ほげ)」は好ましくないので「ほげ.ほげ.」と変換されているということを理解した上で、check.name=FALSEとされているでしょうか。もし、初級・中級レベルのRユーザであるなら、真にやむを得ない場合を除いて、check.nameをFALSEにすべきではないと思います。老婆心ながら。 -- 2011-12-05 (月) 17:02:46

column の名前を入力せずに lm()

笹川よつ斗? (2011-12-05 (月) 12:42:13)

例えば、

x <- data.frame( matrix(rnorm(500), ncol=10) )
names(x) <- c( sample(LETTERS[1:26], 9, FALSE), 'y' )

というデータがあります。
column の名前の 'y' 以外を入力せずに lm() を使うことは可能でしょうか?
大きなデータフレームから column をサンプルして繰り返し解析する、ということを試しています。 for loop の中で応用することになります。 今のところ以下のようにやっていますが、もう少し簡潔な方法があるものかと思い投稿しました。

f <- paste( 'y ~', paste(names(x)[1:9], collapse='+') )
lm( as.formula(f), data=x )
  • 一番「良い」説明変数の組を選びたいというのなら、step() 関数が便利なのでは。 -- 2011-12-05 (月) 13:15:24
    > x <- data.frame( matrix(rnorm(500),ncol=10) )
    > lmtmp <- lm(X10 ~ ., data=x)
    > step(lmtmp)
    Start:  AIC=-3.58
    X10 ~ X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8 + X9 
    
           Df Sum of Sq    RSS     AIC
    - X7    1    0.0288 31.227 -5.5375
    - X1    1    0.0427 31.241 -5.5154
    - X2    1    0.0650 31.263 -5.4796
    - X9    1    0.0659 31.264 -5.4783
    - X4    1    0.0936 31.291 -5.4340
    - X5    1    0.1595 31.357 -5.3287
    - X3    1    0.4099 31.608 -4.9310
    <none>              31.198 -3.5837
    - X6    1    1.3648 32.563 -3.4429
    - X8    1    8.1977 39.395  6.0814
    (途中省略)
    
    Step:  AIC=-16.17    ### AIC基準で最終的に選ばれたモデル
    X10 ~ X8 
    
           Df Sum of Sq    RSS      AIC
    <none>              33.405 -16.1657
    - X8    1    7.3309 40.736  -8.2455
    
    Call:
    lm(formula = X10 ~ X8, data = x)
    
    Coefficients:
    (Intercept)           X8  
       -0.04151      0.39186
  • ありがとうございました。説明不足で申し訳ありませんが、良いモデルを選ぶのではなくて、ランダムに選ばれたコラムの名前を効率的に lm() の式として使う方法を探しています。上記の f ~ paste( ) でできていることなのでこれでもいいのですが、1万回ほど繰り返すステップなのでこれで効率的なのか心配になりました。 -- 笹川よつ斗? 2011-12-05 (月) 14:09:09
  • y以外の全部の変数を独立変数にするには,lm(y~., data=x) とするのです。ちょー簡単。 -- 河童の屁は,河童にあらず,屁である。? 2011-12-05 (月) 14:26:23
  • こんなのがやりたいのですか?変数99個からランダムに9個を選んで回帰分析することを1万回繰り返します。 -- QDY? 2011-12-05 (月) 16:03:40
> x <- data.frame(matrix(rnorm(10000),ncol=100))
> Formula <- unique(sapply(seq(10^4),FUN=function(i) paste("X100 ~ ",
             paste(sort(sample(names(x)[-100],9)),collapse="+"))))
> res <- lapply(seq(10^4), FUN=function(i) lm(Formula[i],data=x))
> Formula[9999]; res[[9999]]
[1] "X100 ~  X20+X25+X30+X41+X55+X6+X68+X80+X99"

Call:
lm(formula = Formula[i], data = x) 

Coefficients:
(Intercept)          X20          X25          X30          X41          X55  
   0.054830     0.020898     0.036853     0.025012    -0.007347    -0.138181  
         X6          X68          X80          X99  
   0.013766     0.071437    -0.010897     0.083487  
  • 河童の屁は,河童にあらず,屁である。さん!  ちょー簡単じゃないですか!! ありがとうございます!!! QDYさん!まさにそんな感じのことがやりたかったのです。これまたありがとうございます! 最初に step() を教えてくださった方のコードにも y ~. が出ていましたね。見落としていました。お恥ずかしい限りです。一日一善。これからも精進します。 -- 笹川ヨット? 2011-12-06 (火) 02:19:57

ライブラリーscatterplot3について

斉藤正? (2011-12-02 (金) 12:26:18)

これまで scatterplot3 を使って、計算結果を3次元表示していました。Rのバージョンを2.14.0に上げたら、

> library(scatterplot3d)
以下にエラー library(scatterplot3d) : 
  '‘scatterplot3d’' という名前のパッケージはありません
   :  関数 "scatterplot3d" を見つけることができませんでした

というエラーメッセージがでて、図が描けなくなりました。対処法をお教えください。

  • お騒がせしました。パッケージの再インストールをして、問題は解決しました。 -- 斉藤正? 2011-12-02 (金) 12:41:01

Rserveを使ってload()をする回数を抑える方法について

@garuby? (2011-11-30 (水) 18:58:49)


すでに重回帰モデルやSVMモデルを作成しており、このモデルを使って新しいサンプルの目的変数を予測することを現在Rscriptで行なっています。この方法の場合、毎回重回帰モデルなどを保存したファイルをloadして、目的変数を予測させているので、いつも計算するのに時間がかかります。

計算する量は、サンプル数が1つしかない場合もありますし、10万を超える場合もあります。複数の人が利用するため頻度も多いです。

そこで、Rserveを使って最初にモデルをloadして予測ジョブごとでわざわざloadすることを避けられないか検討しています。ヘルプを見ますと、セッション番号を共有すれば何とかなりそうではないかと思っています。が、まったく分からず立ち往生しています。

このようなことはRserveで実現できるのでしょうか?あるいは他の方法で解決するのでしょうか?

  • Rserveを使ってもできるだろうけど、loadするファイル側に工夫の余地はないのでしょうか。または、RScriptの中に回帰係数を直接書き込んでしまうとか。 -- 2011-11-30 (水) 20:22:49
  • > 毎回重回帰モデルなどを保存したファイルをloadして、目的変数を予測
    なぜ,そんなこと(詳細はよく分からないし)が必要なんでしょうかね?
    既に確立した予測式で,新しいサンプルの目的変数を予測するという事ですか?
    説明変数に対応する偏回帰係数だけを使って予測式を構成することが出来るので,その偏回帰係数を用いて予測値を計算して提示すると言うだけの話でしょう?
    説明変数の値 x の入力を求め,既に計算されている偏回帰係数 b と定数項 c に基づいて sum(x*b)+c で予測値を提示すればそれですむのではないか?
    電卓でも計算できるよね。SVMの場合は,係数だけ取り出してというのはできないのかもしれないけど。
    そんな,簡単なことジャね〜〜んだよ!!!(怒)!!!!というなら,もっと詳細な情報を。 -- 河童の屁は,河童にあらず,屁である。? 2011-11-30 (水) 22:03:04
  • 失礼しました。私は製薬会社に勤務しております。標本(デザイン化合物)の薬効/毒性をモデルで予測しております。重回帰モデルを使うときはscript中に回帰係数を書き込んでおりました。xが200以上あり樹木数が1000, トレーニングで利用した標本数が数万とかになるrandom forestモデルをloadする場合、そのファイルは30MB以上になります。新しいサンプルの目的変数を予測する適用範囲をチェックするために、トレーニングで用いた標本群と新しいサンプルの類似性を評価しています。さらに、ある標本については複数の項目(薬効/毒性)について予測するため同じようなファイルを相当数loadすることになりもう少し工夫できないかと考えています。一度複数の項目についてのモデルをloadしておけば、新しい標本のxのファイルだけreadすれば複数の項目を簡単に予測しそれぞれのモデルへの適用範囲(予測精度)を見積もれると期待しています。 -- @garuby? 2011-12-01 (木) 09:11:53

Rで出した結果の見方について

? (2011-11-29 (火) 19:09:19)

・Rでlm関数を使って分析をしました。summaryで結果を出したのですがEstimateの所の数字をどのようにとらえていいのかがわかりません。*の数も同じです。この数字や*は大きかったり、多いほうが相関関係があるのでしょうか?
・もうひとつstep関数も用いました。これはlm関数よりも詳しい値が出ると考えてよいのでしょうか?
・最後に題とは少し変わるのですが、目的変数が見付からないときにはなしでそれぞれの相関をもとめる(lm関数とstep関数を用いて)ことは可能でしょうか?例えば県ごとの脳梗塞の死亡率と癌の死亡率と糖尿病の死亡率しか出ていない場合です。県を目的変数にしようとしましたが、数字でないせいかエラーになりました。

どなたか教えてください。よろしくお願いします。

  • 重回帰分析の解説がある教科書なりを参照し,そこに例題として出ているデータを実際にRで分析して,結果として表示されるそれぞれの数字が何を指しているかを確認すべきでしょう。
    Estimateのところに出ている数値は,偏回帰係数というもので,対応する独立変数に掛けて足しあわせ,更にInterceptを足したものが予測値になります。
    *の数は,表の下に説明が書いてあるように,Pr(>|t|) の欄に書いてあるp-valueが 0.001以下のときに3つ,0.001〜0.01のときに2つ等と表記してあるのです。p-valueは偏回帰係数が0であるかどうかについての検定の有意確率です。一般にp-valueが0.05より小さいときに,5%有意水準で有意な偏回帰係数であると判断します。検定について分からないときには,検定について書いてある教科書を見ましょう。
    step関数は,闇雲にやったわけではないでしょう?ステップワイズ変数選択のためにあるという説明は読みましたか?lm関数を下請けに使ってモデルに使用する最適な独立変数を選択するのです。lm関数と競合・並立するものではありません。
    目的変数がない場合には,変数間の相関係数を計算して解釈することになるでしょう。
    「県を目的変数にしようと...」そんな無茶な。やはり,重回帰分析についてちゃんと理解することが先決でしょう。 -- 河童の屁は,河童にあらず,屁である。? 2011-11-29 (火) 19:55:31
  • 教えていただきありがとうございます。3つめの県の問題ですが、どうやってやれば相互の関係が出てくるのでしょうか?lm関数の説明をみるとどの説明にも目的変数がでてきます。目的変数を全ての変数にして説明変数も全ての変数にすればいいのでしょうか?因みに県のデータをのぞいたものを作ってやる予定です。 -- ? 2011-11-30 (水) 12:20:02
  • > 目的変数がない場合には,変数間の相関係数を計算して解釈する
    んですよ。目的変数や説明変数の区別はつかないのだから,重回帰分析ではない。そのような場合には,ほかのやり方もあるけど,たかが変数が3つぐらいなら,変数間の相関係数(行列)を計算するしかない。どの変数とどの変数の相関係数がどれくらいであるか。有意な相関といえるかどうか。ということ。 -- 河童の屁は,河童にあらず,屁である。? 2011-11-30 (水) 14:53:54

非線形最適化について

yyy? (2011-11-29 (火) 15:30:47)

お世話になります.

例えば「3*x^2-4*x*y+3*x+6*y^2+8*y」のような2変数の最適化を行うにはどうすればよいのでしょうか.
uniroot()は1変数でしか使えませんよね?
どなたかご教示下さい.宜しくお願いします.

  • 以下のような? -- 河童の屁は,河童にあらず,屁である。? 2011-11-29 (火) 16:15:08
    > f <- function(p) 3*p[1]^2-4*p[1]*p[2]+3*p[1]+6*p[2]^2+8*p[2]
    > nlm(f, c(1,1))
    $minimum
    [1] -6.107143
    
    $estimate
    [1] -1.214287 -1.071429
     
    $gradient
    [1] 6.422047e-07 4.269174e-07
    
    $code
    [1] 1
    
    $iterations
    [1] 3
  • そんな短いプログラムでできるんですね!ありがとうございます.助かりました. -- yyy? 2011-11-29 (火) 17:40:26

集合演算について

zoo? (2011-11-29 (火) 11:55:26)

お世話になります。

・集合xと集合yがある
・サイズは x > y で、yはxに全て含まれる
・xに含まれるyをyの順番を維持したままxから抜き出したい
という処理をしようとしています。
たとえば

x <- c("A","B","C","D","E")
y <- c("D","E","B")

x[x %in% y]

このように入力すると「"B" "D" "E"」が得られますが、yの順番である「"D" "E""B"」として出力するにはどうすればよいでしょうか?
どなたかご教示ください。宜しくお願いします。

  • y -- 2011-11-29 (火) 12:38:09
  • x[x %in% y][rank(y)] -- 2011-11-29 (火) 12:39:34
  • y -- 2011-11-29 (火) 13:09:31
  • 「y」という最初の方の解は秀逸。
    仕様がはっきりしないのが難点だが,x の中に y の要素が複数入っているときにその全部を順番に取り出すということなのかな? -- 河童の屁は,河童にあらず,屁である。? 2011-11-29 (火) 13:09:53
    > x <- c("B","A","B","D","C","D","E")
    > y <- c("D","E","B")
    > unlist(sapply(y, function(ch) x[x==ch]))
     D1  D2   E  B1  B2 
    "D" "D" "E" "B" "B"
  • 皆さんありがとうございました。話を簡単にしすぎて「y」でもできてしまいますね。実際はデータフレームxdとydがあり、xdとydのとある列同士がxとyとなっており、x%in%yを満たすxdの行をyの順番を維持したままxdから抜き出すということをしたかったので、x[x %in% y][rank(y)] で処理できました。 -- zoo? 2011-11-29 (火) 13:39:01
  • 以下のようにも -- 河童の屁は,河童にあらず,屁である。? 2011-11-29 (火) 14:00:53
    > (x <- data.frame(str.x=LETTERS[1:5], num.x=1:5))
      str.x num.x
    1     A     1
    2     B     2
    3     C     3
    4     D     4
    5     E     5
    > (y <- data.frame(str.y=c("D", "E", "B"), num.y=c(1,3,6)))
      str.y num.y
    1     D     1
    2     E     3
    3     B     6
    > x[sapply(y$str.y, grep, x$str.x),]
      str.x num.x
    4     D     4
    5     E     5
    2     B     2
  • データフレームに対しては集合演算ではなく x[sapply(y$str.y, grep, x$str.x),] で処理するのがもっとも洗練されていますね。勉強になりました。 -- zoo? 2011-11-29 (火) 14:18:57

Mac OS X上のpng()で文字化け

m? (2011-11-29 (火) 02:23:48)

Mac OS X(10.6.8)でR2.14.0を使用しています。plotがデフォルトの画面上(Quartz)では問題無いのですが、png()では文字化けしてしまいます。

png("hoge.png", width=640, height=640, unit="px")
plot(1,1)
text(1,1,"ほげ")
dev.off()

こうすると「ほげ」部分が□□になってしまうのですが、何か見落としているためでしょうか?
ターミナルから「R」と入力して起動した場合も、Rのアプリケーション上の「Rコンソール」でも同じ結果になります。
よろしくお願いいたします。

  • 日本語フォントを指定しなければならないのでは。ヘルプだとデフォルトではHelveticaです。par(family="HiraMaruProN-W4")とでもしてみてください。 -- 2011-11-29 (火) 18:48:21
  • ご返信ありがとうございます。ただ、残念ながら結果は好転しませんでした。options("bitmapType")とすると「quartz」と帰ってくるので、png()についてもquartzによる描画のようなのです。しかし画面上のquartzデバイスでは上手く表示されるのですが、png()では文字ばけしてしまいます。quartzFontz()を実行するとヒラギノが設定されているようなのですが、だめです。Xlibではなくてquartzのアンチエイリアスの効いた綺麗なpngを自動作成したいと思っていますので、また何か思いつかれる点がありましたらご示唆ください。 -- m? 2011-11-29 (火) 22:45:33
  • > Xlibではなくてquartzのアンチエイリアスの効いた綺麗なpng
    png なんてだめです。pdf が一番キレイですよ。 -- 河童の屁は,河童にあらず,屁である。? 2011-11-29 (火) 22:49:22
  • あなたと同じ環境でpar(family=)を追加して実行するとちゃんと日本語が表示されるのですが。何かオプション等を変更していませんか? -- Iona? 2011-12-02 (金) 21:28:14
  • 河童(後略)さま: ご返信ありがとうございます。pdfやepsは確かに綺麗なのですが、画面表示のためのラスタライズが必要になりますので、今回はBitmapが欲しいのです。 -- m? 2011-12-03 (土) 00:41:36
  • Iona様: 設定ファイル類を読み込まないように、ターミナルから「R --vanilla」として起動してみましたが、同じ結果でした。うちのOS X環境の問題なのかもしれませんね。ちなみに、par()の具体的なコマンドは上に匿名様が書いてくださっている「par(family="HiraMaruProN-W4")」でしょうか? -- m? 2011-12-03 (土) 00:45:31
  • 分かっているとは思いますが,念のため。par は png の後でやらないとダメですよ。png の前にやっても効果はない。また,png のたびにやらないといけない。以下をコピー&ペーストしてみましょう。 -- 河童の屁は,河童にあらず,屁である。? 2011-12-03 (土) 14:51:02
    png("test.png")
    par(family="HiraMaruProN-W4")
    hist(rnorm(10000), main="日本語を使う")
    dev.off()
  • できました!まことにありがとうございます!! par()を実行するタイミングのこと、分かっていませんでした。初歩的なミスでお騒がせしてしまって大変恐縮です。 -- m? 2011-12-03 (土) 18:00:03

データの型を指定して出力

shannon? (2011-11-28 (月) 00:13:55)

既出でしたらすいません。
Rではデータ型がinteger(整数),numerical(実数),complex(複素数),character(文字)に分類されるとのことですが、
C言語などで使われるfloat(32bit),double(64bit)でビット幅を固定して、データを書き込むことはできないのでしょうか?
writeBin関数ではそのようなオプションがないように思うのですが、
書きこむ前のデータのビット幅を何らかの方法で固定して、その後writeBin関数で書き込む、という流れになるのでしょうか?
分かりにくい質問かもしれませんが、よろしくお願い致します。

  • Rでは数値データは原則doubleです。特にinteger,singleと指定したいときは as.integer(), as.single() 関数で強制変換しますが、これはinteger, single 属性を付け加えるだけなので、かえってオブジェクトのサイズは増えてしまいます(質問者の意図はファイルのサイズを小さくしたということでしょうか)。as.single()関数はおそらくFrotran,Cサブルーティンがそれを要求する場合のために用意されているのでは。したがってsingleでファイルにセーブしてもファイルサイズが減るわけではないような。 -- 2011-11-28 (月) 09:21:48
    > object.size(1L)
    32 bytes
    > str(1L)
     int 1
    > object.size(as.single(1L))
    120 bytes
    > str(as.single(1L))
     atomic [1:1] 1
     - attr(*, "Csingle")= logi TRUE
    > object.size(as.double(1L))
    32 bytes
    > str(as.double(1L))
     num 1
  • ご回答ありがとうございます。as.single関数に関するご指摘も大変参考になりました。 仰るとおりファイルサイズをできるだけ小さくして出力することが目的だったのですが、やはりビット幅を指定しての出力には外部プログラム(C言語等)を利用するしか方法がないということでしょうか。ひとまずは、sprintf関数やformatC関数でデータの桁数を調整して、double型で出力することにします。
    また、パッケージはできるだけ利用したくないのですが、もしビット幅を指定した出力が可能になるパッケージ等をご存知の方がいらっしゃいましたら、お時間あるときにご指摘をお願い致します。 -- shannon? 2011-11-29 (火) 00:43:51
  • writeBin関数は引数のsizeでバイト数を指定できますよ。 -- Iona? 2011-12-02 (金) 21:40:11

並列処理したい関数における外部変数の扱い

QDY? (2011-11-24 (木) 22:47:47)

最新バージョンのRには並列処理用のパッケージ parallel が同梱されています。特にマルチコアのパソコンでは便利だと思いますが、並列処理したい関数が(その関数にとっての)外部変数を含む場合はエラーになるようです。おそらく子プロセスが親プロセスの実行環境を知らないからだと思いますが(?). 関数の実行環境(外部変数)をすべての子プロセスで共有する簡単なおまじないがあるのでしょうか。(Linux, R2.14.0)

> library(parallel)
> cl <- makeCluster(rep("localhost", 4), type="SOCK")
> y <- 3
> tmp <- function(x) x+y
> clusterApply(cl, 1:4, tmp)
 以下にエラー checkForRemoteErrors(val) : 
  4 nodes produced errors; first error:  オブジェクト 'y' がありません
> stopCluster(cl)
  • clusterExportを唱えるのが吉。 -- 2011-11-25 (金) 08:01:13
  • 早速の情報有難う御座います。たしかにうまく動作しました。ただし、外部変数が多数の場合どうするのかなと一瞬困りましたが、以下のようにすれば簡単ですね。 -- QDY? 2011-11-25 (金) 09:38:30
    > library(parallel)
    > cl <- makeCluster(rep("localhost", 4), type="SOCK") # 4つのコアで実行
    > y <- 3
    > tmp <- function(x) x+y
    # すべての実行時環境オブジェクトを子プロセスにエクスポート。
    # この例では clusterExport(cl,"y") で十分
    > clusterExport(cl, ls())
    > clusterApply(cl, 1:4, tmp)
    [[1]]
    [1] 4
    
    [[2]]
    [1] 5 
    
    [[3]]
    [1] 6
    
    [[4]]
    [1] 7
    
    > stopCluster(cl)
    

コマンドのコンソール出力を抑えるには

バイソン? (2011-11-22 (火) 13:20:05)

Linux(CentOS5.5)上で、R version 2.11.1を使用しています。

a = 1
cat(a,"\n")

上のような内容のRファイル(test.r)を作成して、

> R --vanilla --quiet < test.r

のようにして実行すると、コンソール上には実行コマンドとcat関数による出力の両方が表示されてしまいます。

=====コンソール表示======
> a = 1
> cat(a)
1
=========================

cat関数で出力する値だけをコンソール画面に表示させたいのですが、R --helpを見てもそのようなオプションが無いように思います。
sink関数を使って、出力先を別ファイルに変更させて確認するという方法もあるとは思うのですが、 出力させたい部分で一回一回sink関数で囲うのが面倒なので、
できればRコマンドのコンソール出力を抑えて、cat関数等で出力させる値(上の例では1)のみをコンソールに表示できないものかと考えているのですが、良い方法はありますでしょうか?

  • 実行するファイルをsource で読み込む1行だけのRファイル(例えば start.r)を作り,それを実行する(> source("start.r") は出るけど,test.r の内容は出ないでしょ)。R --vanilla --quiet -f start.r
    別解: R --vanilla --quiet -f test.r | grep "^[^>+]" -- 河童の屁は,河童にあらず,屁である。? 2011-11-22 (火) 14:45:58
  • なるほど!!grepを使うのは思いつきませんでした。示していただいた方法を、新しいコマンドに割り当てるか何かして使いたいと思います。ご返答ありがとうございました -- バイソン? 2011-11-22 (火) 15:41:48
  • オプションの"--slave"を見落としてました。今更ながらすいません。
    > R --vanilla --slave < test.r
    のようにしても同じように出力が抑えられました。-- バイソン? 2011-11-24 (木) 04:56:01

persp()で軸のタイトルの文字サイズの変更

まあくん? (2011-11-22 (火) 09:05:29)

タイトルの通りなんですが、関数persp()で軸のタイトル(xlab,ylab,zlab)が、角度によってお互いが重なってしまい、見にくくなってしまうので、文字サイズの変更もしくは、表示位置の微調整ができないでしょうか?

  • オンラインヘルプの,引数の説明の最後に,... additional graphical parameters (see par). とあります。cex.axis,cex.lab, col.axis, col.lab, font.axis, font.lab, las その他が指定できますよ。 -- ヘルプ嫁? 2011-11-22 (火) 12:16:34
  • ありがとうございます。読めない訳じゃないんですが、英語苦手で。 -- まあくん? 2011-11-22 (火) 17:45:34
  • > 読めない訳じゃないんですが、英語苦手で
    人に読ますな。 -- マニュアル嫁? 2011-11-22 (火) 20:50:36

plyrのロードができない

小田ちん? (2011-11-19 (土) 00:51:34)


ggplot2を使いたいのですが、plyrのロードで失敗します。
MacのR64を使っています。どうすれば使えるようになるのでしょうか?
よろしくお願いいたします。

> library(ggplot2)
要求されたパッケージ reshape をロード中です 
要求されたパッケージ plyr をロード中です 
Error in dyn.load(file, DLLpath = DLLpath, ...) : 
  共有ライブラリ '/Library/Frameworks/R.framework/Versions/2.14/
    Resources/library/plyr/>libs/x86_64/plyr.so' を読み込めません: 
 dlopen(/Library/Frameworks/R.framework/Versions/2.14/Resources/
    library/plyr/libs/x86_64/plyr.so, 6): Library not loaded:
    /Library/Frameworks/R.framework/Versions/2.13/Resources/lib/libR.dylib
 Referenced from: /Library/Frameworks/R.framework/Versions/
    2.14/Resources/library/plyr/libs/x86_64/plyr.so
 Reason: image not found 
エラー:  パッケージ '‘plyr’' をロードできませんでした
  • plyr はインストールされていますか?「パッケージとデータ」-->「パッケージインストーラ」で確認し,インストールされていなければインストールしてください。
    そもそも ggplot2 をインストールするときに,「依存パッケージも含める」にチェックを入れずにインストールしてしまったのなら,チェックを入れて ggplot2 をインストールし直した方が確実でしょう。 -- 河童の屁は,河童にあらず,屁である。? 2011-11-19 (土) 09:41:47
  • ありがとうございます。plyrはインストールしました。plyr.soのファイルも上記フォルダに入っています。インストールに失敗したかと思い、何度かインストールし直しましたが、変わらないです。;_; -- 小田ちん? 2011-11-19 (土) 14:46:46
  • https://stat.ethz.ch/pipermail/r-sig-mac/2011-May/008276.html を参考に、update.packages(checkBuilt=TRUE)とやったらできました。他のパッケージが関係して他のでしょうか。なぜかわかりませんが、ありがとうございました! -- 小田ちん? 2011-11-19 (土) 15:46:15
  • エラーメッセージを見るかぎりではplyrパッケージが2.13用にビルドされてしまっていたためエラーになっていたようです。
    update.packages(checkBuilt = TRUE)はインストールされているパッケージがどのバージョン向けにビルドされているかをチェックして合ってないものをインストールしなおすというものです。
    解決したようですが参考までに。 -- Iona? 2011-11-19 (土) 22:16:02

Boxプロットで、項目軸を数値にする方法

T.I.? (2011-11-16 (水) 07:11:07)

Rの初心者です。グラフの描き方に苦戦しております。
Boxプロットで、項目軸(X軸)を数値軸にしてグラフを描きたいのですが、方法をご存知の方がおられましたら、教えていただけないでしょうか?

  • 中級者コースでそんなことを訊くと怒られますよ。初級者コースでも怒られるね、きっと。 -- 2011-11-16 (水) 08:06:39
    set.seed(100) ; x <- sample(c(1,2,5,7), 200, TRUE) ; y <- rnorm(200)
    boxplot(y~x, at=sort(unique(x)), xlim=c(0,8))
  • ご回答ありがとうございます。助かります。初めての投稿で、初級があるのを見逃しておりました。すみませんでした。 -- T.I.? 2011-11-16 (水) 20:47:24

行列の割合表示

yasushi? (2011-11-15 (火) 18:56:52)

R初心者です。
次の2つの実行結果は同じになると思ったのですが,なりません(2番目の数値がおかしい)。

> x <- matrix(c(1:4), nrow=2, ncol=2, byrow=T)
> (x/apply(x, 1, sum))

y <- matrix(c(1:4), nrow=2, ncol=2, byrow=F)
t(y/apply(y, 2, sum))

2番目のものを,colSumsにしてみても同様の結果でした。R 2.14.0でもR 2.2.0でも同様の結果でした(Window XP上で)。

どういうことなのでしょうか?

  • 一行で,たくさんの関数を適用すると,慣れないうちは分かりにくいでしょう
    分解して,逐次実行すれば,なぜそうなるか(思い違いしていたか)分かるでしょう。
    ちなみに,TRUE/FALSE を T/F と略記するような横着はしないように心がけるのが吉。
    colSums であろうと apply(foo, 2, sum) であろうと無関係。
    > (x <- matrix(c(1:4), nrow=2, ncol=2, byrow=T))
         [,1] [,2]
    [1,]    1    2
    [2,]    3    4
    > apply(x, 1, sum)
    [1] 3 7
    > x/apply(x, 1, sum)
              [,1]      [,2]
    [1,] 0.3333333 0.6666667
    [2,] 0.4285714 0.5714286
    > (y <- matrix(c(1:4), nrow=2, ncol=2, byrow=F))
         [,1] [,2]
    [1,]    1    3
    [2,]    2    4
    > t(y/apply(y, 2, sum))
              [,1]      [,2]
    [1,] 0.3333333 0.2857143
    [2,] 1.0000000 0.5714286
    > apply(y, 2, sum)
    [1] 3 7
    > y/apply(y, 2, sum)
              [,1]      [,2]
    [1,] 0.3333333 1.0000000
    [2,] 0.2857143 0.5714286
    > t(y/apply(y, 2, sum))
              [,1]      [,2]
    [1,] 0.3333333 0.2857143
    [2,] 1.0000000 0.5714286
    バグでも何でもない,当たり前の実行結果です。(このような,単純な計算結果にバグはないと思うのが普通です)。不審に思えば,デバッグ(途中結果の詳細を表示させて,何がどのようになっているかを理解する)する。
    あなたが得たい結果は
    > t(y)/apply(y, 2, sum)
              [,1]      [,2]
    [1,] 0.3333333 0.6666667
    [2,] 0.4285714 0.5714286
    ということになりますね。
    わかりにくいことはしないに越したことはない。そのような複雑怪奇なプログラムは,わかるようになってからやればよいのです。というか,そんなことをやる必要はないのです。自己責任でやるなら別。)
    さらに言えば,あなたのやりたいことを一つの関数でやれる。それは,prop.table
    > x <- matrix(c(1:4), nrow=2, ncol=2, byrow=T)
    > x/apply(x, 1, sum)
              [,1]      [,2]
    [1,] 0.3333333 0.6666667
    [2,] 0.4285714 0.5714286
    > prop.table(x, 1)
              [,1]      [,2]
    [1,] 0.3333333 0.6666667
    [2,] 0.4285714 0.5714286
    まあ,そんな関数があることなんか知らなくてもどうってことはないです。 -- 河童の屁は,河童にあらず,屁である。? 2011-11-15 (火) 21:21:41

ARIMAモデルでの解析結果を詳細に表示したい場合…

前田? (2011-11-14 (月) 22:45:36)

R初心者のものです。
大学の卒業研究でポンドの解析を行っています。
ARIMAモデルでの解析結果は出せるのですが
解析結果の詳細を表示させたいのですが
どなたかお知恵を貸していただけませんでしょうか?
パワースペクトルなどの結果も見れたらと思います。
宜しくお願い致します。

  • まずは本ページ初頭の、投稿に際する注意事項をご熟読ください。 -- 2011-11-15 (火) 13:02:27
  • 出せた解析結果に何が足りないのでしょうか? それを書かないとアドバイスできないと思いますよ。 -- Iona? 2011-11-15 (火) 17:04:21
    (x <- stats::arima(lh, c(2, 0, 1)))
    ここで表示されるものでは不十分ということでしょうか。
    パワースペクトルについてはspectrum関数がありますが,ARIMAモデルの結果を直接用いたものはなさそうです。

2階の導関数のもとめかた

みのむし? (2011-10-27 (木) 13:26:24)

Rの初心者です。簡単な質問で大変申し訳ないのです。
ある関数の、2階の導関数をもとめ、それを他の計算に使いたいと思っています。

f <- deriv(~x^2*y, c("x", "y"), function(x, y) { }, hessian=TRUE)

と書くと、4種類の2階の導関数を計算してくれるのはわかるのですが、個別の2階の導関数をどう選択して良いのかわかりません。たとえば、この場合、xとyで1回ずつ微分したものはどう選択すればよいのでしょう?

attr[f, "hessian"][x, y]

こんな風にかいてみたのですが、だめなようです。ご存知の方教えていただけませんか?

  • 例えば。ただしこれでは全ての二階までの導関数値を計算してしまいますから無駄と言えば無駄です。 -- 2011-10-27 (木) 16:51:51
    > f12 <- function(x, y) attr(f(x, y), "hessian")
    > f12(1, 2)
    [1] 2
    > f12(4, 3)
    [1] 8
  • 回答ありがとうございます。ただ、おっしゃるとおり、打ち込んでみると、[1,]4 2 [1,]2 0と、4つの二階の導関数が計算されます。私は、たとえば、xとyとで微分した、二階の導関数をF12(x,y)と定義し、(F12(1,2))^2のような計算をしたいのです。お分かりいただけたでしょうか?よろしくお願いいたします。 -- みのむし? 2011-10-28 (金) 08:42:32
  • F12 <- function(x, y) attr(f(x, y), "hessian")[, "x", "y"]とすればいいだけでは。 -- Iona? 2011-10-28 (金) 23:09:25
  • ありがとうございます!この方法でうまくいきました。感謝申し上げます。 -- みのむし? 2011-10-29 (土) 14:51:11

連続の検出

nkoji? (2011-10-08 (土) 14:45:51)

ベクトルのある値の連続と各連続における順番を取得したいです
例えば,c("a","a","a","b","c","a","b","a","a")に対してc(1,2,3,0,0,1,0,1,2)を得たいのです。今はこんなコードでやっています。

A <- c("a","a","a","b","c","a","b","a","a")
B <- rep(0,length(A))
A.str <- paste(A, collapse="")
#開始位置と長さの取得
C <- gregexpr("a+", A.str)
#C.mat[1,] 開始位置 C.mat[2, ] 長さ
C.mat <- rbind(C[[1]], attr(C[[1]], "match.length"))
B[A=="a"] <- unlist(apply(C.mat, 2, function(x){c(1:x[2])}))

ベクトルの要素を一つずつ比較するよりは速いと思うのですが,上よりもっと速くなるコードがあれば教えてほしいです。

  • あなたの関数は十分に速いでしょう。
    以下のようにすると3,4倍速くなるかもしれませんが。 -- 河童の屁は,河童にあらず,屁である。? 2011-10-09 (日) 00:33:15
    > my.func <- function(A)
    + {
    + 	B <- integer(length(A))
    + 	C <- rle(A == "a")
    + 	B[A == "a"] <- unlist(lapply(C$lengths[C$values], function(x) 1:x))
    + 	B
    + }
    > your.func <- function(A)
    + {
    + 	B <- rep(0, length(A))
    + 	A.str <- paste(A, collapse="")
    + 	# 開始位置と長さの取得
    + 	C <- gregexpr("a+", A.str)
    + 	# C.mat[1,] 開始位置 C.mat[2, ] 長さ
    + 	C.mat <- rbind(C[[1]], attr(C[[1]], "match.length"))
    + 	B[A == "a"] <- unlist(apply(C.mat, 2, function(x) {c(1:x[2])}))
    + 	B
    + }
    > a <- c("a","a","a","b","c","a","b","a","a")
    > my.func(a)
    [1] 1 2 3 0 0 1 0 1 2
    > your.func(a)
    [1] 1 2 3 0 0 1 0 1 2
    > a <- sample(letters[1:5], 1000000, replace=TRUE)
    > system.time(my.func(a))
       ユーザ   システム       経過  
         0.615      0.035      0.646 
    > system.time(your.func(a))
       ユーザ   システム       経過  
         2.448      0.040      2.453
  • ありがとうございます。rle: Run Length Encoding そのものずばりの関数があったのですね。
    各連続の開始位置・終了位置も取得できました。-- nkoji? 2011-10-09 (日) 05:38:12
    End.index.all <- cumsum(C$lengths)
    Start.index.all <- End.index.all - (C$lengths - 1)
    End.index <- End.index.all[C$values]
    Start.index <- Start.index.all[C$values]
  • A=="a" を二回評価するのが無駄だったので,以下のようにするともう少し速くなりますね。 -- 河童の屁は,河童にあらず,屁である。? 2011-10-09 (日) 08:10:17
    my2.func <- function(A)
    {
    	B <- A == "a"
    	C <- rle(B)
    	B[B] <- unlist(lapply(C$lengths[C$values], function(x) 1:x))
    	B
    }

read.tableで読み込んだ行列がis.finiteでFALSE??

もうり? (2011-10-06 (木) 08:38:06)

> A <- read.table("matrix.dat")
> B <- matrix(A[1,], 3, 3)
> kappa(B, exact=TRUE)

としたところ,

Error in svd(z, nu = 0, nv = 0) : infinite or missing values in 'x'

というエラーが出力されました.
matrix.dat は1000行9列スペース区切りで実数を並べたテキストファイルです.
そこで,svd 関数の定義を見たところ,

if (any(!is.finite(x))) 
   stop("infinite or missing values in 'x'")

との記述がありました.そこで確認のため,

> any(!is.finite(B))

としたところ結果はTRUE.
ここまでは納得できなくもないのですが,

> kappa(A, exact=TRUE)

はエラーが出ず,しかも,

> any(!is.finite(A))

の結果はTRUEです.

> A <- matrix(scan("matrix.dat"), ncol=9)

と読み込むことによって,

> any(!is.finite(A))
> any(!is.finite(B))

が両方FALSEとなったため一応解決はしましたが,すっきりしません.
原因に心当たりがある方がいらっしゃったらお教えいただければと思います.
最後に実行環境について記述しておきます.

$ uname -sr
Linux 2.6.18-92.el5
$ R --version
R version 2.10.0 (2009-10-26)
  • class(B) としてみると B は matrix だと表示される。しかし,class(B[,1]) などとしてみると list だといわれるので,びっくりするでしょうね。str(B) をやると,なんと,9 個のリストだと言うことが分かります。svd は,そんなデータ構造は受け付けないはずヨ。svd の冒頭に as.matrix(x) を置いてはいるが,まさかこんなものがワタされるとは夢にも思っていないはず。
    根本原因がなんなのかはお察しの通り。データを read.table で読んだこと。read.table で読んでもよいけど,読んだ後,A <- as.matrix(A) とでもやっておけば,B <- matrix(A[1,], 3, 3) で B はちゃんと3×3のmatrix になる。そうすれば問題なく svd は動く。
    データフレームには注意が必要。データフレームは行列とは違う。 -- 河童の屁は,河童にあらず,屁である。? 2011-10-06 (木) 10:11:46
  • 河童の屁は,河童にあらず,屁である。さん,ご回答ありがとうございます.read.tableでファイル読み込みをするとデータフレームになるということだったのですね,なるほど. -- もうり? 2011-10-06 (木) 12:04:15

LSMEANを求めながら,そのデータのsdを求める

怪獣? (2011-09-01 (木) 12:21:54)

よろしくお願いします。初級Q&A(10)のところで,LSMEANについてのやりとりがされていました。私のデータでLSMEANを得ることはできたのですが,グループの変数が3つあり,多重比較をしなければいけません。教えて頂きたいことは,LSMEANをベースにした3つの群のそれぞれのsdの求め方と二次データを使った多重比較の方法です。被験者数はすべて同じ数です。どうぞよろしくお願いいたします。

  • 上記の質問文を書き換えたいと思います。 -- 怪獣? 2011-09-01 (木) 13:16:31
  • 申し訳ありません。Enterを押してしまいました。「LSMEANの求め方はわかりましたが,3群あるために多重比較をしなければいけません(共変量は一つです)。頭の中では,各群の平均(LSMEAN)とsdそれから人数があれば多重比較をすることができるのではないかと考えています。しかし,何のsdをどのように求めたらいいのかわかりません。また仮にsdが求まった場合,LSMEAN, sd, nを用いて,どのように多重比較を進めていったらいいのでしょうか?ボンフェローニかなと考えています。よろしくお願いいたします。」 -- 怪獣? 2011-09-01 (木) 13:20:05
  • すみません,回答が付かないようなので私の質問が悪いのだと思います。この質問は打ち切りたいと思います。 -- 怪獣? 2011-09-05 (月) 12:34:18

csvからxmlに変換したときの日本語文字化けについて

さとう? (2011-08-29 (月) 18:16:59)

Rでcsv形式のデータからXMLへ変換しています。日本語のタグやデータも扱いたいのですが,以下のコードを実行すればわかるように,日本語が文字化けします。
(タグは文字化けしませんが,データの値は文字化けします。)
これを防ぐ方法はあるでしょうか?

library(XML)
data <- c("変数1の値です。","value of variable 2.")
xml <- xmlTree()
xml$addTag('データセット', close=FALSE)
xml$addTag("データ", close=FALSE)
xml$addTag("変数1", data[1])
xml$addTag("変数2", data[2])
xml$closeTag();xml$closeTag();xml$closeTag()
cat(saveXML(xml))
  • encodingオプションをつけると文字化けしませんよ。 -- 2011-08-29 (月) 23:33:37
    > cat(saveXML(xml,encoding = "UTF-8"))
    <?xml version="1.0"?> 
    
    <データセット>
      <データ>
        <変数1>変数1の値です。</変数1>
        <変数2>value of variable 2.</変数2>
      </データ>
    </データセット>
  • 確かにそうでした.ありがとうございました. -- さとう? 2011-08-30 (火) 08:12:57

座標値の等間隔プロット

R初心者? (2011-07-25 (月) 17:59:00)

今大学でRを使って研究をしているものですが初心者なので苦戦しています

今、等間隔でない座標値がいくつかあって線で結ばれたデータがあります
このデータを等間隔に(例えば2m間隔とか5m間隔とか)プロットさせるようなプログラミングを作成したいのですがどのようにやったらいいのでしょうか
簡単な質問でしたらすみません。何分初心者なもので・・・
ご指導よろしくお願いします。

  • 初心者はQ&A(初級者コース)が適切でしょう。どんなデータなのか、一部分でも示したらよいでしょう。それをどんな風にしたいのか、具体的に。 -- [[ ]] 2011-07-25 (月) 18:20:46
  • ご指摘ありがとうございます。今現在サンプルとして佐渡島のデータが座標値としてあります。そのデータのある点での地形の凹凸(入り江状になっているかそうでないか)を判断したいのですがそのままのデータだと等間隔ではないのでばらつきが出てしまします。なので、ある地形データを何mかに等間隔にプロットすることでプロットされた地点の凹凸を判断したいのですがその等間隔にプロットするプログラミングがわからなくて投稿させていただきました。説明がわかりづらくて申し訳ありません。 -- R初心者? 2011-07-25 (月) 18:33:30
  • 質問に気がつくが遅れました。まだ見ていらっしゃいますでしょうか。spパッケージのspsample()を使ってください。spsample()は線分上のランダムな点ばかりではなく、等間隔の点も作成できます。 -- 谷村 2011-08-29 (月) 23:26:34

Excelから1セルの読込

kero_10625? (2011-06-22 (水) 12:26:37)

節電対策などで、建物のエネルギー解析が必要になっています。ビル管理システムにExcelで記録された数百から一万程度の多数のファイルの処理を行っております。

Excelの単一のセル、1列あるいは1行だけを読み込む必要が出てきました。

RODBCを用いて、sqlQuery を使うとデータフレームで値を返すためか、空欄のセルがあるとエラーが発生します。

xlsReadWrite?パッケージのread.xls()関数を使うと可能なのですが、xlsx形式に未対応であり基本的にはシェアウエアであり将来の対応に不安が残ります。

建築技術者にRを使ってもらおうと考えていますので、Pearlなどあまり追加のソフトのインストールは避けたいです。

何か良い方法をご存じでないでしょうか。

  • 感想ですが,「基本的にはシェアウエアであり将来の対応に不安が残ります」とか「追加のソフトのインストールは避けたい」とかいっているのに,「Excelで記録された数百から一万程度の多数のファイル」というのが矛盾していますね。「xlsx形式に未対応」とか言う問題が起きるのは明らかなので,textファイルに記録しておけば何の問題もなかったのかも知れませんね。 -- 河童の屁は,河童にあらず,屁である。? 2011-06-23 (木) 11:45:25
  • ご指摘ありがとうございます。説明が不足した部分があったようです。分析する「Excelで記録された数百から一万程度の多数のファイル」というのは、ビルにある中央監視装置にて記録されるもので、ご指摘のとおりtextとかcsvファイルであればいいのですが、これはビル側の中央監視装置の仕様で決まっております。ファイル形式についてはこちらの意向は反映できません。また、多い場合には1万個くらいになるので、ファイルをcsvに変換するなどはやりたくありません。このようなデータの解析を少しでも楽に出来るようにRが使えると考えております。 -- kero_10625? 2011-06-23 (木) 14:34:49
  • XLConnect パッケージは xls と xlsx の両方に対応しているようですよ。 -- tmr? 2011-06-24 (金) 11:06:42
  • xlsx形式って確かzipで固められたxmlファイルでしょ。つまりテキストファイルですよね。違うのかな。私ならシェルスクリプトでさくっとデータを取り出して取りまとめて整形して、その後にRに取り込むと思います。 -- 2011-06-24 (金) 19:21:16
  • 「xlsx形式って確かzipで固められたxmlファイルでしょ」
    あ,ホントですね。知らなかった。これならば,何にも使わなくて,R だけで何とでもなりますね。 -- 河童の屁は,河童にあらず,屁である。? 2011-06-24 (金) 22:36:32
  • XLConnect の情報ありがとうございます。良さそうなパッケージなので今後利用を検討いたします。せっかくシェルスクリプトの情報いただきましたが、知識がなくこの方法は私どもには難しいと思います。ありがとうございました。 -- kero_10625? 2011-06-24 (金) 22:39:04

Rで他言語の展開

ktr? (2011-06-21 (火) 21:30:21)

Rで,ある関数を展開し,中身を見ると.CとしてC言語で書かれた関数が使用されていました.Rの関数は関数名をタイプすれば中身を見ることが出来ますが,このように他言語で書かれた関数をRで展開することは可能なのでしょうか?

  • 「ある関数を展開し」などと書かずに,関数名をはっきり書けば少しはましだと思いますけど?「展開する」って,ソースを見ると言うことなんでしょ? -- 河童の屁は,河童にあらず,屁である。? 2011-06-21 (火) 22:07:29
  • 初心者で申し訳ありません.時系列の分析に興味がありましてprdctr(),decomp(),xsarma()などの関数を使い勉強したいと思っていましたが,実際の計算部はC言語で書かれていましたのでこの部分のソースを見ることは出来ないのかと思いました. -- ktr? 2011-06-23 (木) 02:37:56
  • その関数はどのパッケージに含まれるものですか。どうも,timsac の中のもののようですが,一般的でない関数については,パッケージ名も併せて提示すべきでしょう。
    ソースについては,TIMSAC for R package のなかに説明されているリンク(ソースファイル timsac_1.2.4.tar.gz)を見るとよいでしょう。ちなみに,それらは,FORTRAN で書かれているようですが。 -- 河童の屁は,河童にあらず,屁である。? 2011-06-23 (木) 07:24:08
  • ご指摘の様にパッケージtimsacの中の関数です.ファイルtimsac内のsrcに入っているものがFORTRAで書かれたソースなのでしょうか.FORTRANも扱ったことがないので現段階では分かりませんが,少しずつ勉強して理解を深めたいと思います.様々なご指摘ありがとうございました. -- ktr? 2011-06-23 (木) 14:40:47

t.test()の機能

竹澤? (2011-05-31 (火) 16:27:12)

 t.test()の機能を確認するために以下のようなRプログラムを試しました。

function() {
  nt <- 10000
  pt <- 0
  for(kk in 1:nt){
    set.seed(12+kk*144)
    xx1 <- abs(rnorm(50, mean = 0, sd = 1))
    xx2 <- abs(rnorm(50, mean = 0, sd = 1))
    xx <- c(xx1, - xx2)
    ttest1 <- t.test(xx, mu = 0)
    pp <- ttest1$p.value
    if (pp < 0.05){
      pt <- pt +1
    }
  }
  pt <- pt/nt
  print(pt)
}

正規分布に従うデータを作成する方法がややひねくれています。結果は、0.05に近くなるはずなのに0.0018になりました。正規分布に従うデータを作成するときに普通の方法を使うと0.0517になりました。このような違いが生じるのはなぜでしょうか。

  • 上記の作成方法ですと正のデータも負のデータも確実に50個ずつ出来上がりますので,普通の方法で100個データを作成するよりも平均が0付近になりやすくなるのではないでしょうか. -- 2011-06-01 (水) 00:43:42
  • なるほど、そういうことでしたか。分かりました。どうもありがとうございます。 -- 竹澤? 2011-06-01 (水) 09:02:19

順序ロジットモデルの適合度について

miya? (2011-05-02 (月) 10:11:04)

polr関数を用いて,順序ロジットモデルを推計しています.
SUMMARY()を利用すると,推計結果が表示されます.
その際,AIC指標が表示されますが,尤度比は表示されません.
初期尤度,最終尤度,ならびに尤度比を求めたいのですが,polr関数にどのようなオプションを付ければよいのか,教えていただけると助かります.

もしかすると,定義式にしたがって,自分で計算式を作成して計算するしか方法がないのでしょうか.

散布図のプロットの中で条件によって色を変える方法

ウルトラ初心者? (2011-04-18 (月) 15:33:39)

BioconductorのDESeqというパッッケージを使ってます。ほとんどコピペ程度でしか使えてません。

plot(res$baseMeanA, res$baseMeanB, pch=20, cex=.1, col = ifelse( res$padj < .1, "red", "black" ))

というコマンドで散布図がマニュアルに載っていて、そのままコピペしてかけていました。
resという表のpadjカラムの値がが0.1より小さければ赤、それ以外を黒という風にプロットされています。

さて、別のパッケージBaySeq?で統計解析しか結果もこの散布図に反映させたいと考えました。
そこで、一つカラムを増やしてanalysisとなづけ、DESeqで有意なデータを1、BaySeq?で有意なデータを2、DESeqでもBaySeq?でも有意なデータを3、それ以外を0というように入力しました。

そこで、analysisカラムをみて1ならば赤、2ならば青、3ならば緑、0ならば黒というように上のplotコマンドを改良したいのです。
たぶん、ifを重ねて使っていけばいけそうなのですが、どのようにググってよい物かわかりません。

全くの丸投げ質問で恐縮ですが、よろしくお願いします。

  • 根性が足りませんでした。
    plot(res$baseMeanA, res$baseMeanB, log="xy", xlab="wild type", ylab="homozygote", pch=20, cex=.1, col = ifelse(res$analysis == 1, "red", ifelse(res$analysis ==2, "blue", ifelse(res$analysis ==3, "green", "black")))) -- ウルトラ初心者? 2011-04-18 (月) 16:04:53
  • 河童の屁は,河童にあらず,屁であるさん、ありがとうございました。自分なりに解決できたので投稿したところエレガントな方法を書き込んでいただいてありがとうございました。 -- ウルトラ初心者? 2011-04-18 (月) 16:06:50
  • もし,100 種類の色分けをする(なんて,馬鹿な)場合は,その方法でやろうとするのはたいへんですよね。コンピュータは,規則的な記述を簡便に記述する所がキモですよ。
    analysis 要素を含むデータフレームが res だとすれば,col=c("black", "red", "blue", "green")[res$analysis+1] というようにすればよいでしょう。
    res$analysis+1 は R のベクトルの引数は1から始まるので,0〜3 を 1~4の値を取るように 1 を加えたもの,ベクトルの添え字です。ベクトルは色を表す c("black", "red", "blue", "green") で,元々の 0 が 1 になり,それを黒で描く,... などなどです。
    ベクトルの長さ(今の場合 4)より,添え字の個数が多くても(少なくても)何の不都合もありません。
    c("black", "red", "blue", "green") [c(3,2,1,4,3)] の結果は,"blue", "red", "black", "green", "blue" になります。
    検索するならば,「ベクトル(行列)の要素の指定」みたいなところでしょうね。
    老婆心ながら,初心者の質問は初級者コースに出す方が良いと思います。-- 河童の屁は,河童にあらず,屁である。? 2011-04-18 (月) 15:58:46

マルチコアCPUでの、Rの効率的な利用について

さと? (2011-04-17 (日) 05:21:20)

現在、クアッドコアのCPUを搭載したWINDOWSマシンにRをインストールして利用しています。
そのうえで、for文を使って繰り返し計算を行っていますが、非常に時間がかかっております。

Rを立ち上げて計算させても一つのコアしか使わないので、マルチコアの資源を有効に使えておりません。
仕方がないので、Rを4つ一度に立ち上げて、for文の繰り返しを, 1:25, 26:50, 51:75, 76:100というように分けて実行しています。
これで計算時間は短くなるのですが、もっとスマートにやる方法をご教授いただければ幸いです。

UNIX環境で使える multicore というパッケージは見つけたのですが、WINDOWSで使える方法を見つけられませんでした。

こちらの環境ですが、
OS: Windows 7 Professional, Service Pack 1
プロセッサ: Intel(R) Core(TM) i7 CPU M620 @ 2.67GHz
実装メモリ(RAM): 8.00GB
システムの種類:64ビット オペレーティングシステム

なにとぞよろしくお願いいたします。

  • そんな贅沢な環境にないので、見当違いならごめんなさい。ここここここだと使えそうに見えますが。あと、multicoreパッケージはLinux対応なのだから、Winバイナリがデルまで、マルチブートでまかなうとか。 -- akira? 2011-04-17 (日) 14:54:48
  • akira様。コメントをいただき、本当にありがとうございます。ご紹介いただいたサイトを参照してみます。取り急ぎ、お礼まで。 -- さと? 2011-04-18 (月) 05:05:51
  • 行列積とか線形代数を使うんならSurviveGotoBLAS2を試したらいかがでしょう -- 2011-04-18 (月) 11:37:16

Rで作図をする際に、レイヤー表示のように手前に持ってくるキャラクターの指定はできないのでしょうか?

Tetsu? (2011-01-27 (木) 22:59:49)

現在、ts.plotを使用して、時系列データの作図をしております。
その際に、1つの点を黒丸、もう一方の点を白抜き三角でプロットを行っております。
三角が手前に来るようにデータ系列の指定の順番を変えたり、par(plot=new)を使用して重ね書きをしてみたのですがうまくいきません。
結局、三角の中身が白で塗りつぶされていないのが問題だと思うのですが、pchで指定可能な白三角と黒丸を一通り試したところ、全て同様の図が表示されてしまいました。
このような問題を解決する方法は無いのでしょうか?

あと、一点質問があります。
作図をする際に見易くするために、軸に主目盛りと副目盛りをつけようとしております。
このような場合はaxis()を2回使用して、目盛りの長さが異なる軸を重ねて描く以外に方法はないのでしょうか?
教えていただけないでしょうか?
よろしくお願いいたします。

  • ts.plot() の後に points()。 // axis() は2回使うしかないでしょう。 -- 河童の尼? 2011-01-28 (金) 00:14:26
  • ありがとうございました。おかげさまでpointsを使ってpch=24, bg="white"で解決いたしました。 -- Tetsu? 2011-01-28 (金) 01:53:23

Rコマンダーがインストールできない

Natsu? (2011-01-26 (水) 00:02:56)

Rをインストールして、Rコマンダーを使いたいのですが、パッケージからRコマンダーを選ぶと、以下のように出てしまいます。

install.packages(NULL, .libPaths()[1L], dependencies = NA, type = type) 中で警告がありました: 
 'lib = "C:/PROGRA~1/R/R-2.12.1/library"' は書き込み可能ではありません  
以下にエラー sprintf(msg, userdir) : 
  <83>シ<e3>Ν縺吶k縺溘a縺ォ蛟倶ココ逧<84>縺ェ繝ゥ繧、繝悶Λ繝ェ 
'%s' 
繧剃ス懊j縺溘>縺ョ縺ァ縺吶°<ef>シ<9f> に不正なマルチバイト文字があります 

どのようにすればインストールできるのでしょうか?
初歩的な質問で申し訳ないのですが、教えてください。

  • 誠に初歩的で,何回も同じような質問がありますねぇ。
    「書き込み可能ではありません」をキーワードにして検索すると出てきます。
    初級者コースQ&Aをご覧ください。 -- 河童の屁は,河童にあらず,屁である。? 2011-01-26 (水) 08:56:42
  • Administrator 権限でログオンしていて、ユーザー名も半角なので、ちゃんと他のソフトはインストールできるのですが・・・ -- Natsu? 2011-01-26 (水) 23:22:41
  • Rを起動するときに「管理者として実行」で起動してみてください。右クリックで出てきます -- 2011-01-28 (金) 09:53:38
  • お陰さまで無事解決しました。ありがとうございました。 -- Natsu? 2011-01-29 (土) 23:28:54

GAM(一般化加法モデル)における変数選択について

S.K? (2011-01-21 (金) 23:19:26)

GAMを用いてデータ解析をしているのですが、変数選択の方法が分からなくて
困っています。web上にはstep.gamというものがあるそうなのですが、どのパッケージに入っているかもわからない状態です。何かご意見を頂けないでしょうか。よろしくお願い致します。

  • パッケージ gam (Version 1.04) に step.gam があります。 -- 2011-01-22 (土) 09:06:43
  • ありがとうございます。 -- S.K? 2011-01-23 (日) 22:26:12

コネクションエラー

R初心者? (2011-01-10 (月) 09:58:15)

R初心者です。
JavaからRserveを利用して、Rを起動しようとしてます。
そこである程度同時実行をさせて、最終的に200件ほどの要求をRserveになげるようにしています。そこで、問題なのですが、Rserveからコネクションエラーが数十件返ってきます。そのコネクションエラー数は毎回毎回まちまちで数も特定できません。私が調べた限りでは、Rserveでコネクションの制限を設定している部分がないことから現状なぜこのようになるか不明な状態です。
そこでもしこのような現状に対する情報をお持ちでしたら、教えていただけないでしょうか。よろしくお願いいたします。

パネルデータ分析 固定効果

H.A? (2010-12-13 (月) 21:07:38)

はじめまして
大学で企業財務を勉強しているものです。

さて、初歩的な質問で恐縮なのですが、Rでパネル分析を行った際に、企業固定効果の係数を出力することはできないのでしょうか?
各企業ごとの企業固定効果を分析上使用する必要があるため、それらをぜひとも抽出したいのです。

もしコードなどをご存じのかたがいましたらご教授お願いします。

  • H.A様、探すのも勉強です。それよりも回答がない意味をよくお考えて戴ければと思います。 -- ooki? 2011-01-10 (月) 13:25:06
  • ookiさん plmのマニュアルや海外のサイトを探してみたところ、おかげさまで、目的のコードがわかりました(fixef)。ただ、二元配置推定法(twoways)で回帰してみたところ、メモリ不足でエラーになってしまいました。うーん、先は長い、、、。 -- H.A? 2011-01-11 (火) 18:21:37
  • 単純にFixed effectを計算したいのであれば個別企業ダミーを突っ込めば良いと思いますよ. -- nd? 2011-04-17 (日) 13:16:57

interp1?

XC? (2010-12-11 (土) 12:04:28)

はじめまして
Rを調べ出しの初心者です

MATLAB系のスクリプトをRで動くようにする変換プログラムを作っているのですが、元のスクリプト群で多用されている、スカラを返す補間関数がマニュアルを探しても見付かりませんでした。
例えば、エンジン回転数ー発生トルクの2次元のマップ(回転数1000毎とか)、rpm_tqがあったとして、任意の、例えば2850回転の時の発生トルクであれば、
interp1()を使用して、
tq = interp1(rpm_tq(:,1), rpm_tq(:,2), 2850)
(rpm_tq(:,1)、 rpm_tq(:,2)は、回転数とトルクのベクタになります)
の様になっているので、Rで
tq <- interp1(rpm_tq[1], rpm_tq[2], 2850)の様に書けると嬉しいのですが
皆様のご教示をいただけましたら幸甚です。

  • 完全に同じかどうか分かんないけどsignalパッケージというのがありますよ。 http://cran.r-project.org/web/packages/signal/index.html -- 2010-12-11 (土) 13:21:01
  • ありがとうございます。tq <- interp1(rpm_tq[,1], rpm_tq[,2], 2850)で同じ出力が得られました。 -- XC? 2010-12-11 (土) 15:59:21

ARIMAモデルの定数項について

arima? (2010-10-31 (日) 15:09:12)

直線的なトレンドのある時系列に対して

arima(時系列,order=(1,1,0))

とすると、AR部分の係数が出力されるのみで定数項が出力されません。

これにpredictを施しても、定数項がないため、将来の値が一定となってしまいます。

定数項を出力させるためにはどうすればよいのでしょうか。

宜しくお願い致します。

splancsのkhatについて

風の歌を聴け? (2010-10-30 (土) 10:23:53)

いつも参考にさせていただいております。
splancsのK関数を求めるkhat関数について質問させていただきます。
ランダム分布のsimulation envelopeの上下限を求めるシミュレーション回数(nsim)はどのように決めるのでしょうか?19回や99回などが多く使われているようですが、回数はどのように決めるのでしょうか?また、回数が多いほうが上下限の幅が狭くなるのでしょうか?谷村晋さんの新刊「空間地理データ分析」(共立出版)を拝見しましたがnsim=99の例がのっていました。
よろしくお願いいたします。

  • Splancs というのは,splancs パッケージ,Kest というのは khat という関数でよろしいのでしょうか。正確に書いてくれないと,戸惑ってしまいます。それに,khat 関数には nsim 引数はなくて,いったいどの関数を対象にしているのかわかりませんでした。 --  ? 2010-10-30 (土) 21:34:08
  • 失礼しました。SplansのKenv.csr関数のnismについての質問です。 -- 風の歌を聴け? 2010-10-31 (日) 08:39:55
  • もう遅いかも知れませんが、試行回数は多い方がよいかと思います。90年代後半でしたら19回や99回というのも認められておりましたが、 -- Tetsu? 2011-01-27 (木) 23:03:28
  • 失礼しました。途中で送信してしまいました。(続き)近年では、回数が多い方が望ましいとされております。雑誌によってはこのようなシミュレーション回数が投稿規定で指定されている場合もあります。ある雑誌では最低でも9999回やるのが望ましいと書かれております。試してみれば分かりますが19回や99回だと値が不安定になり、データによっては容易に結果が変わってしまいます。L関数を使用している論文を検索して調べるのがよいと思われます。なお、confidence intervalは試行回数が多くなると小さくはなりませんがスムーズになります。 -- Tetsu? 2011-01-27 (木) 23:10:27
  • Tetsuさん、コメントありがとうございます。大変参考になりました。 -- 風の歌を聴け? 2011-02-02 (水) 08:50:30

クラスター分析での項目名

ST? (2010-10-29 (金) 23:46:16)

クラスター分析での項目名についてです。

Rコマンダーを使用してデータを読み込んでいます。
クラスター分析を行い、樹形図を表示させた場合、各項目が項目名にならず、1からの連番になってしまいます。(項目名がAA,BB,CCでも1,2,3になるということです。)

どのようにすれば項目名が表示されるようになるのでしょうか?
よろしくお願いします。

  • どうも中級者レベルのことはよくわからず,初級者は R Commander などは使わないのでよくわかりません。「クラスター分析」というのは,hclust を実行するんでしょうかね?hclust のオンラインヘルプを見ると,labels という引数があるので,R Commander でも,それに該当する指定をすればよいのではないかと思います。さらに詳しくオンラインヘルプを読めば,データフレームの行名をラベルにしたい項目名でつけなおしておけば,項目名が使われるんだなあということも分かると思います。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-30 (土) 12:07:15
  • 既出 (^_^;)
    Q&A (初級者コース)/10 クラスタ分析後の樹形図の作成
    Q&A (初級者コース)/11 Rコマンダーを使用し、クラスター分析を行ってます --  ? 2010-10-30 (土) 21:44:23
  • ありがとうございます。labelsで指定できるのですね。実際に表示されました。初級者向けの掲示板では新規投稿ができなかったのでこちらに質問させていただきました。既出のものがあるかきちんと調べることができず、質問してしまいましたが丁寧な回答ありがとうございました。 -- ST? 2010-10-30 (土) 23:26:17
  • 確かにね, 初級Q&A をクリックして出てくるページでは投稿できないけど,そのページに「* ↓新規の投稿・質問はこちらから Q&A (初級者コース)/12」というリンクがあるけど,目立たないんだよね。なんで,直接初級者コースへリンクさせないのか不思議。 -- 河童の屁は,河童にあらず,屁である。? 2010-10-31 (日) 06:11:22

リッジ回帰について

TKです? (2010-09-16 (木) 17:54:37)

リッジトレースをRで実行したいのですが、どのようにすればいいですか?

プログラムを作るしかないですか?

リッジ回帰のコマンドは一応あるのですが、実行してはみたものの、あまり使い道がないと思うのですが。

  • 具体的にどういう事がしたいのか書いておけば、それができるパッケージを知っている人がコメントしてくれるかもしれませんよ。
    survivalパッケージのridgeや, MASSパッケージのlm.ridge, lpridgeパッケージといったそれっぽい名前のものはすべて試してみたんですよね? -- iona? 2010-10-12 (火) 03:02:48

パッケージFEARのdeaでNDRSを実行したいのですが。

atsuo? (2010-07-26 (月) 18:01:11)

�FEARのdeaでは、CCRとBCCとNIRSの結果は出ます。さらに、NDRSの結果を出すことは可能でしょうか?
�deaの分析を行うためにFEARのdeaを改良したいと考えた場合、元のソースプログラムを手に入れる方法はありますか。(もしかしたら、基本的な質問かもしれません。申し訳ありません。Rを最近始めたばかりです。なんとかヒントをいただけませんでしょうか。よろしくお願いします。)

  • Rのコンソールで関数名のみを打ち込むとRのスクリプトは見ることができます。~ これで事足りることも多いので一度見てみたらいかがでしょう。~ ~ .Cや.Fortranで呼び出されるプログラムのソースはFEARの制作者がソースを公開していないようなので手に入れることはできないと思います。 -- iona? 2010-10-12 (火) 11:44:09

線型等式制約Ax=bにおける最適化問題を解く方法

kazuaki? (2010-06-03 (木) 01:11:15)

目的関数 : x[1]^2+x[2]^2+...+x[n]^2
制約条件 : Ax=b , x>=c
xとcはn次元ベクトル,bはm次元ベクトル,行列Aはn*m行列。
xが決定変数。

上記の最適化問題(最小化問題)を解きたいのですが、適切な手法やパッケージが特定できずにおります。

  • Rで数理計画「donlp2」を使用した最適化ルーティンなどを眺めて、線型等式ではなく線型不等式制約条件であれば solve.QP() や constrOptim() が使えるみたいだということは分かったのですが、今回の場合にこれらを活用できるかどうかも判断できませんでした。
    どうすれば解けるか、プログラム例や適切な手法やパッケージなどを教えて頂けないでしょうか。 -- kazuaki? 2010-06-03 (木) 01:12:33
  • まだ読めていないのですが、Rdonlp2 パッケージを使用すると良い感じなのでしょうか?
    線形制約の上限と下限を同じ値にすることで、等式制約として扱えるのでしょうか。 -- kazuaki? 2010-06-03 (木) 02:36:36
  • まずラグランジュの未定乗数法で線形等式制約を消すのが定石? -- 2010-06-03 (木) 09:26:03
  • ラグランジュの未定乗数法を用いる場合、線型等式制約Ax=bがm個の等式であれば未定乗数(qで表す)もm個導入して、(新しい目的関数)=(元の目的関数)+q[1]*(線型等式の第1列の左辺-右辺)+...+q[m]*(線型等式の第m列の左辺-右辺)をoptim関数で最適化(制約x>=cはoptimのmethodに"L-BFGS-B"を指定して対応)すればよいのでしょうか? -- kazuaki? 2010-06-03 (木) 10:06:06
  • 「ラグランジュの未定乗数法+optim関数」も今から書き込む内容もどちらもまだ試していないのですが、パッケージkernlabのipop関数が使えそうな気がします。
    パッケージRdonlp2のダウンロードサイトが見つけられなかったので、他を探していたところ見つけました。
    ipop関数のオプション指定の線形不等式制約「b <= A*x <= b+r」を与える際に「r=0」とすれば線形等式制約になりそうです。
    決定変数の範囲も「l <= x <= u」という形で指定できるので上手くいくかもしれません。 -- kazuaki? 2010-06-03 (木) 14:32:14
  • 失礼、不等式制約があるからラグランジュ法は使えませんね。ここで自問自答される前に試してみたらどうでしょうか。線形等式制約を取り除くには、行列 A の特異値分解 A=LDR (L.R は直交行列、D は非負値対角行列) として制約条件を Dy=b`, y=Rx, b`=L^tb, と変形し、目的関数と不等式制約を y で表現すれば、Dy=b` は D の正の対角成分 D[i,i] に対する y[i] は一意 y[i]=D[i,i]^{-1}b`[i] に決まり、残りの y[i] が自由に変化します。この自由に変化する y[i] について最適化する、でしょうか。簡単じゃないって、もちろんそうですよ。 -- 2010-06-03 (木) 17:50:33
  • ご助言ありがとうございます。少し勉強してから簡単な例を作って試してみます。 -- kazuaki? 2010-06-04 (金) 12:38:32

2元配置分散分析の場合の等分散性の検定

shigeru? (2010-04-09 (金) 06:35:07)

2元配置分散分析を行う前の等分散性の検定についてお伺いします。たとえば、要因A(2水準)と要因B(3水準)で繰り返しのある2元配置実験データが
y A B
y1 A1 B1
y2 A1 B2
y3 A1 B3
・・・
のような形で得られているときに、
bartlett.test(y ~ A * B)
とすると、自由度はdf=1となり、また
bartlett.test(y ~ B * A)
とすると、df=2となり、最初に出てくる要因しか評価されていないようです。AとBの組み合わせ要因(この場合はdf=2×3-1=5)に対して等分散性の検定をするにはどうすればよいのでしょうか。AとBの組み合わせからCという要因を新たにつくって対処することもできるでしょうが、その場合でも少し面倒になるような気がします。簡単に対処する方法はないのでしょうか。ご教示頂ければ大変助かります。

  • > 最初に出てくる要因しか評価されていないようです
    バートレットの検定について調べましたか?バートレットの検定というのはそう言うもの(一変量についての多群間の等分散の検定)ですよ。R で y ~ A * B のような指定をしても,警告しない方が問題なのです。
    なお,二元配置分散分析で水準間の等分散性はあまり問題にされません(そもそも水準ごとのデータ数が小さいことが多いので,そんなデータについて等分散云々をしても意味がないことが多いからでしょうけど)。 -- お節介な河童の屁? 2010-04-09 (金) 13:42:39
  • 稚拙な質問に早速ご回答頂き、ありがとうございました。二元配置分散分析では等分散性はあまり問題にされないとのご指摘は、分野によっては受け入れられていないように思います。すくなくとも生態学の分野ではtwo-way ANOVAであっても等分散性の仮定が棄却されないかをチェックしています。論文で等分散性の検定をしなければ、たぶんrejectです。 -- shigeru? 2010-04-09 (金) 15:53:56
  • > すくなくとも生態学の分野ではtwo-way ANOVAであっても等分散性の仮定が棄却されないかをチェックしています。論文で等分散性の検定をしなければ、たぶんrejectです。
    なるほど。では,先行研究(論文)では,どのようにして等分散性の検定を行っているのでしょうか?すべての水準の組合せ(あなたの場合には 2×3=6群)の等分散性の検定を行うのですか?
    2 つの factor 変数を,1 つの factor 変数にするには,うまい関数があったと思うけど,思い出せないので,以下のようにしてみる。別に複雑でもないと思いますけどどうでしょうか。 -- 屁の河童? 2010-04-09 (金) 17:51:50
    > set.seed(20100409)
    > d <- data.frame(y=rnorm(24),
    +                 A=gl(2, 12, labels=c("A1", "A2")),
    +                 B=gl(3, 4, 12, labels=c("B1", "B2", "B3")))
    > d$temp <- as.integer(d$A)*10+as.integer(d$B) # 策を弄する
    > d$C <- factor(d$temp,                        # 新たに factor 変数を作る
    +               labels=c("A1B1", "A1B2", "A1B3", "A2B1", "A2B2", "A2B3"))
    > d
                  y  A  B temp    C
    1   0.807748961 A1 B1   11 A1B1
    2   0.513417877 A1 B1   11 A1B1
    3  -0.156009578 A1 B1   11 A1B1
    4  -0.192902834 A1 B1   11 A1B1
    5   0.043651547 A1 B2   12 A1B2
    6  -1.530954060 A1 B2   12 A1B2
    7  -1.984433103 A1 B2   12 A1B2
    8   0.416585172 A1 B2   12 A1B2
    9  -0.001342267 A1 B3   13 A1B3
    10  0.364838567 A1 B3   13 A1B3
    11  1.182524866 A1 B3   13 A1B3
    12 -1.087637431 A1 B3   13 A1B3
    13 -1.552197067 A2 B1   21 A2B1
    14  0.323540547 A2 B1   21 A2B1
    15 -0.635204370 A2 B1   21 A2B1
    16 -2.889526450 A2 B1   21 A2B1
    17  0.223709445 A2 B2   22 A2B2
    18  0.118526662 A2 B2   22 A2B2
    19  0.172598117 A2 B2   22 A2B2
    20  1.846951151 A2 B2   22 A2B2
    21  0.673207028 A2 B3   23 A2B3
    22  1.080020322 A2 B3   23 A2B3
    23  1.383334771 A2 B3   23 A2B3
    24 -0.260967601 A2 B3   23 A2B3
    > bartlett.test(y~C, d)
    
    	Bartlett test of homogeneity of variances
    
    data:  y by C 
    Bartlett's K-squared = 3.125, df = 5, p-value = 0.6807
    今の例では,以下の方でもよい
    > set.seed(20100409)
    > d <- data.frame(y=rnorm(24),
    +                 A=gl(2, 12, labels=c("A1", "A2")),
    +                 B=gl(3, 4, 12, labels=c("B1", "B2", "B3")))
    > d$C <- factor(paste(d$A, d$B, sep=""), # 今の例ではこの方がよいかな?
    +               labels=c("A1B1", "A1B2", "A1B3", "A2B1", "A2B2", "A2B3"))
    > d
                  y  A  B    C
    1   0.807748961 A1 B1 A1B1
    2   0.513417877 A1 B1 A1B1
     途中省略
    23  1.383334771 A2 B3 A2B3
    24 -0.260967601 A2 B3 A2B3
    > bartlett.test(y~C, d)
    
    	Bartlett test of homogeneity of variances
    
    data:  y by C 
    Bartlett's K-squared = 3.125, df = 5, p-value = 0.6807
  • ありがとうございます。返事が遅くなり、お手数をおかけしています。ご提案と同じように変数を一つ増やす方法で私もやっていました。しかし、等分散性の検定は一般的なものであり、A*Bのようなもっと記述方法があるのではないかと思い、質問させて頂きました。そのような方法がないことがわかりました。それだけでも収穫です。ありがとうございました。 -- shigeru? 2010-04-09 (金) 22:02:59
  • > ご提案と同じように変数を一つ増やす方法で私もやっていました。
    それはそれは,ご同慶の至り。
    > しかし、等分散性の検定は一般的なものであり、A*Bのようなもっと記述方法があるのではないかと思い、質問させて頂きました。
    オンラインヘルプを見ればよかったですね。
    > そのような方法がないことがわかりました。それだけでも収穫です。
    お役に立った(?)とすれば,有難うございます。
    > 簡単に対処する方法はないのでしょうか
    「簡単に」というのにはレベルがあると思いますので,裏でどんなに汚いことをやってもいいから指定は簡単にということから,裏も何もなく簡単至極というところまでありますから,そのあたりのことを斟酌すると,おりあいがつくかも。
    まあね -- もう寝る屁の河童? 2010-04-09 (金) 22:30:40

plot()出力の部分拡大

ohgi? (2010-03-20 (土) 10:46:20)

仰木と申します.
Rで時系列グラフをplot()を使って描画していますが,実験最中に取れたデータ(約数十万行分)を描画して,必要そうな部分,注目したい部分を拡大して描画したいとき,Scilabではマウス右クリックでエリア指定の拡大ができるのですが,Scilabではあいにく今回の実験データが最大メモリ許容量を超えてしまうため,Rで同じことができないかと思っています.Rでデータの読み込みと全体描画はできるのですが,グラフ画面上で拡大したい部分をマウス操作で拡大するようなことはできないでしょうか?

もちろん,描画する範囲をスクリプトで描けば再描画することはわかっていますが,次々にその時刻を計算して拡大し,閲覧する作業が必要なので出来ればグラフ画面上で出来ないか,と思っています.

「できない」という答えでもよいので教えていただけませんでしょうか.

  • 誰も答えないというのは,難しい問題なんでしょうね。あえて火中の栗を拾おうなんて,身の程知らずの河童ですが,そんな批判は屁の河童,だけど,簡単すぎて「そんなんじゃダメだ」といわれると思いますけど,locator(2) で 2 点の座標をとり,2 つの x 座標を xlim に指定してやるというのはいかが?
    例えば,UKgas を例にとると,
     (1) 最初に plot(UKgas) で全体像を描く
     (2) 次に plot(UKgas, xlim=round(locator(2)$x)) をコンソールに入力し
     (3) グラフウインドウでx軸上(y軸座標値はどうでもよい)の拡大したい範囲の下限点と上限点をクリックする
    そうすると,選択部分が拡大されますね。後は,(2),(3) を好きなだけ繰り返す。
    縦軸方向も調整したければ,locator の返す y 座標値を ylim に指定してやればよい。選択範囲(長方形)の対角点をクリックするわけだ。 -- いつも見てるよ河童の屁? 2010-04-09 (金) 14:01:47
  • もう見ていないかもしれませんが、splancsパッケージのzoom()が、まさしく「いつも見てるよ河童の屁」さんのアプローチを実装しています。zoom()はpointmap()用なので普通のplot()に用いるにはちょっと手を加える必要があります。 -- 谷村 2010-05-10 (月) 14:57:37

Help

あんどう? (2010-03-14 (日) 20:57:00)

Help にある .rds, .rdb, .rdx はどのように開くのですか。

  • そんなもの見てどうするつもりですか?
    自分で検索してみましたか?以下でも参照することをお勧めします。
    http://tolstoy.newcastle.edu.au/R/help/05/07/9021.html
    曰く,these are binary files that won't make much sense to look at. -- 暇人? 2010-03-15 (月) 07:01:29

R CMD BATCH < test.R > test.Rout

boston? (2010-03-08 (月) 05:47:02)

test.R は

cat("Hello World")

だが、test.Routに出力されない

R --vanilla < test.R > test.Rout

は出力される BATCHの書き方に問題がありますか

  • try, R CMD BATCH --help -- 2010-03-08 (月) 11:58:10

パッケージSOMの仕様

初心者? (2010-02-15 (月) 02:52:47)

パッケージSOMの、関数somの学習回数は何回なんでしょうか?

  • (もう見てないでしょうが、)学習回数はオプションで指定します。指定しなかった時の値はコンソールにsomとだけタイプして出てきたスクリプトから読み取ってください。 -- iona? 2010-10-12 (火) 12:01:38

lm について

あんどう? (2010-02-07 (日) 12:28:45)

lmの処理を調べようとtest_lma.Rを作成し実行すと、match.call()で

以下にエラー match.call() : 
  'match.call' がその中から呼び出されたクロージャを見付けることができません。

となります。 プログラムの冒頭は以下のとおりで

formula <- y ~ 1 + x
xx <- c(1.386294, 2.079442 ,2.772589, 3.465736)
yy <- c(0.06254298 ,0.71444544, 1.27103337, 1.28339677)
ww <- c( 1.0000000 ,0.5000000, 0.3333333, 0.2500000)

data <- data.frame(x = xx, y = yy, w = ww)
subset <- 0
weights <- ww
na.action <- 0 
method <- "qr"
model <- TRUE 
x <- FALSE
y <- FALSE
qr <- TRUE
singular.ok <- TRUE 
contrasts <- NULL
offset <- 0  

ret.x <- x
ret.y <- y
cl <- match.call()
mf <- match.call(expand.dots = FALSE)

これ以降はlmのままです。

目的は余分な処理を削除したいのです。

  • 「余分な処理」って,どこから,どこまでなんですか?
    (2010-02-06 (土) 08:50:29) の続編なのですか?でも,相変わらず,何がやりたくて,何が問題なのか,さっぱりわかりません。 河童の屁? -- 2010-02-07 (日) 15:54:50
  • 示されたものを,そのままコンソールにペーストすると,あなたが経験したエラーメッセージではなく,以下の2箇所でエラーが生じますね。
    > cl <- match.call()
     エラー: match.call() was called from outside a function
    > mf <- match.call(expand.dots = FALSE)
     エラー: match.call() was called from outside a function
    エラーメッセージの言わんとしていることは,「関数の外で match.call なんかやってもだめだよ〜」ということかな?
    data <- data.frame(x = xx, y = yy, w = ww) の前に foo <- function() {
    取りあえず引用の最後に } を入れて,foo() とやると,何にも出力せずに(エラーも,結果もなし)実行終了になりますけどね?
    } の前に「以下は lm と同じ」ものを入れるだけであなたの希望することができるの? -- 河童の屁? 2010-02-07 (日) 20:10:21
  • > 目的は余分な処理を削除したいのです。
    「lm 関数の余分な処理を削除したい」ということか。だったら,lm2 <- lm とでもして,lm2 <- edit(lm2) で自分の思うとおりの関数に仕立てて,lm2 を呼べば良いだけでは? -- 河童の屁? 2010-02-07 (日) 20:20:14

関数の追加

あんどう? (2010-02-06 (土) 08:50:29)

libraryに関数を追加する方法を教えてください。
新たな関数を作り既存の関数をリンクさせたいのですが。
.Rをつくり cl <- match.call()を組み込んだのですがエラーになります。新たな関数をlibraryに追加できればエラーがなくなると考えています。

  • 何をどうやろうとして,どんなものを作ったらどんなエラーがでたのか。新たな関数をライブラリに追加するという意味もよくわからないが,そもそも,そんなことをする必要があるのかどうなのか? -- 河童の屁? 2010-02-06 (土) 12:30:08

多項ロジット

こうや? (2010-01-18 (月) 11:13:26)

それぞれの説明変数に対する回帰係数が応答変数のカテゴリーごとに出ると思うんですが、それらの係数がどのカテゴリーと対応しているかがよく分かりません。
教えていただけないでしょうか。

グンベル分布推定

吉川? (2010-01-14 (木) 17:37:24)

Rで極値統計をやっております。
extRemes, ismev を使ってGEVの推定を行っています。
gev.fit(x)を使って推定を行うと、
グンベル分布・ワイブル分布・フレシェ分布の中から推定されます。
これを、グンベル分布のみで推定したい場合にはどのようにしたらよいでしょうか。
ご存知の方がいらっしゃいましたら、よろしくお願いいたします!

  • どのように操作したら,結果が得られるのか,操作例を示してくれませんか。 -- 2010-01-14 (木) 21:42:09
  • 実行はhttp://deerfoot.exblog.jp/10977471/ のものと同様に行っております。(このページ自体は私とは直接関係ありません。。)反応返して頂きありがとうございます。 -- 吉川? 2010-01-15 (金) 10:42:06
  • gev.fit の中身を見たんですけど,「グンベル分布・ワイブル分布・フレシェ分布の中から推定されます」のような部分はないのではないかと思うんですけど。まあ,強制的にある分布で推定したいなら,ほかの分布での推定法に関するプログラム部分をコメントアウト(あるいは,if 文などで,そこを通過しないように)すればよいのではないでしょうか。 -- 2010-01-15 (金) 11:10:45
  • なぜ gum.fit を使わないのですか? -- surg? 2010-01-15 (金) 16:12:55
  • ご回答ありがとうございました。gev.fitの中を変換しないといけないと思い込んでいましたが、よく考えればgum.fitで問題ないですね。ものすごく初歩的な部分で解決いたしました。コメント頂き、大変感謝しています。本当にありがとうございました! -- 吉川? 2010-01-18 (月) 09:24:53

hclustでのward計算の原理

genri? (2010-01-03 (日) 13:51:31)

どう計算しているのか原理をお教えください。

この関数はdist構造のデータを使って計算します、たとえば距離マトリクスhogeにたいして
hclust( as.dist(hoge), method="ward")
で結果を返します。

Ward'sの方法では、クラスター間の距離はクラスターの統合によって増加した分散によって定義されています。そこで、距離マトリクスを算出した最初のデータがないと距離が算出できないのではないかと思うのです。

どうやって距離マトリクスからwardの距離を算出しているのでしょう?

  • ソースを読めばわかると思います(中級者ですからね。わからないなら中級者でないし,わからないならわかる必要もないと思います)。アルゴリズムを最も正確に記述しているのはプログラムです。 -- 河童の屁? 2010-01-03 (日) 22:51:24
  • 私も気になっていました。この関数はFortranで書かれた関数hclust.fを呼び出しています、
    たしかにそのマトリクスだけから計算しています。
    ごめんなさい、数学的な背景は私にもわかりませんので、どなたかお願いいたします... 。 -- tk? 2010-01-04 (月) 11:54:06
  • 元データは不要では?http://aoki2.si.gunma-u.ac.jp/lecture/misc/clustan.html -- 河童の屁? 2010-01-04 (月) 12:33:52
  • ありがとうございます。Ward'sの方法をどう定義するかで決まってきそうですね。
    最初の質問の方の定義だと、偏差平方和の合計から出すことになります。
    青木先生のページの解説ではユークリッド距離を使用されているので、この求め方ではその定義の値はでないことになります。
    一方、距離マトリクスを偏差平方和の合計で算出しておけば、hclust関数で(青木先生のご説明の通り)目的の値が出そうです。
    ただややこしいのは、ひごろhclust関数の前段に使っているdist関数に、偏差平方和を出す選択肢がなさそうですね。
    method = "euclidean"を使って距離を出してから、結果を二乗しましょうかね。-- tk? 2010-01-04 (月) 17:15:37
  • そのページの説明では,式(2)のユークリッド平方距離を使っているでしょう?クラスターの計算パラメータの表1にも,(2)式を使うと書いてある。
    「結果を二乗しましょうかね」とあるけど,ward法の場合には,平方距離を使うために,dist()^2 と*し*な*け*れ*ば*な*ら*な*い*(「Rによる統計解析」の227ページに書いてありましたよ)。このような注意が必要なのだけど,多くの説明書にはそういうことが書かれていないのが問題。 -- 河童の屁? 2010-01-04 (月) 18:03:51
  • なるほど、データ数で重みをつけた偏差平方和の合算で近似しているのですね。これが許容できるのは各項目の平均がネグれるときだから、遠いクラスターを統合するときはその距離を小さく見積もることになりそうですね。距離平方で距離を表すことに抵抗があったのですが、こんなことでバランスがとれているのかな。 なんにしてもありがとうございました。 ところで、正確にはdist()^2/2では。そもそもあまり正確な計算ではなさそうですけど。 -- genri? 2010-01-05 (火) 06:02:19
  • なぜ,「正確にはdist()^2/2」 なんでしょうか。もっとも,定数倍は結果に影響はないと思いますけど(デンドログラムの height の値を問題にすることはほとんどない)。 -- 2010-01-05 (火) 10:41:45
  • 偏差は平均値との差、distが返すのは2点間の差だからです。 -- genri? 2010-01-05 (火) 21:08:06
  • 平均差があっても大丈夫では? 式が書きにくいので実例で示すと
    a<-rnorm(10000, sd=2, mean=10)
    b<-rnorm(10000, sd=1, mean=0)
    var(a)+var(b)
    var(a-b)
    同じくらいの値が出てくるはず。
    ちなみにhclustの出力の$heightをsqrtで開いて書き戻してやれば
    "平方でない"距離のplotを得ることができます。 -- tk? 2010-01-07 (木) 15:41:57
  • cor(a,b)=0 のときに上の関係が成り立ちます。そして,例のような場合や,実際の場合には cor(a,b)≒0 なのです。 --  ? 2010-01-10 (日) 10:00:21

2次元正規分布関数のパラメータ推定について

zhang? (2009-12-07 (月) 10:25:06)

おはようございます。張@弘前大学です。R初心者で何か間違ったらご指摘ください。

今研究で,リンゴの形状推定を行っています。リンゴのお尻のくぼみを三次元計測して,2次元正規分布関数として推定しようと考えています。

R初心者で,色々調べたら,kde2d()やbked2d()でできるらしいが,しかし,最終的に出力してほしいのは中心値(μ1,μ2)と標準偏差(σ1,σ2)です。これでできるでしょうか?

ほかに何か方法がありませんか?宜しくお願いします。

  • > 三次元計測して,2次元正規分布関数として推定
    三次元計測したら,三次元正規分布なのでは?
    二次元正規分布だとして,2つの変数は何と何でしょうか? -- 河童の屁? 2009-12-07 (月) 11:00:39
  • 説明不足ですみません。 x,yが2次元の位置情報,zが高さ情報での3次元データです。 2次元正規分布のx,yとその結果のzに相当します。もしかしてRでは,これを3次元と呼ぶかもしれません。 日本語で曲面当てはめ,英語でsurface fittingになるでしょうか?ちなみに,Origin8 Proでできると書いています。 -- zhang? 2009-12-07 (月) 11:16:38
  • 要するに,お尻の窪みが二次元正規分布に従うかということですか?そんなものは,二次元正規分布ではないでしょう。二次元正規分布って,見たことないですか?http://cse.niaes.affrc.go.jp/minaka/R/R-binormal.html にもありますけど。 -- 河童の屁? 2009-12-07 (月) 11:28:12
  • 計測データを3次元表示すると,2次元正規分布の形そのものです。~ 今回の目的は,その形状を関数で近似することです。確立分布かどうか,特に意味がありません。
    そのパラメータをを使って,成長途中や品種間の相違を簡単に比較できると考えました。
    • zhang? 2009-12-07 (月) 11:38:30
  • ご提示の図をひっくり返れば,窪みの形になります。目的はその関数を見つけることです。 -- zhang? 2009-12-07 (月) 11:48:33

コクランのC検定

Shigeru? (2009-11-21 (土) 17:17:18)

等分散性の検定にコクランのC検定を使った文献をよくみかけますが、どのような方法なのでしょうか。またRでは実行可能でしょうか。お教えいただけるとありがたいです。

  • > 等分散性の検定にコクランのC検定を使った文献をよくみかけますが
    そうですか?わたしは,今まで似た名称の「コクランのQ検定」以外のものがあるなんて知りませんでした。例えば,どこでその検定法が参考文献として載っていましたか。その参考文献はどれでしょうか。
    等分散性の検定ということで今普通に使われているのは,二群の等分散性の検定(通称F検定),三群以上の場合にはバートレットの検定だと思いますね。両方の検定とも R で用意されています(それぞれ var.test と bartlett.test です)。
    その代替検定は,どのような特性(特徴)を持つ検定手法なんでしょうね。インターネットで検索したところ,
    Cochran's C test  A test, introduced by Cochran in a 1941 paper, for equality
    of variance in m  normal populations having unknown means and having sample 
    variances denoted by . Let be the ... 
    などという説明があったりしますけど,少なくと r-project.org のトピックには上がっていないようです。 -- 河童の屁? 2009-11-21 (土) 20:54:36
  • 文献を見つけました。Cochran (1951) Biometrics, 7:15-32です。とにかく、ありがとうございました。 -- Shigeru? 2009-11-22 (日) 20:10:07
  • 補足
    Cochran, W. G. (1941) The distribution of the largest of a set of estimated variances as a fraction of their total. Annals of Eugenics (London) 11: 47-52.
    Cochran, W. G. (1951) Testing a linear relation among variances. Biometrics 7: 17-32. -- 河童の屁? 2009-11-22 (日) 21:46:54

平滑化された値の出力について

b.b.? (2009-11-04 (水) 10:50:45)

質問です。
スプライン平滑化を行ってグラフを得たのですが、
xがある値の時の平滑化されたyの値を出力するには
どうしたらいいのでしょうか?

  • 別スレッドだが,Q&A(初級者コース)に回答がある 任意のX軸と曲線との交点(Y値)の値の算出
    もちろん,オンラインヘルプを読めばよいだけの話ではありますが。 -- 初級者の河童の屁? 2009-11-04 (水) 11:01:31
  • できました!本当にありがとうございました。 -- b.b.? 2009-11-04 (水) 14:24:22

constrOptimのhessianは表示可能でしょうか?

koba? (2009-09-03 (木) 12:51:05)

線形不等式制約付きの最適化関数constrOptimにてhessianでヘッセ行列を表示しようとしてもエラーが出てしまいます。
そもそも存在しないのでしょうか?

  • ↑の人、初級者コースと同じ人かどうか知らないけど、厭味だけしか書かないならやめてほしいんですけど。しかもご丁寧に色づけまでして・・・。この問題は別にコードなくても通じるし。で、constrOptim hessianをキーワードにググるとメーリングリストにそのもののトピックがいくつかあるので参考にしてみてください。nlme::fdHessが使えるらしいけど、制約付きの場合はちょっとトリッキーなことしてるらしいですよ。あるいはconstrOptimを書き換えて、optimを呼び出してるところにhessian=Tを入れてあげるとヘッセ行列を返すようになるけど、これが正しいのかどうかはよくわからない。 -- 2009-09-03 (木) 23:28:50

Map (mapply)から関数のリストを返すにあたって

dtak? (2009-08-13 (木) 07:06:37)

はじめまして、dtak と申します。
R (version 2.9.1 i386-apple-darwin8.11.1) でのMap関数(mapplyのラッパー関数)の振る舞いについて少し気になることがありましたので、投稿いたします。

Mapを用いて関数のリストを作ろうとしたのですが、Mapの引数fの内部で作られるクロージャでのみ評価されるfの引数が、最後の要素の値で上書きされてしまいました(なんだかややこしいですね、以下の単純化したコードをみてください)。

> Map (function (x) x(), Map (function (y) {function () y}, c(1, 2, 3))) ## list(1, 2, 3) が返ることを期待
[[1]]
[1] 3

[[2]]
[1] 3

[[3]]
[1] 3
>

あらかじめ評価してしまうことで回避することはできるのですが、

> Map (function (x) x(), Map (function (y) {y;function () y}, c(1, 2, 3)))
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

>

(遅延評価が行われるのであっても)少し奇妙な印象を受けました。これはこのような挙動をするものと考えるべきなのでしょうか、それとも不具合と考えるべきなのでしょうか?
ご存知の方がおられましたら、よろしくお願いいたします。

  • http://bugs.r-project.org/cgi-bin/R/Low-level?id=13861 で同様な質問がなされており、そこでこの挙動はRの評価規則に従ったものだとの結論が出ていました。あらかじめ十分な調査をせず書き込んでしまい申し訳ありませんでした。 -- dtak? 2010-02-01 (月) 05:10:34

順序ロジスティック回帰について

fall? (2009-07-07 (火) 13:28:37)

 パッケージMASSのplorを用いて順序ロジスティックを行おうと考えております。
 ここで私が困っていることが以下のような内容であります。
 
(目的変数にhelpでは”factor”を指定しなければならないと書かれており、数値を目的変数に入れるとエラーになってしまいます。目的変数を1,2,3など順序のある数値として解析をおこなうためのパッケージやplorの設定方法があるのであれば、教えて頂きたいと思います。)
 
 どうぞよろしくお願いいたします。

  • helpを見た限りでは、目的変数をOrd.factor型にする必要があると思う。as.ordered(*) -- 2009-07-07 (火) 14:12:57
  • ありがとうございます。試してみます。 -- fall? 2009-07-07 (火) 14:58:17

非線形連立方程式の解

かわお? (2009-06-23 (火) 23:14:25)

非線形の連立方程式を解くプログラミングを教えて下さい。
例えば、
x^2+y^2=5, 2×x^2+y=4の解x,yを解く方法が知りたいです。
よろしくお願いします。

  • 2xx^2 は 2x^2 の間違い?もしそうなら受験数学レベル。 -- 2009-06-24 (水) 06:48:01
  • なんとも丸投げな質問ですね.かわおさんは何ができて、何ができないんですか?何を調べて、何が解らないんですか? -- 2009-06-24 (水) 08:56:54
  • 本当に初歩的で申し訳ありません。HPで調べましたところ、「optim関数を使って、非線形連立方程式 F1(x)=F2(x)=0 を解くには、例えば目的関数を F(x)=F1(x)^2+F2(x)^2と置いて F(x) の最小化を行なう。」ということになると思いますが、そのプログラミングがわからない状況です。 -- かわお? 2009-06-25 (木) 00:10:47

Rでエラーログ解析

たけぼう? (2009-06-14 (日) 01:53:04)

R超初心者です。
ある半導体関連装置のサポートエンジニアをやっております。担当している装置はPC上で実行されるプログラムに従って動作するようなシステムです。

担当している装置が出力する日付、時間を含んだエラーログを見る機会が多く、その解析にRを利用できないかと考え入門しました。 担当している装置はログファイルの出力が「コマンド実行履歴」と「エラーログ」に分かれて記録されているので、「エラーが発生したとき、その装置は何をしていたか?」を調べるのに毎回エクセルで悪戦苦闘していましたが、この部分をRで一発で視覚的に表示できないかな?、と考えています。ログのフォーマットは次の通りです(csv)。

[エラーログ]
YYYY/MM/DD, HH:MM:SS, ALARM1
YYYY/MM/DD, HH:MM:SS, ALARM2

          :

[コマンド実行履歴]
YYYY/MM/DD, HH:MM:SS, COMMAND1
YYYY/MM/DD, HH:MM:SS, COMMAND2

          :

「上記二つの時系列ファイルから、両者の因果関係を視覚的に表示したい」
というのがやりたいことなのですが、Rでできそうでしょうか?
ヒント・アイディアだけでも良いので、何か閃いた方はご教示下さいませ。

  • もう少し背景説明が無いと答えにくいですね: -- 2009-06-14 (日) 13:38:22 (1) 一時に何組ぐらいの数のデータを処理するのか, (2) ALARMx, COMMANDx は何種類ぐらいあるのか, (3) COMMAND と ALARM の間の時間間隔はどれくらいなのか,1対1に対応するのか, など.
  • 説明不足ですみません。(1)100組位です (2)種類は200程度あります。 (3)時間間隔は1秒程度. -- たけぼう? 2009-06-14 (日) 14:23:45
  • 対応は1対1とは限らず、アラームとなったコマンドと、ならなかったコマンドが存在します。http://www.purple.dti.ne.jp/takechance/alm.JPGにイメージ図を作成しました。COMMAND3からALARM1までの時間間隔と、COMMAND6からALARM2までの時間間隔は異なりますよね?それも表現できれば最高なのですが。。。おっと、今気づきましたが時刻が分までしか表示ないですが、ここは秒まであるとお考えください。 -- たけぼう? 2009-06-14 (日) 14:27:29
  • うわ。。URLを記入すると展開されちゃうんですね。。ごめんなさい。。m(_ _)m -- たけぼう? 2009-06-14 (日) 14:29:16
  • COMMANDとALARMはrowが重ならないから、両方をまとめて考えれば良いですね。時間間隔はDATE,TIMEを数値にして差分を取れば良いでしょう。日をまたぐときは例外処理で。ログ解析はperlかrubyでは?と思いつつ返事します。 -- 2009-06-14 (日) 21:47:36
  • やはりPerl or Rubyですか。。そう思っていた矢先Rに出会ったもので質問させていただきました。Perl/Tkで挑戦してみます。ありがとうございました。 -- たけぼう? 2009-06-14 (日) 22:11:34

作図の繰り返しのコマンド

路地裏の少年? (2009-05-25 (月) 22:57:16)

低水準作図の繰り返しコマンドについて教えてください。

データは以下のようになっています。
緯度 経度 年
35  156 2000
38  165 2000
37  150 2001
38  148 2001・・・・

年毎の緯度経度のプロット図(20年分、各図の題名にはその年を充てたいと思っています)を書かせたいと思っています。
年ごとに抽出すれば、書けるのですが、20回繰り返せねばなりません。
初歩的な質問で恐縮ですが、よろしくお願いします。

  • forでもapplyでもお好きなように。これは中級でなく、初歩でもなく、それ以前の質問だ、と怒られますよ。「教えて君」にならないように。 -- 2009-05-26 (火) 07:21:29
  • 【for】はわかっていたのですが・・。いろいろ試行錯誤してみます。手厳しいですね。 -- 路地裏の少年? 2009-05-26 (火) 08:02:35
  • 手厳しくされるのは、コードを乗せないから。コードを乗せれば好きな人はコードで返事をくれる。 -- 2009-05-26 (火) 08:40:17
  • Suggestionありがとうございます。以下のようなコードを書いています。 -- 路地裏の少年? 2009-05-26 (火) 09:13:34
  • Year2 <- factor (Year); for (i.Year2 in 1: Year2) { plot (Longitude, Latitude, xlim = c(135, 155), ylim = c(32, 50), main = levels (Year2), pch = 20); library (maps); map ("world2", xlim = c(135, 155), ylim = c(32, 50), add = T); map.axes(); dev.copy (pdf, file = levels (Year2)".pdf"); dev.off()}といった具合に書いています。 -- 路地裏の少年? 2009-05-26 (火) 09:21:08
  • プログラムもそうだけど, データも第三者が試しやすいようにしないと誰も答えてはくれませんよ. -- 2009-05-26 (火) 12:58:18
    df<-data.frame(lat=c(35,38,37,38),
                   long=c(156,165,150,148),
                   year=c(2000,2000,2001,2001)
                   )
    cat(deparse(df),fill=T)
    
    library (maps);
    par(ask=T)
    lapply(unique(df$year),function(y)
           {
             cat(y,fill=T)
             longlat<-df[df$year==y,c("long","lat")]
             plot (longlat,
                   xlim = c(135, 155),
                   ylim = c(32, 50),
                   axes = F, main = y, pch = 20)
             map ("world2", xlim = c(135, 155), ylim = c(32, 50), add = T)
             map.axes()
             dev.copy(pdf, file = paste(y,".pdf",sep=""))
             dev.off()
           }
    )
    cat(deparse(df),fill=T)とかすると, 編集した小さなデータの切り出しが簡単でしょ?
  • 言葉足らずですみませんでした。以後、気をつけます。大変助かりました。 -- 路地裏の少年? 2009-05-26 (火) 13:59:43

ポアソン分布のロジスティック回帰

? (2009-04-16 (木) 19:13:38)

非線形最小二乗法を実施する関数として,nlsがありますが,このポアソン分布版はありませんでしょうか?教えていただければ幸いです。

  • 表記が正確ではありませんでした。ポアソン分布で非線形回帰が実行できる関数という意味です。 -- ? 2009-04-16 (木) 21:02:38
  • [ポアソン分布で非線形回帰]であっても,それが何を意味しているのかよくわからない -- 2009-04-16 (木) 21:56:47
  • 表記の仕方が不適切で申し訳ございません(初級者版に書き込むべきだったかもしれません。。)。 例えば,ある説明変数の値の増加に対して,S字曲線を描いて減少するカウントデータを解析したいという意味です。 あくまで例で恐縮ですが,例えば,以下のようなデータをイメージして頂ければ幸いです。-- ? 2009-04-17 (金) 11:33:08
    x <- c(1:10)
    y <- c(10,10,9,8,5,3,2,1,0,0)
    plot(y~x)
  • ポアソン分布に当てはめたい(ポアソン定数を求める)ということですか?ポアソン分布ならx=0のときのデータがないとおかしいですよ。 -- 2009-04-17 (金) 12:23:26
  • さっそくありがとうございます。正確な表現が思いつかず恐縮ですが,ポアソン分布に当てはめたいということで良いと思います。 例えば,この資料では,ポアソン回帰をglmで行っておりますが,x=0のデータはないのですが。。 -- ? 2009-04-17 (金) 13:31:42
  • ポアソン分布に当てはめる(ポアソン定数を推定する)のと,glm で family = poisson を指定するのは,違いますよ。あなたのやりたいことを自分で説明できないと,回答のしようがないですね。 -- 2009-04-17 (金) 15:11:14
  • たびたびご指導ありがとうございます。勉強いたします。gnlr {gnlm}という関数で実行できることが分かりました。 -- ? 2009-04-18 (土) 14:53:07

splancsのzoomについて

K.K? (2009-01-27 (火) 16:15:38)

クラスター分析で、plotされた樹形図の細かい統合部分をsplancsのzoomで見ようとしましたが、樹形図が表示されないまま拡大されてしまいます。
plotされた樹形図をzoomで細かく表示させる方法はありませんか?

  • X11()とかは諦めて、png(width=1000,height=1000,file="tmp.png"); plot(何か); dev.off()でtmp.pngを作って、ぐりぐりzoomできる画像ビューアで見てみるとか。 -- 2009-01-28 (水) 18:32:45
  • ありがとうございます。画像ビューアで拡大してみたら確認できました。 -- K.K? 2009-01-29 (木) 13:50:00

順序ロジット 関数 polr() について

y.t? (2009-01-15 (木) 18:10:28)

MASSパッケージにある順序ロジットの関数 polr() に 定数項を入れたいのですがどうすればよいでしょうか?

  • 0|1とか1|2が定数項だったような・・・ -- 03? 2009-01-19 (月) 16:27:11

BRugsでのAIC,DICの計算について

yuki? (2008-12-16 (火) 01:49:28)

WinBUGSではDICは簡単に計算できるコマンドがあるようですが,BRugsでもそのようなコマンドはあるのでしょうか?

R-2.8.0 x64 Linux上でのビルドについて

大津起夫? (2008-12-05 (金) 17:33:15)

R-2.8.0 を CentOS5.2 x64上でコンパイルし、make check したところ, tests/Examples/methods-Ex.Rの実行でエラーが生じます。 173行目あたりの setMehods("f","B0", function(x) c(x@b0^2, callNextMethod?()))) 実行時にsprintf実行例外が発生してしまいます。これは他の版などで生じていないのでしょうか? また、すでに知られたバグでしょうか?

エラーログ

> f <- function(x) class(x)
> 
> setMethod("f", "B0", function(x) c(x@b0^2, callNextMethod()))
 以下にエラー sprintf(gettext(fmt, domain = domain), ...) : 
   引数が少なすぎます 
Calls: setMethod -> message -> gettextf -> sprintf
 実行が停止されました 

OSは gcc 4.1.2環境ですが、コンパイルはIntel C++ 11.0 +Intel ifort 11.0+MKL 10.0でおこなっています。
下記が、configure.siteの指定、および ./configure の引数です(インストールマニュアルにある B.Ripley先生となかまさんの指定にしたがっていますが、config.siteのパラメータは -mpを-ieee-fpにしました)。

上記の命令は2回目以降はエラーを起こしません。上記の箇所の直前に try(setMethods(....)) )のように同様の命令を挿入すると、テストをパスします。
また,CentOS5.2のパッケージ compat-libstdc++33-3.2.3-61 から/usr/lib64/libstdc++.so.5をインストールしています。

--- config.site ----
CFLAFGS="-g -O2 -wd188 -ip -std=c99"
F77=ifort
FFLAGS="-ieee-fp -g -O3"
CXX=icpc
CXXFLAGS="-g -O3 -ieee-fp"
FC=ifort
FCFLAGS="-g -O3 -ieee-fp"
ICC_LIBS=/opt/intel/Compiler/11.0/074/lib/intel64
IFC_LIBS=/opt/intel/Compiler/11.0/074/lib/intel64
LDFLAGS="-L$ICC_LIBS -L$IFC_LIBS -L/usr/local/lib64"
SHLIB_CXXLD=icpc

----- configure 実行引数 -----
OMP_NUM_THREADS=8

MKL_LIB_PATH=/opt/intel/Compiler/11.0/074/mkl/lib/em64t

MKL="   -L${MKL_LIB_PATH}                               \
            -Wl,--start-group                               \
                    ${MKL_LIB_PATH}/libmkl_intel_lp64.a        \
                    ${MKL_LIB_PATH}/libmkl_intel_thread.a     \
                    ${MKL_LIB_PATH}/libmkl_core.a           \
            -Wl,--end-group                                 \
            -liomp5 -lguide -lpthread -lgomp"

./configure --with-lapack="$MKL" --with-blas="$MKL" 

リストの終わり

  • なかまさんが回答されるでしょうが、経験的に、LANG=Cをつけると解決するかも。 -- 谷村 2008-12-05 (金) 19:13:45
  • 「LANG=C LC_ALL=C make check」でなおるかも -- 2008-12-05 (金) 19:51:34
  • ここですね -- 2008-12-05 (金) 19:55:18
  • コメントありがとうございます。 試した結果です。
    0) 最初の質問のケースは LANG=ja_JP.UTF-8でmake 同一環境でmake check しました。
    このときsprintfのエラーがmethds-Ex.Rで発生
    1) LANG=ja_JP.UTF-8 環境でmake; LANG=C,LC_ALL=C環境でmake checkはすべてとおる。
    2) LANG=C,LC_ALL=C でmake; LANG=C,LC_ALL=Cでmake check はとおる。
    3) LANG=C,LC_ALL=C でmake; LANG=ja_JP.UTF-8 に設定して make check すると同一箇所で落ちる。
     -- 大津? 2008-12-05 (金) 22:12:31
  • 了解しました -- 2008-12-05 (金) 23:39:50
  • 上のconig.siteでコンパイラオプションの指定誤りがありました。たびたびの誤り,申し訳ありません。 -ieee-fp ではなく-mieee-fpです。 -- 大津? 2008-12-08 (月) 13:33:19
  • 単純にメッセージファイルにミスがあっただけの事で, 環境は無関係です. methods.patch を当てて, "(cd po; make methods.pkg-update)" を実行して下さい. バイナリ配布を利用の方は, R_HOME/library/methods/po/ja/LC_MESSAGES/R-methods.mo を R-methods.mo と置き換えると幸せになれる*かも*しれません. -- なかま 2008-12-08 (月) 17:06:34
  • IntelCompiler?をお使いなら, MKLの -lgomp は不要です. ただIntelCompiler?の場合, 一部のパッケージが動かないとか, gccより遅くなることもままあります. -- なかま 2008-12-08 (月) 17:07:39
  • ありがとうございます。./poに libiconv-1.12のソースから en@quot.insert-header,insert-header.sed,remove-potcdate.sedをコピーしてからmake methods.pkg-updateを実行しました。configureしなおして(不要?)make しなおしたらOKでした。 -- 大津? 2008-12-08 (月) 19:59:26
  • たびたびの修正ですみません。上の3つのファイルは./po内でmakeできました。 -- 大津? 2008-12-08 (月) 21:26:08
  • めんどくさいでしょうが, CentOS+IntelCompiler?+MKL+R-2.8.0でどのように構築したか書いて頂ければ助かります. gettextパッケージが必要だと思うのですが, libiconvのソースから必要というのは何がひっかかったのでしょう? 上の3つとは? 私はいいかげんな性格なので, 脊髄反射で問題回避することもあるので, つまった過程なども含めて詳細に記述していただければ私も含めて多くの人の参考になると思います. -- なかま 2008-12-09 (火) 10:23:47
  • ひっかかった点はつぎの2つです。
    1)手順を誤解してmake前のソースにたいして (cd po;make methods.pkg-update)を実行していた。
    2) (cd po;make methods.pkg-update) を実行すると ./po 中に en@quot.insert-header,および remove-potcdate.sed の2つのファイルがないため、修正が完了しない。
    当初、iconvのソースをconfigureした箇所から同名のファイルをコピーしていた。
    これらは (cd po; make en@quot.insert-header; make remove-potcdate.sed)で作成される。 (insert-header.sedはなくても大丈夫のようです。)

    ビルドの全体の手順は
    1) R-2.8.0 ソースの展開
    2) なかまさんの methods.patch を ./src/library/methods/po/ にてあてる。
    patch <  methods.patchのパス名 
    とする。R-ja.poが修正される。
    3) インテルコンパイラ icc 11.0, ifort 11.0 およびmkl 10.1の環境変数を設定する。(コンパイラがスクリプトを提供。) Linux x64 をターゲット環境として指定する。
    4) config.site を上記の最初の質問のように指定する。ただし -ieee-fpの指定は誤り。(コンパイラの日本語ヘルプが間違っている.) ただしくは -mieee-fp と指定。Rのconfigureは-mpと-c99を自動的に設定するが、これらが deprecatedな指定であるとして、make時に警告がたくさんでる。 -mieee-fpは-mpの後継,-std=c99は-c99の後継。
    5) 上記質問中のように環境変数 M<L を設定し、configureを実行する。ただし-lgompの設定は不要(なかまさんの指摘)
    6) R の make を実行
    7) 次の2行をmakeを実行するのと同じディレクトリで実行
    (cd po; make remove-potcdate.sed; make en@quot.insert-header) 
    (cd po; make methods.pkg-update) 
    8) make check を 実行すると問題なくとおる。
    当初問題のあった部分の日本語メッセージもただしく出力されます。-- 大津? 2008-12-09 (火) 14:36:21
  • ビルドについての修正です。8)のmake check の前に,一度 make が必要のようです。 -- 大津? 2008-12-10 (水) 20:40:21
  • 7)は, 冗長ですが, cd po;make update-pkg-po の方がいい(簡単と言う意味で)ですね. 更新したpoの為に8の前に make が必要なのはそうです. あとconfig.siteにCC=iccとSHLIB_CXXLDFLAGS=-sharedも入れて, R-develにレポートを流すと良いかも. MKLの並列化はopenMPを使うので, iccの場合は, `-liomp5 -lguide -lpthread' でgcc-4.2以降の場合は `-lgomp' になり, 主にfortranのコンパイラのABIが異なるので, start-group hoge end-groupで括るライブラリの名前が異なります. あと, configure のラインに LIBM=-limf と加えるとmathのライブラリ(sin,exp...)もIntelになります. -- なかま 2008-12-10 (水) 23:03:49
  • config.siteの指摘ありがとうございます。問題というのではないですが、上記のsetMethod の部分のメッセージが、対話的に実行すると日本語で表示され、sourceすると英文になります。これは仕様でしょうか?あるいはconfig時の設定の誤り? -- 大津? 2008-12-11 (木) 14:07:03
  • sourceの場合はerrorハンドルの範囲が異なってしまうので, この場合日本語メッセージを失敗したので, 英語のメッセージを出してくれます. -- なかま 2008-12-11 (木) 18:16:10

線形モデルでの変量効果(ランダム効果)・混合効果の指定

Rcommander利用者? (2008-09-02 (火) 10:45:00)

線形モデルでの変量効果(ランダム効果)・混合効果の解析方法を教えてください。変数の指定方法などわかりません。よろしくおねがいします。

  • どの統計パッケージの関数を使うかによって指定方法がだいぶ違います。Rcommanderを使ったことがありませんが、"nlme"のlmeであれば、モデルの指定は普通の線形モデル(lm)と同じで、混合効果を入れたいパラメータの指定方法は、"random=~+1|group" のようにチルダの後に、変数を書き込みます、その後の"|"の後に考慮するグループを指定します。"+1”だけだと、切片のみランダム効果考慮したモデルになります。 -- 低級者? 2008-09-02 (火) 16:35:50

JACKNIFE という統計用語はどんなことですか?

むかしちゃん? (2008-06-25 (水) 22:20:15)

統計用語にJACKNIFE という物騒な用語をインターネットで見つけましたが
どんなところでどんな風に使うのですか?

  • google で「ジャックナイフ 統計学」などで検索しましたか?http://anchoret.seesaa.net/archives/20080615.html でも読んだらいかがかと。ところで,ここがどこか分かって質問しているのだろうか。 -- 2008-06-25 (水) 22:54:37

組み込みデータセットを参照している関数の検索法?

気になった人? (2008-05-20 (火) 09:32:44)

Rの魅力の一つは、各関数が比較的詳しい参考実行コードを持っており、関数の使い方がわかることです。もう一つ豊富な組み込みデータセットがあり、関数参考実行コードはしばしばそれを用いることで、単に参考のための参考に止まらない迫真性を与えることができます。

ところで逆ができるでしょうか。つまり、ある組み込みデータセット(例えば co2)を例示用コードで参照している関数を一覧することです。

例えば Linux なら端末から次のような命令を実行すればそれらしいことができますが、Rには元々そうした機能は無い?

$ grep -r "co2" /usr/lib/R/* | grep "/help"
  • help.search("co2")じゃダメなんですかね? -- 2008-05-20 (火) 11:04:24
  • これではデータセット CO2, co2 しかヒットしません(少なくとも私の Ubuntu Linux, R 2.7.0 では)。 関数 matplot, decompose, HoltWinters? なども参考コードで co2 を使っています。 -- 気になった人? 2008-05-20 (火) 11:20:22
  • http://rgonzui.nakama.ne.jp/ -- 2008-05-20 (火) 13:23:16
  • メモリーがたらんので, 良く止まります(;_;) -- なかま 2008-05-20 (火) 15:27:28
  • やはりR自体ではそうした便利な機能はないということでしょうか。似たようなデータを解析する際参考になるかと思うのですが。 -- 気になった人? 2008-05-20 (火) 17:39:39

CIでのtick marks

NP? (2008-04-22 (火) 14:27:46)

Rを用いてCumulative incidence curveを書くところまではできたのですが、tick marksを打ち切りとなったものの観察期間を示すためにつけろといわれました。どのようにすればできるでしょうか。教えてください。よろしくお願いいたします。

  • "Cumulative incidence curve" の説明や,できているプログラムも示した方がよいでしょう。 -- 2008-04-22 (火) 14:50:13
  • cumulative incidenceとはcompeting risk(競合リスク)といわれるものを考慮し、1-Kaplan-Meier法に代わって、近年、主に治療関連死亡や再発率などに用いられている手法です。グラフを書くとちょうどKaplan-Meier曲線を上下180°反転したような形になります。Rではcmprskというパッケージを使って書くことができます。 -- NP? 2008-04-22 (火) 18:19:52
  • で、プログラムは? -- akira? 2008-04-22 (火) 21:12:37
  • グラフは描くもの。あなたの説明は「"Cumulative incidence curve" の説明」になっていない。分野の違う人の手助けを得るために何の役にも立っていない。
    > Rではcmprskというパッケージを使って書くことができます
    そのうちのどの関数?関数がわからないと example も見られないので
    cuminc か。面倒くさそ。質問者をいたぶるなというご意見をお持ちの方もいらっしゃるようだが,今回は,こちらがいたぶられているような気がする。 -- 2008-04-22 (火) 22:21:59
  • R Graphical Manual を隅から隅まで眺めて、使えそうな図のソースから部品コードをパクる。 -- 2008-04-22 (火) 23:02:51
  • cuminc を読んで,改造するのが本来ではあろうが,最初から全部自分で描くのがよさそう。いつか暇つぶしに作ってみよう。 -- 2008-04-22 (火) 23:26:30
  • http://www.stat.unipg.it/luca/R でダウンロードしたCumIncidence?.Rというのを使ってできました。どれがプログラムなのかよくわからないので質問に答えられなくてすみません。 -- NP? 2008-04-23 (水) 13:56:51
  • テストデータの dis が群,status がエンドポイントでしょうね。エンドポイントが2種類ある。0,1,2 の0が 打ち切りデータを表すコードでしょうね。で,CumIncidence?(ftime, status, dis) で呼ぶと,4本の階段関数が描かれる。dis 2群× status 2種。さて,打ち切りマークを描くときにstatu 1 に対応する階段関数上にマークするのか status 2 に対応する階段関数上にマークするのか,決められないじゃないですか。Kaplan-Meier 法で打切り例のマークを付けられるのは,エンドポイントが1種類だけだからできるんですよね。「tick marksを打ち切りとなったものの観察期間を示すためにつけろ」って,深く考えないで,思いつきで命令したんじゃないかな?あなたが今扱っているデータのエンドポイントが1種類だけならば,マークを付けることはできますけどね。 -- 2008-04-23 (水) 17:17:23
  • ありがとうございます。0,1,2を0,1のものと0,2の2つにわけて別のグラフとして表示した場合にはtick marksをつけることは可能でしょうか? -- NP? 2008-04-23 (水) 17:51:37
  • できるでしょうね。やっつけ仕事だけど,CumIncidence?.R の2箇所にあるlegend 関数のうち,1番目のlegend 関数の後に,以下のプログラムを挿入してご覧なさい。(正しいかどうか保証しないけど)エンドポイントが複数種ある時には,それぞれの同じ位置にマークを付ける仕様にしている。 -- 2008-04-23 (水) 18:10:58
          for (j in 1:nrow(x$est)) {
          		temp <- as.integer(unlist(strsplit(rownames(x$est)[j], " ")))
          		temp <- ftime[fstatus == 0 & group == temp[1]]
          		temp2 <- timepoints(fit, temp)
         		mapply(function(x, y) segments(x, y, x, y+0.02, col=col[j]),
                           sort(temp), temp2$est[j,])
          }
  • 回答ありがとうございます。試してみましたがうまくいきません。2箇所にあるlegend 関数のうち,1番目のlegend 関数の後とは具体的にはどこに挿入すればよろしいでしょうか?教えてください。 -- NP? 2008-04-23 (水) 21:51:53
  • 117,118行目に legend 関数が書かれていますよね。その後です。つまり119行目以降に挿入。 -- 2008-04-24 (木) 08:16:44

    #ref(): File not found: "fig.png" at page "Q&A (初級者コース)/13"

  • えっと、「0,1,2を0,1のものと0,2の2つにわけて別のグラフとして表示した場合にはtick marksをつけることは可能でしょうか?」はやってみて上手くいけば可能だし、いかなければ不可能なのでは?「試してみましたがうまくいきません。」って、何をどうして上手くいかないのか分かりません。もっと分かるように書かないと返事も少ないですよ。少なくとも私は分かりません。 -- akira? 2008-04-25 (金) 08:10:44
  • 試せていないのだと思います(だって,改訂プログラムの断片をどこへ挿入して良いかわからないと言っているのだから。そもそも,「プログラムがどれかわからない」とまで書いていたのですから。)。返事も十二分にしているつもりですけど。 -- 2008-04-25 (金) 09:16:13
  • 親切にご返事いただいているのに的を射ていなくてもうしわけありません。legend関数の後とはlegend()のカッコのあとにいれればよいのでしょうか?119行目以降とはlegend("topleft", legend = rownames(x$est), x.intersp = 2, bty = "n", xjust = 1, col = col, lty = lty, lwd = lwd) の後ということですか?制変換により NA が生成されました とでて、グラフはかけるのですがtick marksがでません。お手数をおかけいたしますが、ご教授をおねがいいたします。 -- NP? 2008-04-25 (金) 10:53:26
  • > 制変換により NA が生成されました とでて
    「制変換」って,なんでしょうかね?CumIncidence?.R のテストデータを使いましたか?
    以下のように挿入します。 -- 2008-04-25 (金) 12:18:29
          legend("topleft", legend =  rownames(x$est), x.intersp = 2, 
                 bty = "n", xjust = 1, col = col, lty = lty, lwd = lwd)
          for (j in 1:nrow(x$est)) {
          		temp <- as.integer(unlist(strsplit(rownames(x$est)[j], " ")))
          		temp <- ftime[fstatus == 0 & group == temp[1]]
          		temp2 <- timepoints(fit, temp)
         		mapply(function(x, y) segments(x, y, x, y+0.02, col=col[j]), 
                          sort(temp), temp2$est[j,])
          }
          out <- list(test = tests, est = tfit$est, se = sqrt(tfit$var))
  • 何度も申し訳ありません。テストデータを使っており、グラフ自体はお示しいただいたのと同じものがかけるのですが、warining messages 1強制変換により NA が生成されました と最後に表示され、tick marksが表示されません。何度試しても同様の結果になります。解決策を教えてください。よろしくお願いいたします。 -- NP? 2008-04-25 (金) 13:07:01
  • bmt.csv からデータはちゃんと読めているのですね。 -- 2008-04-25 (金) 14:05:30 ちょっと,後で消去しますから,多めに書きます。
    >  ( x <- read.csv("bmt.csv", header=TRUE, sep=";") )
       dis ftime status
    1    0    13      2
    2    0     1      1
    3    0    72      0
    4    0     7      2
      途中省略
    34   1    32      0
    35   0    12      1
    で,プログラムはちゃんと挿入できていますね。
    ところで,挿入するプログラムは上からコピーしたでしょうね。 自分で入力すると間違いが入っているかも知れません。よ。
    そのプログラムを source で読み込みましょう。
    で,実行すると,
    > CumIncidence(x$ftime, x$status, x$dis)
    
    +-------------------------------------------------------------------+
    | Cumulative incidence function estimates from competing risks data |
    +-------------------------------------------------------------------+
    Test equality across groups:
      Statistic  p-value df
    1     1.302 0.253915  1
    2     7.082 0.007785  1 
    
    Estimates at time points:
              0     10     20     30     40     50     60     70
    0 1 0.05882 0.1176 0.1765 0.1765 0.1765 0.1765 0.1765 0.1765
    途中省略
    0 2 0.05882 0.12631 0.12667 0.12077 0.12077 0.12077 0.12077 0.12077
    1 2 0.00000 0.11558 0.11558 0.11558 0.11558 0.11558 0.11558 0.11558
    以上で終了し,tick mark のついている図が描かれており,warning なんて出ないのですけど。
    それと,今更なんですが,「グラフ自体はお示しいただいたのと同じものがかけるのですが」って,上に掲示した図から tick mark を除いたものということでいいのですね?
    修正プログラム(+テストデータ)をアップロードしておいた。一番下の添付ファイル欄の CumIncidence?.R をダウンロードすれば?
  • ありがとうございました。おかげさまでできました。お騒がせいたしました。ご親切に教えていただきましてありがとうございました。感謝いたします。 -- NP? 2008-04-25 (金) 21:34:15
  • なぜできなかったのですか?どこを誤解していたのでしょうか?それを書いていただいた方が,今後のためにもなるでしょう。うまくいきません,うまくいきませんだけで,突然,できましたありがとう。じゃ。脱力しますよ。これくらいのこと自分でできなきゃ,中級じゃない。 -- 2008-04-25 (金) 23:08:28
  • 添付していただいたファイル欄のものともともと使用していたものと比べるとx <- structure(list(dis = c(0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 1L以下がなかったことが原因と思われました。bmt.csvの読み込みはできていましたが、なぜCumIncidence?.Rが異なることになったかはよくわかりません。, -- NP? 2008-04-26 (土) 17:43:38
  • x <- structure 以降の部分は,bmt.csv のことですよ(それも,理解してもらえていなかったのか)。読み込みがうまくいっていないのかと,老婆心までに付けただけ。 -- 2008-04-26 (土) 20:11:50
  • ありがとうございます。ということは、読み込みがうまくいっていたなかったということになるのでしょうか。 -- NP? 2008-04-26 (土) 20:17:15
  • ありがとうございます。ということは、読み込みがうまくいっていたなかったということになるのでしょうか。 -- NP? 2008-04-26 (土) 21:03:33
  • そんなことは,私にはわかりません。もう一度,bmt.csv を読み込んだ後の,そのデータファイルの内容を確認すればよいだけではないですか?(中級者とは思えない対応にとまどっています)。また,コメントが重複して掲載されていますよ。(前にもあった重複や不適切な投稿は,誰かが適切に解消してくれたんでしょうかね。) -- 2008-04-26 (土) 22:15:17
  • 「添付していただいたファイル欄のもの」を適用した後,あなたが実際にテストデータを読み込む操作をした後,CumIncidende?.R の関数数 CumIncidence? を実行したら,どうなりますか。やってみて結果をよく考察しましょう。
    なお,もう疲れましたので,わたしからの,この後の対応は遠慮させていただきます。 -- 2008-04-26 (土) 22:22:09
  • お手数をおかけして申し訳ありません。いくつかのデータでやってみましたが、CumIncidence?.Rの最後にx <- structure() CumIncidence?(x$ , x$ , x$ )と付け足すといずれの場合にもできました。ありがとうございました。 -- NP? 2008-04-27 (日) 10:22:23
  • はいそうですか。それでよければ,なにおかいわんやです。なんだかなあ?わたしにもわけがわからない。x <- structure() CumIncidence??(x$ , x$ , x$ ) って,いったいなに?もういい。 -- 2008-04-27 (日) 20:36:35

ACDモデル

UO? (2008-04-09 (水) 11:48:43)

皆さんに相談があります。
RでAutoregressive Conditional Durationモデルを使いたいのですが。
可能でしょうか?
ご存知の方がいらっしゃっいましたら、教えてください。

  • RsiteSearch? で検索しても無いようですね。違う名前で存在する可能性はありますが。 -- 2008-04-09 (水) 20:56:15

rownameの付け方

rowhelp? (2008-04-07 (月) 10:57:23)

はじめまして、現在、Rを使用し遺伝子解析を始めたばかりです。
データフレーム内のある特定の列に含まれる文字列をrownameに変換したいと思います。

どのような作業を行うのが一番よろしいでしょうか。
ご教授をお願いいたします。

  • 簡単でよいから、処理前と期待する処理後のデータフレームの例を示してください。 -- 2008-04-07 (月) 12:33:03
  • 説明の為だけに別記事を作ってはいけません。次のような風にすれば良い? -- 2008-04-07 (月) 14:11:32
    > DF <- data.frame(A=letters[1:4], B=runif(4), C=rnorm(4))
    > DF
      A         B          C
    1 a 0.1429617  0.8767259
    2 b 0.7656706  0.2077312
    3 c 0.5311202 -0.6043531
    4 d 0.9375921  1.0804659
    > rownames(DF) <- DF[,1]
    > DF
      A         B          C
    a a 0.1429617  0.8767259
    b b 0.7656706  0.2077312
    c c 0.5311202 -0.6043531
    d d 0.9375921  1.0804659
    > DF <- DF[,-1]
    > DF
              B          C
    a 0.1429617  0.8767259
    b 0.7656706  0.2077312
    c 0.5311202 -0.6043531
    d 0.9375921  1.0804659
  • こんなのもありです: -- 鈴木@ef-prime? 2008-04-07 (月) 15:07:59
    > DF.new <- data.frame(DF, row.names="A")
    > DF.new
               B          C
    a 0.79124741  1.2432360
    b 0.03667521 -1.0248516
    c 0.78015687  0.1808611
    d 0.30211288  0.2649450
  • ご迷惑をおかけしました。ありがとうございます -- rowhelp? 2008-04-07 (月) 15:28:31
  • まずは基本的な関数を覚えれば解決すると思いますので、R-Tipsなどから始めると、すっきりする思いますよ。
    あと、この手の質問は?data.frameで解決すると思いますが、初心者コースに投稿された方が初心者の方の参考になってよいと思いました。 -- akira? 2008-04-08 (火) 09:47:27

凡例中のラインの角度の変更方法

yuta? (2008-04-03 (木) 16:43:46)

こんにちは。いつも参考にさせていただいています。
以下に示すような折れ線グラフと縦線プロット(plot()のtype="h")の混在したグラフがあります。このグラフに凡例を付けたいのですが、図にもあるように、legend()を普通に使うだけではラインはすべて横線になってしまいます。

(plotのスクリプト省略)
par(xpd=NA)
legend(locator(1),c("a-pro","a-height","b-pro",
  "b-height"),col=c("black","black","Royalblue","Royalblue"),
  lwd=c(2,3,1,1.5),pch=c(1,NA,1,NA))

凡例中で縦線を使う方法はあるのでしょうか。お尋ねいたします。

#ref(): File not found: "QA.png" at page "Q&A (初級者コース)/13"

  • 縦線はpch="|"でいけると思いますが、太さは変わらないかも。cexでごまかすか?
    もしくは縦線でなくてboxでもいけるなら、pch=22とpt.bgで背景色を指定するとか
    それが嫌なら自作関数でしょうか? -- akira? 2008-04-03 (木) 23:19:48
  • ありがとうございます.ポイントの形状で乗り切る方法があるのですね!チャレンジしてみます.
    実はソースをちょっと眺めてみて,ラッパーを作るのは自分のスキル(と割ける時間)からムリと考えていました. -- yuta? 2008-04-04 (金) 00:13:30
  • akiraさんのご指摘を受けて、いろいろ試行錯誤してみました。以下のようなスクリプトで、このような凡例を作りました。これで当面の用は足せそうです。どなたかの参考になればと、フィードバックさせていただきます。
    legend(locator(1),c("a=pro","a-height","b-pro",
      "b-height"),col=c("black","black","Royalblue","Royalblue"),
      lty=c(1,0,1,0),lwd=c(2,0,1,0),pch=c(1,15,1,15))

    #ref(): File not found: "QA2.png" at page "Q&A (初級者コース)/13"

    • yuta? 2008-04-10 (木) 14:01:48

特定のクラスターに属するデータだけをランダムに抽出するには?

たいち? (2008-02-12 (火) 18:20:13)

こんにちは。こんなデータがあるとします(実際はもっと長く,同じschoolに属するデータの個数は一定ではありません)。

   school y x
 1      1 4 1
 2      1 3 2
 3      1 2 3
 4      5 4 2
 5      5 5 3
 6      5 3 4
 7      8 4 3
 8      8 4 3
 9      8 1 2

ここから,同じschoolに属する人のxとyだけをランダムに抽出したいのですが,どのようにすればいいのでしょうか?
よろしくお願いします。

  • 次のようなことがしたい? -- 2008-02-12 (火) 21:00:40
    > A <- data.frame(school=sample(1:3, 10, 1),x =sample(1:4,10,1), y=sample(10:14,10,1))
    > A
       school x  y
    1       2 1 12
    2       1 4 10
    3       1 1 12
    4       1 1 13
    5       1 1 14
    6       3 1 12
    7       3 4 12
    8       2 4 13
    9       3 3 13
    10      2 1 11
    > A1 <- A[A$school==1,,]
    > A1
      school x  y
    2      1 4 10
    3      1 1 12
    4      1 1 13
    5      1 1 14
    > A1[sample(seq(ncol(A1)),3),,] # school=1 から3ケースを非復元ランダム抽出
      school x  y
    2      1 4 10
    4      1 1 13
    3      1 1 12
    > A1[order(sample(seq(ncol(A1)),3)),,]  # 行番号を整列させたければ
      school x  y
    2      1 4 10
    3      1 1 12
    4      1 1 13
  • ありがとうございます。データを母集団と考えて2段抽出をしたいのですが,schoolの番号がそろっていないので,"school==1"とかいう風に指定することができないのです。まずは学校の番号をランダムに抽出できればそれでいいと思うのですが…。 -- たいち? 2008-02-13 (水) 09:57:15
  • A[order(sample(seq(ncol(A)),3)),,] とするだけでは。 -- 2008-02-13 (水) 12:14:43

ルート権限のないシステムにパッケージを個人的にインストールするには?

使用歴だけは長い人? (2008-02-06 (水) 14:10:12)

ルート権限の無いシステムに個人的にパッケージをインストールしようとしています。ほとんどのパッケージは問題なく個人ディレクトリにインストールできるのですが、(これまた個人的にインストールした)外部ライブラリへのラッパーであるパッケージをインストールしようとすると、(当然でしょうが) /usr/local/lib を参照しようとしてエラーになります。こうしたとき必要なライブラリ位置をRに教えてあげるにはどうすればよいのでしょうか。ちなみに問題のパッケージは gsl でこれは GNU GSL ライブラリーへのラッパーです。OS は Linux, R 2.6.1 を使用しています。GSL ライブラリは個人ディレクトリにインストール済みです。管理者に GSL をインストールしてもらえば済むことでしょうが、同様の問題が今後も起きそうで、何とか個人的にインストール出きると便利なのですが。うまい方法があれば教えてください。パッケージのインストールにはいつも R CMD INSTALL xxx.tar.gz としています。

  • 下請けライブラリを例えば `configure --prefix=~/' 等で ~/lib や ~/include にインストールしたケースでしょうか. R CMD INSTALL に --configure-vars とかもありますが, 全てのパッケージでうまくいかないので, そんなときは ${R_HOME}/etc/Makeconfの中の, `CPPFLAGS = -I~/include' と `LDFLAGS = -L~/lib' などを弄ると楽だと思います. あとはLD_LIBRARY_PATHを適当な所(${R_HOME}/etc/ldpathsでもいいかなぁ)に書き込むだけです. -- なかま 2008-02-06 (水) 23:00:43
  • おそらくかなり試行錯誤が必要と思いますが、できることが分かりましたのであれこれ試してみます。ありがとうございました。 -- 使用歴だけは長い人? 2008-02-07 (木) 19:56:11
  • 質問は、(1) 必要なライブラリ位置をRに教えてあげるにはどうすればよいのか、(2) ルート権限のないシステムにパッケージを個人的にインストールするにはどうすればよいか、の2つを尋ねていると解釈しました。(2)の方は以前にやったことがありますが、(1)の方は、ちょっと自信なし。
    > install.packages("hoge",lib="~/R/library",
      configure.args = "CPPFLAGS = -I~/include LDFLAGS = -L~/lib")
    とすると(configure.argsの内容はあくまで例ですので、自分の指定したいオプションに書き換えてください) 、どうなりますか?どこにインストールしたかは、
    > library()
    で分かります。~/R/libraryに入れたpackageを使うには、.RenvironにR_LIBS=~/R/libraryを足す必要があるかも。現在のパスは、
     > .libPaths()
    [1] "~/R/library"              "/usr/local/lib/R/library"
    これで確認できます。-- 谷村 2008-02-12 (火) 20:59:56
  • 谷村さんありがとうございます。中間さんのヒントに従いあれこれ試して見ましたが、今のところ成功していません。谷村さんのヒントに従って作業してみましたが次のようなエラーメッセージがでてうまくいきません。C compiler cannot 云々とは何を指しているのか見当がつきません。 -- 使用歴だけは長い人? 2008-02-13 (水) 22:21:06
    * Installing * source packages 'gsl'...
    checking for gcc... gcc
    checking for C compiler dafault output... configure: error C compiler cannot create executables
  • このエラーは例えば私の環境で下記のようにすると再現します。 -- 谷村 2008-02-14 (木) 00:35:56
    $ tar xzf gsl_1.8-8.tar.gz && cd $(tar tzf gsl_1.8-8.tar.gz |head -n1)
    $ pwd
    /tmp/gsl
    $ ./configure LDFLAGS="/opt/local/lib" CPPFLAGS="-I/opt/local/include" 
    checking for gcc... gcc
    checking for C compiler default output... configure: error: C compiler cannot  create executables
    See `config.log' for more details.
    正しいオプションは下記です。
    $ ./configure LDFLAGS="-L/opt/local/lib" CPPFLAGS="-I/opt/local/include" 
    checking for gcc... gcc
    checking for C compiler default output... a.out
    checking whether the C compiler works... yes
    [以下略]
    参考になりますでしょうか。
  • config.logに書いてあると思いますが. ac_linkあたりでこけてるのだと思います. 関係する環境変数は, CC CFLAGS CPPFLAGS LDFLAGSのいずれかです. config.logに失敗に至ったプログラムとコマンドが記載されてますから参考になるかと思います. -- なかま 2008-02-14 (木) 15:56:18

パワーアナリシス

大学生K? (2008-01-24 (木) 04:45:22)

Rでパワーアナリシスをできる検定方法は、
t-test,anova,propのほかにはないのでしょうか?
個人的にノンパラメトリックを含め、いろいろな検定手法に対する、パワーアナリシスを行う必要がありまして・・・ご教授ください。

  • この頁の過去記事「 power.prop.testの使い方(比較する2群のサンプル数が異なる場合) 」など参考になるのでは。 -- 2008-01-24 (木) 05:41:07-g -O2 -wd188 -ip -std=c99
  • 自分で関数を書けばどんなことでもできますhttp://aoki2.si.gunma-u.ac.jp/R/index.htmlのVII.パワーアナリシスのあたり -- 2008-01-24 (木) 10:02:21
  • どの検定かによりRの対応状況が変わると思いますが,膨大な数の計算を必要としないならば,G*Power (http://www.psycho.uni-duesseldorf.de/abteilungen/aap/gpower3/ ) を使った方が,関数を書く手間が省けて早いです。 -- aa? 2008-01-24 (木) 10:47:06
    URL の後に ) が来ると,それも URL の一部だと思うバグがあるので,修正
  • 修正していただきありがとうございます。 -- aa? 2008-01-24 (木) 19:54:28

Cコードで三角関数を使用すると0が返る件

田島? (2008-01-18 (金) 22:06:14)

はじめまして。田島と申します。突然のお尋ねで恐縮ですがよろしくお願いいたします。
WindowsXp?にてR-2.6.1+MinGWにて下記のCコードをコンパイルしました。コンパイルに関するエラーは出ませんので、includeの問題はなさそうですが、seq[i]という入力ベクトルにどんな値が入っていても返り値であるsfというベクトルのすべての要素に0が返ります。ためしに、すべての返り値にsin(1.0)という固定値を代入するようにしても0が返るはずはないのですが、すべて0と返ります。私だけの環境で生じている可能性もあろうかと思いますので、初心者Q&Aがふさわしいかもしれませんが、なぜか書き込みができませんでしたので、こちらに投稿させていただいております。

その他の四則演算をするコードでは、期待した結果が返ります。

あまりコンパイルするような作業の経験はないのですが、なんかのパスが悪いのかと思いますが、お恥ずかしいことにかなり検索などもしましたがどこに問題があるか見当がつかない状況です。三角関数を使いたいだけということですので、四則演算で計算するアルゴリズムをつかって計算すればいいのですが、本来できることができていないのであれば、非常に気持ち悪いことですし、今後のために理解を深めたいということもありまして、お尋ねしているしだいです。
もし、ほかにお尋ねすべき適切なセッションがあれば、ご指導いただければ幸いです。どうぞよろしくお願いいたします。
test1.c

#include <math.h> 
void test1(double *seq, int *seqn, double *sf)
{
	int i;
	for(i=0;i<=*seqn-1;i++){
	sf[i] = sin(seq[i]);
	}
}

やったこと

Rcmd SHLIB test1.c

R上でやったこと

dyn.load("test1.dll")
a<-seq(0,pi,length=10)
.C("test1",as.double(a),length(a),sf=double(length(a)))$sf
  • 勝手に直しましたが, 上のようにしたら, どんな結果になるんですか? なるべく, 他人が再現しやすいように書くといいですよ. -- なかま 2008-01-18 (金) 23:08:40
  • すばやいご指摘ありがとうございました。中間先生が修正くださった点から、さらに自分が行った形式に修正しました。
    この結果は
    [1] 0 0 0 0 0 0 0 0 0 0
    となる状況です。 -- 田島? 2008-01-18 (金) 23:16:51
  • もし sin の代わりに cos を使うとどうなりますか。何かの手違い(例えば a <- 10; a < -seq(0,pi,length=10) などと)で実は a がすべてゼロ(FALSE)のベクトルになってしまっているということはありませんか。 -- 2008-01-18 (金) 23:36:53
  • MingwはRtools の物ですよね? 手元の環境ではRtools2[67]で動いてますが... -- なかま 2008-01-19 (土) 00:07:58
  • .C("test1",as.double(a),length(a),sf=double(length(a))) の実行結果は↑x2の問題もわかるので欲しいですね.($sfは余計) -- なかま 2008-01-19 (土) 00:14:19
  • 早速のいくつかの返答ありがとうございました。
    入力のベクトルはいつも確認しています。0ばかり、あるいはNULLベクトルである可能性は最初に考えましたのでチェックをしていますが、それはないようです。また最初に問題に気がついたときはcos(x)も使用したコードだったのですがcos(x)の値も0になります。 今回、自分で問題の本質を切り分けるためにコードを単純化して最終的に問題の原因を特定したけれども、その解決法を探し出すことができず、お尋ねしているという状況になります。実際に使用する場合には数百の要素を持つベクトルデータを入力しますので運用上のテストもかねて、多くの返り値がある状態でも可視性をあげるためにリスト構造から知りたい結果だけを表示させていただけですので$sfをつけたことにあまり意味はございませんでした。
    MinGWはRtools27のものです。私の環境の作る過程でなにか問題が起きている可能性があるということかもしれませんね。再度、環境を構築しなおして試してみます。 -- 田島? 2008-01-19 (土) 06:21:07
  • 問題の切り分けとして, dotCを使う関数で手頃な物として, `max.col' は動作しますでしょうか. 動作しなげれば, Rの方がおかしくなってる可能性がありますし, 動作しなければ,リンク時のABIがおかしい事になるんではないでしょうか. あと,Rtools27は生物ですので, 持ってきた日がたまたま悪かったのかもしれません. -- なかま 2008-01-21 (月) 10:11:07

対応のある多重比較

こはく? (2008-01-12 (土) 22:14:03)

繰り返しのない2元配置(乱塊法または反復測定一元配置(対応のある一元配置?))で分析できるデータがあります。

これをボンフェローニの補正をおこなって多重比較するために、たとえば

a <- rep(1:3, each=4)
b <- rep(1:4, 3)
x <- c(7, 8, 5, 8, 1, 14, 16, 11, 7, 7, 6, 8)
pairwise.t.test(x,a,p.adjust.method="bonferroni")
pairwise.t.test(x,b,p.adjust.method="bonferroni")

ってかんがえたのですが、Rをはじめたばかりでよく分かりません。
ご意見いただけるとうれしいです。

3次元グラフでのz軸方向の回転

atte? (2007-12-01 (土) 11:05:31)

scatterplot3dのグラフを回転させたいのですが、angleではxy方向しか回転できません。xz、yz方向に回転する方法はないのでしょうか。

  • パッケージ rgl を試してみたら。マウスで自由自在に回転できます。 -- 2007-12-01 (土) 15:30:51
  • ありがとうございます。scatterplot3dでは足つきプロットtype="h"で、ラベル付き散布図を作っていたのですが、そのどちらのオプションも、rglで試したけれどどうすればいいかわからなかったもので。もしよければ方法教えていただけないでしょうか。 -- atte? 2007-12-17 (月) 14:01:01
  • コードを載せてください。 -- akira? 2007-12-17 (月) 21:49:07
  • 補足すると,「あなたがやったことを,実際にプログラムとして,示してください」ということですよ。上の方の注意事項に書いてあるでしょう?0から(マイナスから)教えるのは,こっちもキツイんですよね。 -- 2007-12-17 (月) 22:14:38
  • 大変返事が遅くなってしまい、本当に申し訳ございません。
    自分なりに試行錯誤した結果を以下に示します。
    まず、これが3次元グラフに表したいデータ(主成分分析の結果)で、「pca3」という名前に代入してます。
             PC1         PC2          PC3
    a -0.2138188 -0.09690295 -0.056538208
    b -0.1983966 -0.06068939  0.108130244
    c -0.3581248 -0.04182101  0.157024270
    d -0.2755906 -0.07243737  0.004878913
    e -0.4614072 -0.02512825  0.006534084
    f -0.3580950 -0.11927931  0.036777825
    g  0.2977400  0.60951743  0.180188932
    h  0.3043281  0.62594929  0.290022187
    i  0.1160385 -0.55632764  0.073677929
    j  0.7941420 -0.39650995  0.289428417
    k  0.4994019 -0.38653550 -0.234907993
    l  0.3296465  0.32195986 -0.691875477
    m -0.2982350 -0.06277819 -0.159138712
    n -0.1776291  0.26098297 -0.004202413
    で、次のようにrglを試してみました。
    pcalabel<-row.names(pca3)     #各プロットにつけたいラベルの名前。
    rgl.bg(color=c("white","black"))
    rgl.lines(c(-1,1),0,0,color="black")
    rgl.lines(0,c(-1,1),0,color="black")
    rgl.lines(0,0,c(-1,1),color="black")
    rgl.texts(c(1,0,0),c(0,1,0),c(0,0,1),
              text=c("PC1","PC2","PC3"),color="blue")
    rgl.points(pca3,color=heat.colors(1000),size=2)
    rgl.texts(pca3[,1],pca3[,2],pca3[,3],pcalabel,adj = 1)  #ここでラベル付けにトライ
    どこかplotのtype="h"をrgl.pointsのところに入れたらエラーが出たので、省きました。
    どうかアドバイス願います。 -- atte? 2008-01-06 (日) 18:01:53
  • なぜか rgl のインストールができないので確認できませんが、rgl を内部的に使う次の関数を試されてみたらどうでしょう. -- 2008-01-07 (月) 17:51:54
    rp.plot3d {rpanel}	R Documentation
    Interactive display of a plot of three variables
    Description
    
    This function produces a scatterplot of three variables, using the rgl package
    for three-dimensional display.
    Usage
    
     rp.plot3d(x, y, z, xlab  = NA, ylab = NA, zlab = NA, 
                      axes = TRUE, type = "p", size = 3, col = "red",
                      xlim = NA, ylim = NA, zlim = NA, ...)
    
    Arguments
    x,y,z 	vectors of observed values.
    xlab 	a character variable used for the first axis label.
    ylab 	a character variable used for the second axis label.
    zlab 	a character variable used for the third axis label.
    axes 	a logical variable determining whether the axes are shown.
    type  a character variable controlling the type of plotting. 
           If the value is  set to "n", the points are not plotted.
    size   the size of the plotted points.
    col 	the colour of the plotted points.
    xlim 	the plotting range for the first variable.
    ylim 	the plotting range for the second variable.
    zlim 	the plotting range for the third variable.
    ... 	other rgl parameters which control the appearance of the plotted points.
    Details
    
    The plot is produced by appropriate calls to the rgl package. This allows 
    interactive control of the viewing position. Other objects may subsequently be 
    added to the plot by using rgl functions and data which are centred and scaled 
    by the returned values indicated below.
  • rgl.texts() の代わりに text3d() を使うとOKのようです. -- 2008-01-08 (火) 17:06:20
    library(rgl)
    open3d()
    pcalabel<-row.names(pca3)     #各プロットにつけたいラベルの名前。
    rgl.bg(color=c("white","black"))
    rgl.lines(c(-1,1),0,0,color="black")
    rgl.lines(0,c(-1,1),0,color="black")
    rgl.lines(0,0,c(-1,1),color="black")
    rgl.texts(c(1,0,0),c(0,1,0),c(0,0,1),
             text=c("PC1","PC2","PC3"),color="blue")
    rgl.points(pca3,color=heat.colors(1000),size=2)
    text3d(pca3[,1],pca3[,2],pca3[,3],text=pcalabel,adj =1)  #text3d()を利用
  • ありがとうございます!text3d() でできました!
    あと、通常のscatterplot3dで使われるtype="h"の足つきプロット(?)はできないのでしょうか。 -- atte? 2008-01-08 (火) 19:06:22

display関数

似非R使い? (2007-11-30 (金) 16:50:43)

初めて投稿させていただきます。
Rを用いた統計の教科書の中で、display()とあるのですが、その通り書き込んでもエラーが出ます。display()は削除されたか、別の関数に置き換わったのでしょうか?

  • 初級者用のQ&AQ&A (初級者コース)があるのに気づかなかったですか?それにしても,いきなりdisplay()といわれてもねえ。なにかのパッケージ中にある関数なのかな?その教科書って,具体的には何であって,何ページに書いてあるんですか?その教科書にも,いきなりdisplay()って書いてあるんですか?そんな馬鹿な。 -- 2007-11-30 (金) 22:15:19
  • 最近中級者コースに初級者以下の質問が続いているようだ。(超初級者コースが必要かもしれない。)似非R使いのあなたは初級者コースに行きたまえ。 -- 2007-11-30 (金) 22:30:53
  • どのような記述なのか具体的に書いてもらわないと。。もしかしたらそのテキストの編者が独自に作ったパッケージかもしれないし。 -- 2007-12-01 (土) 14:15:56

barplot(x,names=label,horiz=T)の長いラベルを横書きに

SAStoR? (2007-11-19 (月) 16:23:14)

初めて投稿させていただきます.

barplot()を使って棒グラフを作成したいのですが,長いラベル(全角16文字程度)がついています.dotchartのようにラベルを横に表示させるにはどうすればよいでしょうか.棒グラフの場合,horiz=Tを指定してもラベルは垂直方向になってしまうため,全て表示がされず困っています.
”barplot(),text(),names,長いラベル”の組み合わせで検索してみましたが,うまく情報を見つけられませんでした.
どうぞよろしくお願いいたします.

A1 <- c(9,8,19,8,2,23,2,10)
A1label<-c("AAAAAAA","BBBBBBBBBBBBBBBBBBBBBBB","CCCCCCCCCCCCCC",
           "DDDDDDDDDDDD","EEEEEEEEEEEEEEEEEE","FFFFFFFFFFFFFFFFFF",
           "GGGGGGGGG","HHHH")
barplot(A1,names=A1label,horiz=T)
  • 中級者コースでの初歩的な質問申し訳ございませんでした.次回からは初級の方にまちがいなく投稿したいと思います.par()という関数の存在を知りませんでした.思ったように表示ができました.ありがとうございました. SAStoR? 2007-11-20 (火) 10:55:57
  • 初歩的な質問だからといって、初心者コースに質問してよいわけではない。まずは自助努力、ちゃんと検索すれば。 -- 2007-11-20 (火) 12:34:56
  • すみません.検索の仕方も稚拙でした.努力します.これからもよろしくお願いいたします. -- SAStoR? 2007-11-20 (火) 12:42:12

Rで重回帰 再投稿

Saito? (2007-11-13 (火) 15:55:26)

皆様、的確なご指摘ありがとうございました。
それぞれのコメントにお答えする前に、まずマルチポストに関してお詫び申し上げなければなりません。その件に関しては非常に軽率であり、マナーに欠けた行為であったと反省しております。統計学関連なんでも掲示板に投稿したあとに自分の質問がその掲示板に不適切だと判断してこちらに投稿したのですが、もう少しインターネット上のルールを勉強してから投稿するべきでした。さらに言葉を重ねますと、統計学関連なんでもありの掲示板に書き込みをしたあと確認を怠り、こちらの掲示板で皆様の非難の声を聞いてから統計学なんでもありの掲示板にコメントがなされているのを知った次第です。皆様に不快な思いをさせてしまい申し訳ありませんでした。
 また、中級者用掲示板にこのような初心者の質問をしてしまったこともお詫びいたします。私の全くの勘違いなのですが、昨日の時点では初級者用掲示板がスパム防止のため封鎖した、というようなことが書いてあったので。しかし今はそんな文はどこにも記載されておらず、完全に私の勘違いでした。皆様にご迷惑をかけてしまい、申し訳ありませんでした。お詫びの言葉にもなっていないかもしれませんが、なにとぞご容赦ください。

>簡単でいいですから疑問点が再現できるような例(もしくは組込みデータを使った例)をつけてください。
質問する側として当然の配慮が欠けていました。申し訳ありません。私が扱っているデータは以下のような感じです。すみません何度も試したのですが、うまく表示できませんでした。

> x
   StandardLength Feed Area
1             100   10    N
2             100   11    N
3             100   12    N
4             100   13    N
5             100   14    N
6             100   15    N
7             100   16    N
8             100   17    N
9             100   18    N
10            100   19    N
11            100   20    N
12            100   10    N
13            150   21    W
14            150   22    W
15            150   23    W
16            150   24    W
17            150   25    W
18            150   26    W
19            150   27    W
20            150   28    W
21            150   29    W
22            200   31    S
23            200   32    S
24            200   33    S
25            200   34    S
26            200   35    S
27            200   36    S
28            200   37    S
29            200   38    S
30            200   39    S
> result=lm(StandardLength~Feed+Area)  #StandardLengthを独立変数、
                                         FeedとAreaを従属変数として重回帰
> summary(result)
Call:
lm(formula = StandardLength ~ Feed + Area)

Residuals:
       Min         1Q     Median         3Q        Max 
-4.422e-14 -1.798e-15  1.179e-15  4.160e-15  9.431e-15 

Coefficients:
             Estimate Std. Error   t value Pr(>|t|)    
(Intercept) 1.000e+02  9.435e-15 1.060e+16  < 2e-16 ***
Feed        2.209e-15  6.171e-16 3.579e+00  0.00139 ** 
AreaS       1.000e+02  1.332e-14 7.506e+15  < 2e-16 *** #問題2の該当箇所。
AreaW       5.000e+01  7.750e-15 6.452e+15  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 

Residual standard error: 9.815e-15 on 26 degrees of freedom
Multiple R-Squared:     1,      Adjusted R-squared:     1 
F-statistic: 1.791e+32 on 3 and 26 DF,  p-value: < 2.2e-16 

> sd(Feed)  #問題3の該当箇所。
               今となっては恥ずかしいかぎりです。
[1] 9.123986
> sd(AreaS)
 以下にエラーsd(AreaS) :  オブジェクト "AreaS" は存在しません
             #問題1の該当箇所。
              sd()が計算されないため、
              前に投稿したやり方では標準化できませんでした。

>result() とは? >summary()のことだと,思いますよ(^_^)
ご指摘のとおりです。Summary(result)の間違いでした。申し訳ありません。

>問題3はあなたの理解通りですが、なぜ両者が同じだと思ったのですか(そもそも sd() で何を計算したのかそこがわからぬ)
 単純に標準誤差という言葉で表されるので同じ意味なのかな、と。
>稲垣宣生著「数理統計学改訂版」定理12.5(正規誤差仮定の下での回帰係数の分布)を見てください。
 ご紹介ありがとうございます。また私の書いた問題3の中で、「その違いを述べている参考書は見当たりませんでした」とありますが、これは統計学的にではなく、Rの参考書の話です。誤解があったようで失礼致しました。

>sd() で,従属変数の標準偏差を調べたのでは?推測に過ぎませんが。
推測のとおりです。説明不足、配慮不足でした。申し訳ありません。

>問題1は,そもそも,変数の単位に明確な意味があるケースなのですから,標準偏回帰係数を算出する必要性が薄い気がします。
ご指摘のとおりです。カテゴリカルデータの傾きを知ったところで意味がないのは承知しているのですが、以前読んだ論文にカテゴリカルデータにも関わらず、GAM Coefficientというものを算出しているものがあったので…。現在本当にその意味(Coefficientを回帰係数と訳すこと)であっているのか読み直しているところです。
>他のソフトウェアでは,おそらく,カテゴリカルデータを0, 1で表現して,連続変量と同様の算出法をしていると思いますので,ご確認して,ご報告頂けると幸いです。
>問題2は,? contrasts を読むとわかるかと思います。
>問題3は,すでにご紹介された教科書を参照なさると解決するかと思います。
丁寧なご回答ありがとうございました。自分の勉強不足を実感しました。少し勉強してみます。稚拙なコメントしか返せず申し訳ありません。

>推測の必要はないので以下のように答えておきます。…
わかりやすい説明ありがとうございました。返す言葉もありません。もう一度勉強させてください。

この掲示板をマナーを守って利用している方々にご迷惑をおかけしたことを重ねてお詫び申し上げます。

  • 「カテゴリカルデータの傾きを知ったところで意味がないのは承知しているのですが」
    カテゴリカルデータの場合には,傾きじゃなくて付加値(適切な言葉が見つからん)と考えればよいのだ。数量化I, II 類のときと同じ。あるカテゴリーに該当する場合にそのカテゴリーに与えられている係数値を*加*え*れ*ば*よ*い*のだ。つまり,ダミー変数は0/1しかとらないので,係数をβとするとそのカテゴリーにあてはまる場合には1×βつまりβ,当てはまらない場合には0×βつまり0が予測値として加わるのだ。そして,この場合も,変数は0,1しか取らないがβは傾きに違いない。
    それが,予測値に加わる量であるなら,どのカテゴリーの影響が一番大きいのか,加わる量が0とは有意に異なるのかというのは大いに意味がある。 -- 2007-11-13 (火) 15:55:58
  • 上の例だけど,どれが説明変数で,どれが被説明変数なんだろう。データの一部かも知れないが変なデータだ。StandardLength?が100,150,200はAreaがN,W,Sと完全に一致するし,Feedも一部不規則な所はあるが,1ずつ増加しているし。 -- 2007-11-13 (火) 16:25:46
  • すみません。編集途中のものを掲載してしまい、消す前にコメントをいただいてしまいました。文章、データセットに不備があることをまずお詫び申し上げます。 -- Saito? 2007-11-13 (火) 16:31:39
  • 不備があるなら,書き直すんでしょうか?再投稿ということではなく,前のスレッドにコメントを付ける方がいいとおもうけどなあ。 -- 2007-11-13 (火) 16:34:41
  • 丁寧な説明ありがとうございます。「それが,予測値に加わる量であるなら,どのカテゴリーの影響が一番大きいのか,加わる量が0とは有意に異なるのかというのは大いに意味がある。」→また私は何か誤解していたようです。勉強させてください。 --
  • 「データの一部かも知れないが変なデータだ。」「不備があるなら,書き直すんでしょうか?」→一応書き直しました。これで問題の箇所がわかるでしょうか?また、説明のために勝手に作ったデータのため、かなり無理があるデータになっていますがご容赦ください。 -- Saito? 2007-11-13 (火) 16:51:51
  • かなり無理なデータというか,偏回帰係数のStd.Error が実質的に0に近いというのは,解析結果を評価する意味がないほどだめなデータであるということを意味しているのだが。 -- 2007-11-13 (火) 16:54:19
  • 重回帰分析の結果は
    StandardLength の予測値 = 100 + 0*Feed + 0*AreaN + 50*AreaW + 100*AreaS
    というもの。Feed にかかる係数は,実際は 2.209e-15,AreaNに掛かっている係数0は,ベースラインを示すので本当の0。
    どうしようもない重回帰式でしょう? -- 2007-11-13 (火) 16:59:34
  • だめな予測式ではあるが,ある意味わかりやすいので解説を加えておこう。「0*AreaN + 50*AreaW + 100*AreaS」の部分は,AreaがWなら予測値に50を加え,AreaがSなら100加える。AreaがNというのはベースラインだから,その場合には何も加えない(0を加える)ということ。 -- 2007-11-13 (火) 17:04:12
  • 係数を足して0にするというのは,AreaN, AreaW, AreaS の係数(0+50+100)/3を引く,そうすると,係数はそれぞれ-50, 0, 50 となる。軒並み50ずつ少なくなるので,その分定数項で埋め合わせをしなくてはならない(そうじゃないと,予測値が合わないでしょ)
    StandardLength の予測値バージョンII = 150 + 0*Feed - 50*AreaN + 0*AreaW + 50*AreaS
    そういうこと。-- 2007-11-13 (火) 17:13:48
  • 皆様、わかりやすい解説ありがとうございます。Rの掲示板なのに統計学の質問状態になってしまい本当に申し訳ありません。平均値をそれぞれのデータから引く、というコメントに対してですが、これはFeedが-50になるのですか?すみません、何ぶんわからないことが多いもので、バージョン�の式がよく理解できません…。 -- Saito? 2007-11-13 (火) 17:43:49
  • 式を間違えていた。Feed は無関係。AreaN, AreaW, AreaS の係数からそれぞれ50を引き,定数項に50を加える。 -- 2007-11-13 (火) 17:59:25
  • あ、了解しました。おかげで定数項と偏回帰係数の関係を知ることができました。ありがとうございます。 -- Saito? 2007-11-13 (火) 18:13:41

Rで重回帰

Saito? (2007-11-12 (月) 15:39:20)

初めて投稿させていただきます。

現在、統計ソフトRを使って卒業論文用のデータを解析しているのですが、重回帰をしているときに3つほど問題が出てきてしまいました。もしどなたか解決法をご存知でしたら、ご教授のほどよろしくお願いします。

問題1.カテゴリカル型データの標準化偏回帰係数が計算されない。

私は連続型とカテゴリカル型を同時に重回帰にかけているのですが、連続型のほうは
res <- lm(y~x1+x2+x3)
sdd <- c(0,sd(x1),sd(x2),sd(x3))
stb <- coef(res)*sdd/sd(y)
のような形でできたのですが、カテゴリカル型データはできません。しかし種々の参考書を見ると、カテゴリカル型データでも標準化偏回帰係数が出力されており、途方に暮れております。

問題2.カテゴリカル型データで一つの項目に複数の場合があるとき、うち一つが表示されない。

正確には表示されないことが問題なのではなくて、計算できないことが問題です。
例えば、
Yield=fertileのような関係を調べたいときに、カテゴリカル型データであるfertileの中にfertile1,fertile2,fertile3があったとします。これをそのまま重回帰にかけると、fertile2,fertile3の偏回帰係数やp値は表示されるのですが、fertile1は表示されません。Minitabの場合でしたら普通、fertile1の偏回帰係数はfertile1,fertile2,fertile3を足して、0になるように計算できる(らしい)のですが、Rはどうもそうではないような気がします。おそらく基準点のとり方が違うと思うのですが、どなたかRでの基準点をご存知でしたら教えていただけないでしょうか。

問題3.重回帰を行った際に、result()で出力される結果に含まれるStd.Errorと、sd()で出力される結果が違う。

おそらく前者が傾きに対する標準誤差の計算結果で、後者がデータそのものの標準誤差ではないか、という予測はしているのですが私の調べた限り、その違いを述べている参考書は見当たりませんでした。データがカテゴリカル型であった場合には、sd()では出力されないのに、Std.Errorでは出力されているので、傾きに対する標準誤差なのかな、と。せめて傾きに対する標準誤差の計算方法がわかれば検算できるのですが、それもわからなかったため質問させていただきました。

以上の3つです。もしどなたか解決法をご存知でしたら、ご教授のほどよろしくお願いします。

  • あっちでもこっちでも同じ質問をするのは,マルチポストといって,よいことではありません。しかも,ここは中級者コースの掲示板だし(^_^;) -- 2007-11-12 (月) 16:00:07
  • 簡単でいいですから疑問点が再現できるような例(もしくは組込みデータを使った例)をつけてください。一般論ではピントはずれな解答になる可能性が大。 -- 2007-11-12 (月) 16:04:22
  • result() とは? -- 2007-11-12 (月) 21:26:49
  • summary()のことだと,思いますよ(^_^)
    マルチポストするようなせっかちさんだと思いの外,投稿しても反応のチェックはしていないようで。なんだかなあ。 -- 2007-11-12 (月) 21:28:40
  • 問題3はあなたの理解通りですが、なぜ両者が同じだと思ったのですか(そもそも sd() で何を計算したのかそこがわからぬ)。「参考書は見当たらない」、重回帰の理論をきちんと述べてある本を見て(探し)て見ましたか。例えば、稲垣宣生著「数理統計学改訂版」定理12.5(正規誤差仮定の下での回帰係数の分布)を見てください。 -- 2007-11-12 (月) 21:49:33
  • sd() で,従属変数の標準偏差を調べたのでは?推測に過ぎませんが。実例を挙げてあれば,誤解していることの指摘も簡単なんだけどねえ。それにしても,反応がないので,どうしょうもない。 -- 2007-11-12 (月) 21:52:43
  • 答えるのは簡単なのだが,それだけに,安易に答えるのはやめておく。 -- 2007-11-12 (月) 21:53:53
  • 推測の回答をします。問題1は,そもそも,変数の単位に明確な意味があるケースなのですから,標準偏回帰係数を算出する必要性が薄い気がします。他のソフトウェアでは,おそらく,カテゴリカルデータを0, 1で表現して,連続変量と同様の算出法をしていると思いますので,ご確認して,ご報告頂けると幸いです。問題2は,? contrasts を読むとわかるかと思います。重回帰分析でカテゴリカル変数に関しては,levelsのもっとも小さい水準が0とおかれて計算しています。偏回帰係数を足して0にするよう,contrastsを変更することも可能です。問題3は,すでにご紹介された教科書を参照なさると解決するかと思います。以上ですが,データを再現できるよう,再投稿して頂けると幸いです。 -- aa? 2007-11-13 (火) 02:21:38
  • 推測の必要はないので以下のように答えておきます。ダミー変数に展開して係数を求めるのは,Rでも他のソフトでも同じです。ただ,Rではもともと標準化偏回帰係数を計算しないと言うこともあり,途中で作られるダミー変数をユーザが利用できるようになっていなので,自分で計算するときにはRまかせではなく,自分でダミー変数を作成してその標準偏差を求めないといけないというだけです。ベースラインの設定は任意です。1カテゴリー変数に属するダミー変数単位で平行移動すればよいだけで,その付けを定数項に払わせればよいのです(数量化I,II類ではカテゴリーに該当するデータ数も考慮しますが)。summaryで表示されるStd.Error は残差の標準誤差(回帰の分散分析における,残差の平均平方(不偏分散)の平方根)です。そう言う意味で言えば,回帰分析について書いてある教科書を読めば,どれにも書いてあることでしょう。 -- 2007-11-13 (火) 08:29:05
  • そういえば、以前学生に「なんでRでは準化偏回帰係数が計算されないのか」と聞かれて困ったのを思い出した -- 2007-11-13 (火) 15:25:15

ヒストグラム

星野? (2007-11-01 (木) 14:42:36)

ヒストグラムのソースなのですが、

# 2 群のヒストグラム
hist2 <- function(     x1,        # 第一群のデータ
                       x2,        # 第二群のデータ
                       brks=NULL, # 階級分割点
                       ...)       # barplot に引き渡す任意の引数
{
       if (is.null(brks)) {       # 階級分割点が与えられないときには,適切に設定
               brks <- hist(c(x1, x2), right=FALSE, plot=FALSE)$breaks
       }
       c1 <- hist(x1, breaks=brks, right=FALSE, plot=FALSE)$counts # 度数1
       c2 <- hist(x2, breaks=brks, right=FALSE, plot=FALSE)$counts # 度数2
       barplot(rbind(c1, c2), beside=TRUE, space=c(0, 0.2),        # 棒を並べて描く
               names.arg=brks[-length(c1)],                        # 横軸の目盛りラベル等
               axisnames=TRUE, axis.lty=1, ...)
}

というソースを用いているのですが、このソースだとx1、x2が数値でないといけないというエラーがでてきてしまいます。また、Rに関係する本でヒストグラムについてみても同じように数値の例ばかりです...。これだと、1000個のデータをヒストグラムにする場合に入力が無理ではないでしょうか?データフレームからベクトルにして、ヒストグラムを描くような方法はないのでしょうか?よろしくお願いします。

  • あまり横に長いものを置くと、ブラウザーで眺める際問題が起きますからご注意。できれば日本語注釈を消してください。 -- 2007-11-02 (金) 00:23:54
  • data.frameからvectorで取り出すのは、単にDataFrame?$ColumName?とすればいいのでは? -- okinawa 2007-11-02 (金) 08:43:17
    data(USArrests)
    USArrests
    str(USArrests)
    x1<-USArrests$Murder
    x2<-USArrests$Rape
    str(x1)
    str(x2)
    hist2(x1,x2)
  • なあんだ。そう言う意味か。dataframe$name でもよいけど,質問者さんは dataframe[i] みたいにしているのかなあ? dataframe[i] で取り出すと1列のデータフレームになるけど,dataframe[,i]とするとベクトルになるよ。みんな知っているかと思っていた。
    1列のデータフレームが渡されても良いように,x1, x2 をちゃんと管理すればよいだけでしょう。たとえば x1, x2 を使う前に以下のように,。 -- 2007-11-02 (金) 08:51:53
    if (is.data.frame(x1)) x1 <- as.matrix(x1)
    if (is.data.frame(x2)) x2 <- as.matrix(x2)
  • data.frameって慣れると便利だけど、始めはとっつきにくい記憶があります。Colnameがuniqueだと、
    x <- data.frame(matrix(1:12,ncol=3,dimnames=list(1:4,c("AAA","BBB","CCC"))))
    x$"AAA"
    x$AAA
    x$AA
    x$A
    どれも同じ結果になるので、とっても幸せになれますね -- akira? 2007-11-04 (日) 00:48:04
  • data.frameとかfactorとか通常の言語にない変数の型の使い方を覚えるのがRのコードを読むときの肝ですね。 -- okinawa 2007-11-04 (日) 10:05:52
  • x$A などがX$AAA と同じとは,知らなかった(^_^;)
    x[,"A"]がx["AAA"]でないのも,これを契機として分かったのは収穫だ。 -- 2007-11-04 (日) 22:17:02
    > x <- data.frame(matrix(1:12,ncol=3,dimnames=list(1:4,c("AAA","BBB","CCC"))))
    > x["AAA"]
      AAA
    1   1
    2   2
    3   3
    4   4
    > x[,"A"]
    NULL
  • リスト、データフレームに対する $ 演算子に補完機能があるなど初耳でしたが、?"$" とすると確かに書いてある。昔はこんなことなかった?次々に新しい機能が付け加わるのは良いことだけれど、ついていけないと感じることも。-- Rプログラミングマニュアル著者? 2007-11-05 (月) 21:27:37
    > x[[1]]      # 成分をベクトルとして取り出す「古風な」しかた
    [1] 1 2 3 4
    > x[["AAA"]]
    [1] 1 2 3 4
    > x[["A"]]    # 二重鈎括弧演算子も補完機能を持つことも今回初めて知った 
    [1] 1 2 3 4
  • 以前に,昔のバージョンをそれぞれインストールしておいたので,それを使って試してみました。それより前のはインストールしていないけど,驚くべきことに実に古くから,その機能はありましたようで
    10年まえですなあ。Version 0.49 Beta (April 23, 1997) -- 2007-11-05 (月) 22:22:52
    R : Copyright 1997, Robert Gentleman and Ross Ihaka
    Version 0.49 Beta (April 23, 1997)
    
    R is free software and comes with ABSOLUTELY NO WARRANTY.
    You are welcome to redistribute it under certain conditions.
    Type "license()" for details.
    
    [Previously saved workspace restored]
    
    Error: workspace file corrupted -- no data loaded
    Error in device("X11", as.character(c(display[1], paper)), as.double(c(width,  : unable to start device X11
    > x <- data.frame(matrix(1:12,ncol=3,dimnames=list(1:4,c("AAA","BBB","CCC"))))
    > x$"AAA"
    [1] 1 2 3 4
    > x$AAA
    [1] 1 2 3 4
    > x$AA
    [1] 1 2 3 4
    > x$A
    [1] 1 2 3 4
  • 何気なく使っていたのですが、隠しコマンド(Tips)みたいですね。 -- akira? 2007-11-05 (月) 22:57:57
  • 本当ですか?!「心ここにあらざれば、見れども見えず、聴けども聞こえず、食えどもその味を知らず(孔子)」 -- 2007-11-05 (月) 23:07:11
  • 上の例でいくと, matrix(1:12,nc=3) とかも同じような理屈で動いてます. x[["AA"]] ≒ .subset2(x, "AA") とかすると, ちゃんと警告も出ます. 手入力時の簡便的な利用以外ではあまりお薦めはしません. -- なかま 2007-11-06 (火) 11:06:35
  • 補完機能なんですか。names()で取得した文字列をgrep()してくれるおまけだと思ってました。 -- okinawa 2007-11-06 (火) 11:52:16

gstatパッケージでのクリギングについて

青木.学生? (2007-10-31 (水) 14:17:21)

gstatでクリギングを行いたいのですが、予測グリッドデータの作成方法がわからなくて難航しています。
gstatマニュアルを読んで「RのGRASSパッケージにおいて国際横メルカトール・グリッドに変換した」ということはわかったのですが、具体的な方法がわからずにいます。
どなたかご存知の方がいらっしゃればご教示願えないでしょうか?
ちなみに現在The R BookについているR Ver1.9.0を使っています。

  • まず即刻最新のR(もしかすると使用パッケージも)に更新すべし。予測グリッドデータとは予測値を計算したい位置を指示するグリッド座標データのことですか。それと「メルカトール云々」というのが理解できませんが、平面とはみなせないような広い領域データを解析したいということですか。人にあれこれ憶測させないで、簡単な具体例コードをあげれば解答がえられるかも知れませんよ。 -- 2007-10-31 (水) 20:56:51
  • 間違えて新しいページは作るは,それをそのままほっておくは,投稿様式もいい加減だは(全部,後始末して差し上げておきましたが),期待するのも難しい。
    中級者だと思っておられるので,自分で解決できるでしょう。 -- 2007-10-31 (水) 21:24:35
  • わかりにくい文章で申し訳ありません。自分がわからないのは予測値を計算したい位置を指示するグリッド座標データの作成方法です。 -- 青木.学生? 2007-10-31 (水) 22:00:23
  • クリギングということで、中級のQ&Aにのせればいいとこちらで勝手に判断してしまいました。実際使い方もわからないままいろいろへんなことをしてしまい、真に申し訳ありませんでした。 -- 青木.学生? 2007-10-31 (水) 22:04:19
  • gstat パッケージの predict.gstat の実行例中の次のコードが参考になるのでは。xy の構造を眺めれば、納得がいくでしょう。要するにx,y-座標のリストです。-- 2007-11-02 (金) 00:13:16
    > xy <- expand.grid(1:100, 1:100)  # これが予測位置グリッド座標
    > names(xy) <- c("x", "y")
    > g.dummy <- gstat(formula = z ~ 1, locations = ~x + y, dummy = TRUE, 
                       beta = 0, model = vgm(1, "Exp", 15), nmax = 20)
    > yy <- predict(g.dummy, newdata = xy, nsim = 4)
  • 丁寧な返答ありがとうございます。なんとかやってみます。 -- 青木.学生? 2007-11-02 (金) 16:33:59
  • 自分なりに解釈してやってみました。はじめの>xy<-expand.grid(1:100,1:100)のところで予測位置グリッドを作成しているのだと解釈し、やってみたところ、 "chfactor.c", line 130: singular matrix in function LDLfactor() 以下にエラーpredict.gstat(g, newdata = xy) : LDLfactorという風に出てきてしまいました。データには緯度経度のものを使っているのですが、それがいけないのでしょうか?~読みづらい文章ですみません。 -- 青木.学生? 2007-11-05 (月) 16:07:40
  • トップページからたどれる検索エンジン Rsitesearch でキーワード検索 "LDLfactor" をしてください。 -- 2007-11-05 (月) 21:39:37

ARFIMAXについて

緑茶? (2007-10-16 (火) 15:41:17)

RでARFIMAXも推定することはできるのでしょうか?
出来るのであれば、よかったらやり方を教えてください。

  • ARFIMAXを存じませんが、壊さないでね. -- なかま 2007-10-16 (火) 16:10:35

Rでの GPU 利用

等々力渓谷? (2007-09-24 (月) 04:43:47)

 CPUよりも浮動小数点計算が高速で並列処理に向いていると言われる、最近のGPU(Graphics Processing Unit)ですが*1、Rでもこれを非グラフィックの数値計算に利用するプロジェクトはあるのでしょうか?

power.prop.testの使い方(比較する2群のサンプル数が異なる場合)

堀内? (2007-09-02 (日) 11:46:25)

実験計画を作成するにあたり、検出力80%以上となるようにサンプル数を設定したいと考えておりますが、その際比較する2群のサンプル数を同数ではなく、1:9もしくは2:8程度としたいと考えております。
他のソフト(SAS、Power and precisionなど)ではこのような設定での算定ができるようですが、power.prop.testに関するマニュアル等を見る限りではやり方が見当たりません。
対応方法をご存知の方がいらっしゃればご教示願えないでしょうか?
(特別な引数設定の仕方がある!他の関数でできる!アドインを入れてこのようにコーディングすればできる!など)

  • > 2群のサンプル数を同数ではなく、1:9もしくは2:8程度としたい
    「サンプル数」は「サンプルサイズ」とか「標本サイズ」の誤用です
    なぜそのようなことをしなくてはならないのでしょうか。全体のサンプルサイズが同じなら,同数にしたほうが検出力が高いことはおわかりですよね。わざわざ検出力が低い方法をとるということは,検出力がある水準に達するようにするためには,より多くのサンプルをとらなくてはなりません。それは,時間と費用の無駄をすることになるわけです。 -- 2007-09-02 (日) 12:43:34
  • サンプルサイズがアンバランスなときの検出力の計算方法は,浜島信之 「多変量解析による臨床研究」,名古屋大学出版会にもある -- 2007-09-02 (日) 13:04:27
  • コメントありがとうございます。しかし、私は医療の臨床実験をしているわけではなく、企業のマーケティング部門におります。そして、見込み客のリストについて、ダイレクトメールを送ることは有効かどうか、マーケティングテストを計画しているのです。企業の実態としては、ダイレクトメールを送ることが収益を生むかどうか未確認ではあっても、見込み客にコンタクトしないことは機会損失、という見方が支配的です。従って、せっかくの見込み客リストについて、ダイレクトメールを送らない部分は極力少なくしよう、ということになります。それが、1:9もしくは2:8なのです。臨床実験やその他学術的な実験では、無駄なサンプルになるのでしょうが、実業の世界ではこういうことは往々にしてあります。教えていただいた浜島先生の著書には私が質問させていただいた事項のRでの対応方法が記載されているのでしょうか?いずれにせよ、参照させていただこうと思います。ありがとうございました。 -- 堀内? 2007-09-03 (月) 23:52:24
  • 最近特に思うのですが、実業の世界に統計解析を適応しようとすると、limitation(適応限界)が発生してしまうのですが、限界の基準が曖昧なことがよくあります。(例えば臨床疫学におけるサンプルサイズが少ない時の多重ロジスティック回帰分析の多用についてなど)どこかで、手法ごとの適応限界の項を設けることはできないものでしょうか?(これもRが一般に普及してきている証拠なのですが・・・) -- okinawa 2007-09-04 (火) 06:46:05
  • > ダイレクトメールを送ることが収益を生むかどうか未確認ではあっても、見込み客にコンタクトしないことは機会損失、という見方が支配的です。従って、せっかくの見込み客リストについて、ダイレクトメールを送らない部分は極力少なくしよう
    であれば,標本調査などしなくて,リストにある顧客全員を対象にすればよいわけです。標本調査の意味を考えましょう。全数調査ができるなら,全数調査すればよいわけです。そうすれば,検定だのなんだのというドロドロしたもと無関係でいられます。
    時間と費用を考えて,まずは標本調査を行って(同数サンプリング),データを解析していずれが優れているかが分かったら,その方法に従って全員にダイレクトメールを送れば良いでしょう。 -- 2007-09-04 (火) 08:54:41
  • > 教えていただいた浜島先生の著書には私が質問させていただいた事項のRでの対応方法が記載されているのでしょうか

    R での対処法は記載されて*お*り*ま*せ*ん*。
    単純な式ですから,R の関数なりにするのは訳ないでしょう。
    この式をここへ書くと浜島先生の本が売れなくなってしまうのではないかとおもいますが
    片方のサンプルサイズNc,もう一方のサンプルサイズNt,その比r(=Nc/Nt)
    Pc, Pt は属性を持つものの割合,Qc=1-Pc, Qt=1-Pt
    P =(r Pc + Pt) / (r+1)
    Zα=qnorm(α/2, lower.tail=FALSE)
    Zβ=qnorm(β)
    Nt ={Zα*sqrt((r+1) P Q)+Zβ*sqrt(r Pt Qt +Pc Qc)}^2 /(r(Pt-Pc)^2)
    まちがいなく伝わったかどうか分からないので,浜島先生の本25-26ページを参照してください -- 2007-09-04 (火) 09:59:44
  • > しかし、私は医療の臨床実験をしているわけではなく、企業のマーケティング部門におります
    そうですか,今はじめて知りました。上の注意事項にも書いてあるけど,質問の背景(なぜそう言うことが必要なのかとか,条件などなど)も説明するべきでしょうね。 -- 2007-09-04 (火) 10:09:50
  • > 実業の世界に統計解析を適応しようとする  適用? > 手法ごとの適応限界の項を設ける 言い出しっぺの法則 -- 2007-09-04 (火) 10:14:04
  • 例えば(使用は自己責任で)。なお、Rsitesearch でキーワード "two-sample" で検索したらすぐに Hmisc パッケージがヒットしましたよ。-- &new{2007-09-04 (火) 13:13:09}:
    > library(Hmisc)
    > foo <- function(N) {
               power <- bpower(p1=P1, p2=P2, 
                               n1=N, n2=ceiling(Nratio*N), alpha=Alpha)
               if (power >= Power) { # 要求パワーを越えた時点でストップ
                                    cat(N, ceiling(Nratio*N), power, fill=TRUE); stop()}
             }
    > P1 <- 0.3; P2 <- 0.5; Nratio <- 0.2; Alpha=0.05; Power = 0.8
    > sapply(100:10000, foo)
    266 54 0.8003697
     以下にエラーFUN(100:10000[[167L]], ...) : # これはループを中断したことによる注意で無視可能
    > P1 <- 0.3; P2 <- 0.5; Nratio <- 0.3; Alpha=0.05; Power = 0.8 
    > sapply(100:10000, foo)
    195 59 0.8002799
     以下にエラーFUN(100:10000[[96L]], ...) : 
    > P1 <- 0.3; P2 <- 0.35; Nratio <- 0.3; Alpha=0.05; Power = 0.8
    > sapply(100:10000, foo)
    2954 887 0.8002141
     以下にエラーFUN(100:10000[[2855L]], ...) : 
    > P1 <- 0.3; P2 <- 0.35; Nratio <- 1; Alpha=0.05; Power = 0.8
    > sapply(100:10000, foo)
    1377 1377 0.8002008
     以下にエラーFUN(100:10000[[1278L]], ...) :
  • power.*.test で使われているもう一つの技は uniroot -- 2007-09-04 (火) 19:38:19
    power.prop.test2 <- function( p1=NULL, p2=NULL, n1=NULL, r=NULL, sig.level=0.05, power=NULL)
    {
            if (sum(sapply(list(p1, p2, n1, r, sig.level, power), is.null)) != 1) {
                    stop("p1, p2, n1, r, sig.level, power のどれか一つだけを NULL とする")
            }
            power.function <- quote(bpower(p1=p1, p2=p2, n1=n1, n2=ceiling(n1*r), alpha=sig.level))
            if (is.null(power)) {
                    power <- eval(power.function)
            }
            else if (is.null(n1)) {
                    n1 <- uniroot(function(n1) eval(power.function)-power, c(1, 1e7))$root
            }
            else if (is.null(p1)) {
                    p1 <- uniroot(function(p1) eval(power.function)-power, c(1e-5, 1))$root
            }
            else if (is.null(p2)) {
                    p1 <- uniroot(function(p2) eval(power.function)-power, c(1e-5, 1))$root
            }
            else if (is.null(r)) {
                    r <- uniroot(function(r) eval(power.function)-power, c(1e-5, 1000))$root
            }
            else if (is.null(sig.level)) {
                    sig.level <- uniroot(function(sig.level) eval(power.function)-power, c(1e-5, 0.99999))$root
            }
            else {
                    stop("internal error")
            }
            METHOD <- "Power calculation of the tow-sample proportion test."
            structure(list(p1=p1, p2=p2, n1=ceiling(n1), n2=ceiling(n1*r), r=r, 
                           sig.level=sig.level,power=power, alternative="two.sided",
                           method=METHOD), class="power.htest")
    }
    > power.prop.test2(p1=P1, p2=P2, n1=NULL, r=0.2, power=0.8)
    
         Power calculation of the tow-sample proportion test. 
    
                 p1 = 0.3
                 p2 = 0.5
                 n1 = 266
                 n2 = 54
                  r = 0.2
          sig.level = 0.05
              power = 0.8
        alternative = two.sided
    
    > power.prop.test2(p1=P1, p2=P2, n1=NULL, r=1, power=0.8)
    
         Power calculation of the tow-sample proportion test. 
    
                 p1 = 0.3
                 p2 = 0.5
                 n1 = 93
                 n2 = 93
                  r = 1
          sig.level = 0.05
              power = 0.8
        alternative = two.sided
    
    > power.prop.test2(p1=P1, p2=P2, n1=266, r=NULL, power=0.8)
    
         Power calculation of the tow-sample proportion test. 
    
                 p1 = 0.3
                 p2 = 0.5
                 n1 = 266
                 n2 = 54
                  r = 0.1992972
          sig.level = 0.05
              power = 0.8
        alternative = two.sided
    
    > power.prop.test2(p1=P1, p2=P2, n1=266, r=0.2, power=NULL)
    
         Power calculation of the tow-sample proportion test. 
    
                 p1 = 0.3
                 p2 = 0.5
                 n1 = 266
                 n2 = 54
                  r = 0.2
          sig.level = 0.05
              power = 0.8003697
        alternative = two.sided
  • 標本数が異なる場合の比率の同一性にどういう検定を使うのが普通なのか知りませんが、二つの比率の点推定値の差を検定統計量に使い、その正規近似を用いて棄却域を作るとします。とすれば、あれこれ探し回るより、モンテカルロ法を使うのが手っ取り早いのでは(理論的結果も結構怪しい近似を使っている可能性も高いし)。特に人命にかかわる結果を云々するのでなければ(笑)。要するに検定関数があればモンテカルロ法で検出力の計算はできるわけです。(最初の例に間違いがあったので訂正。失礼) -- 2007-09-04 (火) 21:00:11
    ## 二項分布 B(n,p),B(m,p) に従う独立標本 N 個を有意水準 1-alpha で
    ## 両側検定したとき棄却される割合(標本検出力)を計算する関数
    > foo <- function(N,n,p,m,q, alpha) {
        X <- rbinom(N,n,p)                 # B(n.p) に従う標本N個
        Y <- rbinom(N,m,q)                 # B(m,q) に従う標本N個
        phat <- (X+Y)/(n+m)                # 帰無仮説p=qの下での共通比率の推定値 
        S <- sqrt((1/n+1/m)*phat*(1-phat)) # 帰無仮説の下での(X/n-Y/m)の標準偏差推定値   
        z <- qnorm(1-alpha/2)              # 両側検定棄却限界値
        mean(abs(X/n - Y/m)/S > z)         # N 回の検定で棄却される標本比率
      } 
    > bar <- function(n) { # m=0.2*n のケース
        x <- foo(2e6, n, p, ceiling(0.2*n), q, alpha)
        cat(k, ceiling(0.2*n), x, fill=TRUE)
      }
    # 実行例
    > p=0.3; q=0.5; alpha=0.05; beta=0.8
    > set.seed(1); sapply(260:300, bar)
    260 52 0.7882775
    261 53 0.793533
    262 53 0.795987
    263 53 0.791743
    264 53 0.7943355
    265 53 0.797369
    266 54 0.802263  # 標本検出力が初めて80%を越える標本数(bpower関数の場合,266 54 0.8003697,とほぼ一致)
    267 54 0.799412  
    268 54 0.801248
    269 54 0.8035085
    .................
  • 適応ー>適用ですね。間違えました。 -- okinawa 2007-09-04 (火) 21:26:19
  • 早速にご教示いただきありがとうございました。 -- 堀内? 2007-09-04 (火) 23:51:12
  • モンテカルロ法を使用した例に間違いがありましたから訂正しました。今度は bpower 関数を用いた例にほぼ一致しました。 -- 2007-09-05 (水) 18:11:34

mgcvライブラリのgam関数で平滑化スプラインが扱えるか?

Blueblink? (2007-08-22 (水) 01:18:17)

スプラインを用いたセミパラメトリック回帰をRで行いたいと考えております。まず,mgcvライブラリのgam関数を用いることを試みました。

こちらこちらの文献では,gam関数のsオブジェクトを,平滑化スプラインを表すために用いています。例えば次のスクリプトで,変量Ozoneを3つの平滑化スプライン関数の和で説明する,加法モデルを求めることができるものとしています。

>library(mgcv); data(airquality)
>airq.gam<-gam(Ozone~s(Solar.R)+s(Wind)+s(Temp),data=airquality)
>summary(airq.gam)

ところが,help(gam)で見られるヘルプによると,mgcvのgamにおけるノンパラメトリック項(smooth term)には,罰則付きの回帰スプライン(Penalized Regression Spline)もしくは自由度を固定した回帰スプラインを用いると書いてあります。私の理解では,平滑化スプラインは共変量の数と同数の節点を用いますが,罰則付き回帰スプラインは計算負荷低減のため節点の数を抑えるもので,両者は異なります。

私は罰則付きの回帰スプラインの理論が良くわからないので,できればスプラインとして平滑化スプラインを用いたいのですが,本当にmgcvライブラリのgam関数で平滑化スプラインを用いることができるのでしょうか?

ご存知の方がいらっしゃいましたら,ご教授頂ければ幸いです。
どうぞよろしくお願いいたします。

  • 答えになっているかどうかわかりませんが,こことか参考になりますでしょうか。
    http://www.jstage.jst.go.jp/article,as.double(a),length(a),sf=double(length(a))) の実行結果は↑x2の問題もわかるので欲しいですね.($sfは余計) -- なかま /jbhmk/34/1/111/_pdf/-char/ja/ -- surg? 20new{2007-09-04 (火) 10:14:04
  • 例えば(使用は自己責任で)。なお、Rsitesearch でキーワード 07-08-22 (水) 14:32:26};
  • ご回答を頂きありがとうございます。この論文の123ページ,3.3節に,mgcvライブラリのgamコマンドを用いたセミパラメトリック回帰のRスクリプトが掲載されています。論文では,「平滑化スプラインを用い」と書いてあるのですが,mgcvライブラリのヘルプでは,回帰式に組み込めるのはPenalized Regression Splineとされています。そこで,本当に平滑化スプラインを組み込めるのか,ということが私の疑問です。込み入った質問で恐縮です。
  • ?gam を欲読めば欲しい答えは書いてあるように思うのですが。「罰則付き」とは ovefitting を抑えるために用いられるスプライン関数の「滑らかさ」をコントロールするための付加項で、変量の数を調整するものでは無いように読めますが。(いずれにしても勝手に想像していないで、?gam にいくつも参照してある文献のチェックをお薦めします。) -- 2007-08-22 (水) 20:02:30
  • ご回答いただきありがとうございます。ご指摘の通り,罰則とは滑らかさをコントロールするための付加項です。変量の数を調整するという概念は私の頭にはありませんでした。調整するのは,罰則付き回帰スプラインの場合,平滑化パラメータおよび,節点の数と位置だと思います。

大きな行列の特異値分解・固有値分解

有吉? (2007-07-11 (水) 17:15:20)

1万×3千〜4千ぐらいのサイズの行列(各要素は非負の実数)の特異値分解をしたいと思っています。
WindowsXPでR2.4を使って、
options("object.size"=160e+006)
memory.limit( size = 3072)
と設定してsvd()したのですが、メモリが足りなくなってできませんでした。
それで、転置行列とかけ合わせて3千〜4千×3千〜4千の対称行列にして固有値分解することにしたら、eigen()はできました。でも、そこでメモリ(ヒープ?)が足りなくなって、その後は行列演算ができなくなりました。
そこでいったんquit()してRを起動しなおして、行列演算を1つして、quit()して、起動しなおして、...の繰り返しになって作業が進みません。
上記のようなサイズの行列の特異値分解や固有値分解をして、さらに行列演算を続けていくにはどうしたらいいか教えていただけないでしょうか?
# 64bitOSで、64bitモードでmakeしたRを使えば、それで解決?

  • やったことないけど,ぎゃべーじこれくしょんを二回やればよいのでは?(一回じゃだめだと読んだ記憶)
    知っているといつか役に立つ(?)関数達の (94) だった。 -- 2007-07-11 (水) 17:42:09
  • 10000x4000 の実数行列のサイズは約305Mbです。いくらメモリを積んでいますか。作業用のメモリを除いても、こんな行列をいくつも作ればすぐパンクしますね。 -- 2007-07-11 (水) 20:00:38
  • CRAN にある R.huge というパッケージを使うとデータの本体を外部記憶装置において作業できるようですから、試してみては。私は使ったことがありませんが。 -- 2007-07-11 (水) 20:07:08
  • メモリを4GBつんだ64bitのLinuxでやったら特に工夫をしなくてもできました。 -- 有吉? 2008-12-23 (火) 20:22:49

qcc で X-Bar 管理図を作成するためのサブグルーピング

岩田? (2007-07-08 (日) 18:33:35)

はじめまして。最近 R を使い始めた、岩田と申します。RjpWiki の皆様の努力のおかげで、R に関する情報が手軽に手にはいることを、感謝しています。

さて、qcc を使って X-Bar 管理図を作成したいと思っています。元となるデータは Excel で一つの列に納めて作成し、csv として書き出したものを、read.csv で R に読み込ませました。

X-Bar 管理図を作成するには、このデータをサブグループに分けなくてはなりませんが、qcc にそのような機能はありますか? それとも、事前に複数列にまたがるテーブルに整形しなくてはならなかったのですか? たとえばサブグループサイズが5の場合、R または Excel 上で簡単に複数列にまたがるテーブルに整形しなおす方法はありますか? 皆様のお知恵を拝借できればと思います。

  • 恐らく R 本来の機能を使い簡単にできると思いますが、したいことを具体的に示す簡単な例(変形前と変形後)をあげないとなんとも答えようがありませんね。 -- 2007-07-08 (日) 20:21:28
  • お返事ありがとうございます。 現在、Excel のファイルの列 B に、以下のような、ある連続データが入っています。
    17
    5
    8
    26
    15
    26
    15
    26
    5
    0
    26
    ...
    これを、5つごとのサブグループに区切って、X-Bar 管理図を作るのがねらいです。グループの区切り方は、具体的には、
    17  サブグループ1
    5  サブグループ1
    8  サブグループ1
    26  サブグループ1
    15  サブグループ1
    26  サブグループ2
    15   サブグループ2
    26   サブグループ2
    5   サブグループ2
    0   サブグループ2
    26   サブグループ3
    ...
    とする予定です。 qcc に自動で区切る機能があれば、それが一番手っ取り早いと思いますが、もしない場合は、データを整形して R または qcc に渡してあげなくてはならないだろうと予想しています。事前にデータを整形する場合のテーブルは、
    サブグループ1  17, 5, 8, 26, 15
    サブグループ2  26, 15, 26, 5, 0
    サブグループ3  26, ...
    としなくてはならないようです。 以上で、私がやりたいことが伝わりましたでしょうか? 引き続きアドバイスをよろしくお願いいたします。 -- 岩田? 2007-07-08 (日) 20:31:50
  • 単にベクトルデータを5個づつ区切るだけでよいなら、そして結果が行列、データフレームで良ければ以下のようにすれば良いのでは。 -- 2007-07-08 (日) 21:50:50
    > x
     [1]  1 14 19  5  8  4  8 10  1  4 16  7  3 18  8 20  4  1  8 12  7  8  3 12 10
    [26] 19  5 15  8  9
    > xx <- matrix(x, 6, 5, byrow=TRUE)
    > xx
         [,1] [,2] [,3] [,4] [,5]
    [1,]    1   14   19    5    8
    [2,]    4    8   10    1    4
    [3,]   16    7    3   18    8
    [4,]   20    4    1    8   12
    [5,]    7    8    3   12   10
    [6,]   19    5   15    8    9
    > as.data.frame(xx)
      V1 V2 V3 V4 V5
    1  1 14 19  5  8
    2  4  8 10  1  4
    3 16  7  3 18  8
    4 20  4  1  8 12
    5  7  8  3 12 10
    6 19  5 15  8  9
  • 元となるデータが1列でなければならないのは何故なのでしょうか? -- okinawa 2007-07-09 (月) 16:33:36
  • qcc の example を見れば,qcc.groups を使うんじゃないの?測定値が x というベクトルに入っていて,5個ずつをサブグループにするなら,y <- rep(1:(length(x)/5), each=5) として,z <- qcc.groupus(x, y) とする。この z を qcc(z, type="xbar") みたいに使うんでしょうが?
    もっとも,qcc.groups が作るのは matrix に過ぎないので,上の方のコメントにあるように,直接 matrix() を使ってもよいが。  -- 2007-07-09 (月) 16:47:03
  • サブグループの要素数が違う可能性があるのなら、
    x <- rnorm(1:20)
    y <- c(rep(1, 4), rep(2, 6), rep(3, 10))
    z <- data.frame("dat"=x, "sub.g"=as.factor(y))
    とか -- 2007-07-09 (月) 17:10:02
  • 蛇足ですが,c(rep(1, 4), rep(2, 6), rep(3, 10)) は rep(1:3, c(4,6,10)) がスマート
    また,データフレーム z を作るのではなく,z <- qcc.groups(x, y) とする。 -- 2007-07-09 (月) 17:21:17

コンター図作成時のエラーについて

Ovation? (2007-06-12 (火) 11:11:51)

Rでwavelet変換をやっていますが、コンター図を描こうとしたら、

> filled.contour(Time,Frequency,t(z),nlevel=50,color.palette=topo.colors)
以下にエラーdiff(x) : 既定引数の再帰的な参照です

というエラーが出ました。
原因が分かる方、ご教授いただけると幸いです。

  • この前にあなたがどのようなことをしたのか,TIme, Frequency, t(z) 等に何がどのように入っているのかわからないかぎり,真の原因などわからないとは思いませんか?
    R は中級者かもしれないが,質問の仕方は初級者ですね。 -- 2007-06-12 (火) 11:34:15

NAN値を含むデータをcプログラムに渡すには

kd? (2007-06-12 (火) 10:17:56)

NAN値もcプログラムに渡す方法はあるでしょうか?
試しに下記のcプログラムを書いて実験を行いますと,.C() のところでエラーを出すようで,
NAN値を含むデータはcプログラムに渡らないようです.

#include <R.h>
void countnan(double *x, int *n, int *count)
 {
   int i;
   for (i=0,*count=0;i<*n;i++) 
     if (ISNAN(x[i])) (*count)++;
 }


> countnan <- function(x){ 
 n=length(x);
 .C("countnan",arg1=as.double(x),
  arg2=numeric(n),arg3=numeric(1))$arg3
}
> x<-c(1, NA , 3 , 4)
> countnan(x)
 以下にエラーcountnan(x) :  外部関数の呼び出し(引数 1) 中に NA/NaN/Inf があります
  • ?.C をしましょうね. ちゃんと整形して, 出来た部分も書こうね. -- 2007-06-12 (火) 10:32:18
  • どうもありがとうございます.やっとなんとか出来るようになりました:
    > countnan <- function(x){ 
     .C("countnan",arg1=as.double(x),
      arg2=length(x),arg3=integer(1),NAOK=TRUE)$arg3 }
    > countnan(c(1,2,NA,4))
    [1] 1
    cソースは
    #include <R.h>
    void countnan(double *x, int *n, int *count)
    {
     int i;
     for (i=0,*count=0;i<*n;i++) 
     if (ISNAN(x[i])) (*count)++;
     (*count)--;
     if (ISNAN(R_NaReal)) (*count)++;
    }

R と Windows CSS

パックマン? (2007-06-07 (木) 16:28:32)

R で Windows CSSを利用している例はあるのでしょうか?

  • 申し訳ございません。Windows CCS[[Windows Compute Cluster Server : https://www.microsoft.com/japan/windowsserver2003/ccs/default.mspx]]の略です。 -- パックマン? 2007-06-07 (木) 17:04:20
  • CSS, CSS と,,,Cascading Style Sheet ? Client Server System ? Content Scrambling System ? いずれにしても,Contact Start Stop ではない -- 2007-06-07 (木) 16:58:50

dendrogramの解析

とも? (2007-06-06 (水) 16:49:44)

クラスタリング結果のデンドログラムを解析して、ノードごとの高さやリーフの情報を得る関数を書いています。
ノードやリーフの情報をベクトルとして取得する方法を教えてください。例えば、

("leaf","leaf","node","node")

のような形で返してほしいです。
dendrapplyという関数を参考にして書いたコードを示しました。
ノードやリーフの情報を再帰的に取得して表示することはできます。
dendrogramでRjpWikiやGoogleを検索してみましたが分かりませんでした。
引数の参照渡しの方法が分かるとできると思います。
dendrapplyはもとのデンドログラムのグラフ構造と同じ構造を返してくるので使えませんでした。

DNapplyTest <- function(d) {
	if (!is.leaf(d)) {
		for (j in seq_along(d)) Recall(d[[j]])
		cat("node:",attr(d,"height"),"?n")
	}else{
		cat("leaf:",labels(d),"?n")
	}
}

> DNapplyTest(as.dendrogram(hclust(dist(USArrests))))
leaf:Florida
leaf:North Carolina
node:38.52791
...
node:87.32634
node:168.6114
node:293.6228
  • デンドログラムを描くための全ての情報は,hclust が返します。? hclust するべし -- 2007-06-06 (水) 17:50:53
  • ご回答ありがとうございます。hclustが返したオブジェクトをas.dendrogramでデンドログラムの情報として取り出すところまでは分かっているのです。問題はその後で、dendrogramのリストの構造から、すべてのノードの情報を取り出して並べる方法を知りたいのです。 -- とも? 2007-06-06 (水) 22:36:57
  • 問題を言い換えます。すべてのノードを再帰的に訪れる関数を書いたのですが、どうやってすべてのノードの情報を、ある変数に格納したらよいのだろうか? -- とも? 2007-06-06 (水) 22:50:52
  • その情報がどのようになっているかは,その情報をどう利用したかのプログラムを読めば分かるのでは?あなたが望むような形にするのもできると思いますが,あなたの仕様がよく分からない。("leaf","leaf","node","node") って,どういうもの?実際のデンドログラムと hclust オブジェクト(as.dendorogram を通したオブジェクトでも良いが)と比べてみれば。 -- 2007-06-06 (水) 22:58:51
  • dendrogram についてはよくわからないのですが、例えば次のような例が参考になる?dendrogram は本来木構造ですから、無理に線形化すると混乱しますよね。 -- 2007-06-06 (水) 23:19:40
    ## 文字列が長すぎるので適宜改行しています
    > dhc <- as.dendrogram(hclust(dist(USArrests)))
    > x <- capture.output(dendrapply(dhc, function(n) {cat(labels(n),"?n");  cat(attr(n,"height"),"?n")}))
    > xx <- x[1:198] # 手作業で末尾につく無意味な部分を削除
    > xx[5:20]
     [5] "Florida North Carolina "
     [6] "38.52791 "
     [7] "Florida "
     [8] "0 "
     [9] "North Carolina "
    [10] "0 "
    [11] "Delaware Alabama Louisiana Alaska Mississippi South Carolina Maryland
    Arizona New Mexico California  Illinois New York Michigan Nevada "
    [12] "64.99362 "
    [13] "Delaware Alabama Louisiana Alaska Mississippi South Carolina "
    [14] "48.72515 "  
  • (leaf, leaf, node, node) というのが,デンドログラムの2つのクラスターを結ぶ横向きのデンドログラムにおける「コの字」状の3直線を描くための4点のx,y座標を意味しているなら,件のプログラムの lines が使っている4点の座標でしょう。8列をもつ行列にでも納めればいかが? -- 2007-06-06 (水) 23:19:12
    lines(c(apx[c1], hc$height[i], hc$height[i], apx[c2]),
          c(apy[c1], apy[c1], apy[c2], apy[c2]))
  • [2] "293.6228 " の次などに,異常な文字があって(単にたくさんの空白だと思うんだが),変なことになっているようだ。編集でもうまく直せん。
    まだ,直っていないよ。後ろにまだ空白が一杯付いている行が何行もある。
    なんで,ご本人が直してくれないのかなあ。ぶつぶつ。直したよ。 -- 2007-06-06 (水) 23:46:34
  • このデータをどう読めばデンドログラムが再現できるのかよくわからない。 -- 2007-06-06 (水) 23:47:46
  • 分かりにくくてすみません。hc$mergeを使ってデンドログラムを構成できるので、そちらからやってみます。 -- とも? 2007-06-07 (木) 10:04:26
  • 自分で関数を書いてみました。デンドログラム解析 -- とも? 2007-06-08 (金) 12:30:11
  • 質問が変だったなと反省。再帰的に書く方法はやめました。 -- とも? 2007-06-08 (金) 12:42:18
  • 再帰的にも勿論かける。ただしこれはちょっとにせもの。 -- takahashi? 2007-06-08 (金) 13:46:14
    f<-function(X){
      ret<-NULL
      f<-function(x){
        if(is.leaf(x)){
          attr(x,"label")
        }else{
          r<-c(sapply(x,f),recursive=T)
          ret<<-rbind(ret,list(leafs=r,size=attr(x,"members"),height=attr(x,"height")))
          r
        }
      }
      f(X)
      ret
    }
    r<-f(as.dendrogram(hclust(dist(USArrests), "ave")))
  • ありがとうございます。短いコードでいい感じです。出てくるノードの順番が再帰的ですね。どこが「にせもの」なのだろう? -- とも? 2007-06-08 (金) 14:45:00
  • そう言う結果が必要だったんですね。私も書いてみました。 -- 2007-06-08 (金) 17:10:05
    関数定義
    dend2nodelist <- function(hc) {
    	GetElement <- function(i, j) {
    		if (i < 0) {
    			if (j < 0) return(c(hc$labels[-i], hc$labels[-j]))
    			else return(c(hc$labels[-i], GetElement(hc$merge[j,1], hc$merge[j,2])))
    		} else {
    			if (j < 0) return(c(GetElement(hc$merge[i,1], hc$merge[i,2]), hc$labels[-j]))
    			else return(c(GetElement(hc$merge[i,1], hc$merge[i,2]), 
                                         GetElement(hc$merge[j,1], hc$merge[j,2])))
    		}
    	}
    	n <- length(hc$height)
    	leafs <- NULL
    	size <- integer(n)
    	for (i in 1:n) {
    		labels <- GetElement(hc$merge[i,1], hc$merge[i,2])
    		size[i] <- length(labels)
    		leafs[i] <- list(labels)
    	}
    	return(cbind(leafs=leafs, size=size, height=hc$height))
    }
    実行例
    > hc <- hclust(dist(USArrests[1:10,]))
    > result <- dend2nodelist(hc)
    > result
          leafs        size height  
     [1,] Character,2  2    16.80625
     [2,] Character,2  2    23.19418
     [3,] Character,2  2    25.09303
     [4,] Character,3  3    36.73486
     [5,] Character,3  3    45.18296
     [6,] Character,3  3    60.98073
     [7,] Character,6  6    77.19741
     [8,] Character,9  9    148.7357
     [9,] Character,10 10   226.303 
    > result[1,]
    $leafs
    [1] "Alabama"  "Delaware"
    
    $size
    [1] 2
    
    $height
    [1] 16.80625
    
    > result[5,]
    $leafs
    [1] "Alaska"   "Alabama"  "Delaware"
    
    $size
    [1] 3
    
    $height
    [1] 45.18296
    
    > result[9,]
    $leafs
     [1] "Connecticut" "Florida"     "Arizona"     "California" 
     [5] "Arkansas"    "Colorado"    "Georgia"     "Alaska"     
     [9] "Alabama"     "Delaware"   
    
    $size
    [1] 10
    
    $height
    [1] 226.303
  • 同じだけど,ここまでやれば,解読不能? -- 2007-06-08 (金) 22:41:06
    dend2nodelist <- function(hc) {
     	temp <- function(hc, j) GetElement(hc$merge[j,1], hc$merge[j,2])
     	temp2 <- function(hc, j) if (j < 0) hc$labels[-j] else temp(hc, j)
     	GetElement <- function(i, j) if (i < 0) c(hc$labels[-i], temp2(hc, j)) 
                                        else c(temp(hc,i), temp2(hc, j))
     	leafs <- size <- integer(n <- length(hc$height))
     	for (i in 1:n) {size[i] <- length(labels <- temp(hc, i)); leafs[i] <- list(labels) }
     	return(cbind(leafs=leafs, size=size, height=hc$height))
    }
  • 勝手ながらデンドログラム解析に転記させていただきました。さらに発展していくようでしたらそちらにてお願いいたします。ありがとうございました。 -- とも? 2007-06-11 (月) 16:15:54

wavelets パッケージ(不等間隔 x_i vs. y_i のデータ系列)

kd? (2007-06-02 (土) 21:07:02)

wavelets パッケージを調べてみたのですが,「不等間隔な x_i とそれに対する y_i 」というデータ系列を与えて処理できるものが見当たらないようです. このようなパッケージはどこかにあるでしょうか?

glmmML 実行時の警告 (info = ) について

たく? (2007-04-25 (水) 11:33:54)

glmmML でモデルを作成した際、info = といった警告が出ることがあります。
モデルは作成されている用なのですが、このモデルは採用してもいいのでしょうか?
また、この際の AIC なども信頼できるのでしょうか?
どなたかご教授いただけますでしょうか?

  • 状況を再現できる最小限のデータなりを付けて質問すべきですね。 -- 2007-04-25 (水) 12:29:52
  • すみません、説明が少したりませんでした。関数のバグとか稀な結果でとかではなく、info=の警告が出た際には、結果をどのように解釈すればいいのかをご教授いただきたく。
    help(glmmML) には、以下のような文書が出るのですが
       info: From hessian inversion. Should be 0. If not, no variances
             could be estimated. You could try fixing sigma at the
             estimated value and rerun.
    作成されたモデルやAICの信頼性をどのように解釈すればいいのかがわかりません。
    ご存知でしたら、よろしくお願いいたします。 -- たく? 2007-04-25 (水) 13:18:21
  • ですから,それが出るようなデータを付ければ? -- 2007-04-25 (水) 15:14:17
  • 0 でなきゃならんのに,そうではなかったと。sigma を調整してやりなおせと。そう言っているんでしょう? -- 2007-04-25 (水) 15:25:45
  • ご返信ありがとうございます。
    variance を推定したいなら、sigma をいじってやり直せ、と読めるのですが。
    実際、モデルも構築されますし、AICなども算出されます(要するに、エラーではなく警告)。これらの値に意味があるのかについて、知りたく思っております。
    info= の警告が再現できるデータを、というお話が出てますので、一応以下に付けておきます。
    > library(glmmML)
    > data(anorexia, package="MASS")
    > id <- rep(1:nrow(anorexia))
    > class <- c(rep(1,10), rep(0,62))
    > glmmML(class ~ Prewt, data=anorexia, cluster=id, family=binomial)
    info = 3
    
    Call:  glmmML(formula = class ~ Prewt, family = binomial, data = anorexia, cluster = id) 
    
    
                      coef se(coef)  z Pr(>|z|)
    (Intercept) -12.124711       NA NA       NA
    Prewt        -0.001919       NA NA       NA
    
    Standard deviation in mixing distribution:  48.71 
    Std. Error:                                 NA 
    
    Residual deviance: 31.01 on 69 degrees of freedom       AIC: 37.01 
    Warning message:
    Hessian non-positive definite. No variance! 
    > 
    よろしくお願いいたします。-- たく? 2007-04-25 (水) 16:06:18
  • まあ,たとえば,以下のようにして「やり直せば」エラーはなくなりますが。 -- 2007-04-25 (水) 16:27:10
    > glmmML(class ~ Prewt, data=anorexia, cluster=id, family=binomial, 
           fix.sigma=TRUE)
    
    Call:  glmmML(formula = class ~ Prewt, family = binomial, data = anorexia,      
          cluster = id, fix.sigma = TRUE) 
    
                     coef se(coef)        z Pr(>|z|)
    (Intercept) -1.772713  5.59883 -0.31662    0.752
    Prewt       -0.001720  0.06783 -0.02536    0.980 
    
    Standard deviation in mixing distribution:  0 
    Std. Error:                                 0 
    
    Residual deviance: 57.99 on 69 degrees of freedom 	AIC: 61.99 
    あるいは
    > glmmML(class ~ Prewt, data=anorexia, cluster=id, family=binomial, 
          start.sigma=1e-4)
    
    Call:  glmmML(formula = class ~ Prewt, family = binomial, data = anorexia,      
          cluster = id, start.sigma = 1e-04) 
    
                     coef se(coef)        z Pr(>|z|)
    (Intercept) -1.686092  5.46507 -0.30852    0.758
    Prewt       -0.001680  0.06621 -0.02538    0.980
    
    Standard deviation in mixing distribution:  0.0002467 
    Std. Error:                                 406.6 
    
    Residual deviance: 58.02 on 69 degrees of freedom 	AIC: 64.02 
    結局の所,
    The optimization may not converge with the default value of start.sigma. In 
    that case, try different start values for sigma. If still no convergence, 
    consider the possibility to fix the value of sigma at several values and study 
    the profile likelihood.
  • 丁寧なご返信、ありがとうございました。
    結局、info= の警告が出ているときには、係数もAICも信頼性がないことがわかりました。
    start.sigma をいろいろ変えてみるといいのはわかりましたが、どういった方針で変えていくのがいいか、ご存知でしたら教えていただけないでしょうか。
    方針は特になく、とにかくいろいろ試すのがいいのですかね。
    あるいは、glmmML でのモデル作成は適切でないケース、ととらえてあきらめるのが正しいのでしょうか? -- たく? 2007-04-26 (木) 10:15:53
  • 色々試すしかないでしょう。なお,例題としてあげられたのは,無理矢理作られた例題で,モデルがあてはまらない(あてはまっても非常にあてはまりが悪い)のは当たり前。example(glmmML) もいい加減に作ったデータであるが,それでもちゃんとあてはまる。要するに,普通の,分析するに足りるデータなら,デフォルトの初期値でもたいていあてはめができるだろうということ。少なくとも,初期値を変えて試行すればあてはめはできるだろうということ。なかなかあてはめができないというのは,データ自身に問題があるということ。(例として挙げられたデータだって,データの意味を考えれば,class <-rep(0:1, c(26, 46)) とでもすれば,他はそのままで,デフォルト値のままでちゃんとあてはめできます) -- 2007-04-26 (木) 10:48:50

重回帰分析について

たつや? (2007-01-25 (木) 16:34:54)

重回帰分析して出た結果が英語で意味が読み取れませんでした。簡単な例を挙げて重回帰分析を行いましたので解説をお願いします。
質問はまず、この2つの違いについて。

F=lm(Z~X)
G=lm(Z~X-1)

つぎにsummaryで表示された内容がわかりません。できれば詳しい説明をお願いします。 自分で行う回帰分析、もしくはExcelの回帰分析は多少理解しているつもりなので、そっちと関連させて解説してもらえれば幸いです。

Z=c(1,2,3,4,5,6,7,8,9,10)
X=c(1,3,4,2,5,6,7,8,10,10)
F=lm(Z~X)
G=lm(Z~X-1)
summary(F)
Call:
lm(formula = Z ~ X)
Residuals:
Min     1Q       Median  3Q      Max
1.11283 -0.47400 0.09181 0.27600 1.80531
Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.35841  0.59297    0.604   0.562
          X 0.91814  0.09329    9.842   9.56e-06 ***
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.887 on 8 degrees of freedom
Multiple R-Squared: 0.9237, Adjusted R-squared: 0.9142
F-statistic: 96.86 on 1 and 8 DF, p-value: 9.561e-06
summary(G)
Call:
lm(formula = Z ~ X - 1)
Residuals:
Min    1Q      Median 3Q     Max
0.9035 -0.5006 0.1770 0.2494 2.0644
Coefficients:
  Estimate Std. Error t value Pr(>|t|)
X 0.96782  0.04255    22.75   2.91e-09 ***
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.8552 on 9 degrees of freedom
Multiple R-Squared: 0.9829, Adjusted R-squared: 0.981
F-statistic: 517.5 on 1 and 9 DF, p-value: 2.909e-09
  • Excelで実行して,内容を比較してみたら? -- 2007-01-25 (木) 16:48:51
  • 何がわからないのか?というか何が知りたいのか? -- 2007-01-25 (木) 17:34:36
  • 何でも聞けばよいというものではない。 -- 2007-01-25 (木) 17:35:28
  • > 結果が英語で意味が読み取れません --- なのでしょうね。 -- 2007-01-25 (木) 17:38:19
  • 「重回帰分析」でキーワード検索、既に幾つかあるR本を見る、それでもわからなければ、改めて聞く。 -- 2007-01-25 (木) 17:42:33
  • Estimate Std. Error t value Pr(>|t|) の意味を教えてほしいです。 -- 2007-01-25 (木) 18:10:30
  • あと、F=lm(Z~X) とG=lm(Z~X-1)の違いが意味がわからないからできない…。 -- 2007-01-25 (木) 18:12:25
  • すみません。お願いします。 -- 2007-01-25 (木) 18:13:38
  • いっこめは係数の推定値、標準誤差、t統計量、p値。二個目は切片項を含むか含まないか。excelの結果と比べれば判ると思うんだけど。 -- 2007-01-25 (木) 18:19:16
  • 1つ目の方は比較すればわかりました。すみません。 -- たつや? 2007-01-25 (木) 18:29:11
  • 返答ありがとうございました。だいたい理解できました。あとは自分で考えます。 -- たつや? 2007-01-25 (木) 18:32:45

回帰係数の当てはめ

佐藤? (2007-01-15 (月) 16:57:21)

> attach(learning)
> learning.glm<-glm(def~lastprice+volume+size+rtn+next1rtn+lsize+epr1
                    +greps1+dy+bpr+wcr+rrl+rrs+cfpr+roe+spr+ebitda+igr
                    +sgrowth+esr1+lev+cgrowth+vol+roa1,family=binomial)
> summary(learning.glm)
> detach(learning)
> test<-read.csv("property200006.csv",header=TRUE)
> attach(test)

ある(learning)データから回帰分析して得られた回帰係数を用いて、違う(test)データを回帰分析しようと考えています。
現状は回帰係数を自分で入力しているのですが、自分で入力することなく回帰分析することはできないでしょうか。
よろしくお願いします。

  • glm が何を返すか,str( ) で調べましたか?少なくとも,それを使えば手で数値を入力することは避けることができると思います。 -- 2007-01-15 (月) 18:21:21
  • help(predict.glm) を良くみる。特にオプション newdata の解説を。 -- 2007-01-15 (月) 21:17:47
  • そもそもの根本は,? glm をすること。そうすれば,関連する関数(predict.glm も含めて)へのリンクが,すべて書いてある(私は glm を使う必要が今までなかったので,調べもしなかったのだ。といいわけを) -- 2007-01-15 (月) 21:31:05
  • それと、一行にあまり長いものをおかないこと。モデル式はもっと簡潔に(例えば def ~ . などと)出来るのでは。 -- 2007-01-15 (月) 22:14:55
  • 所詮,データがないと再現もできないのだからってか? 行は,先達が分割してくれたようですね。 -- 2007-01-15 (月) 22:18:35

重回帰分析のステップワイズ変数選択でのエラー

GEO? (2007-01-06 (土) 18:34:20)

はじめまして。
結果率(果実/花)を従属変数、各花形質を独立変数としてロジスティック重回帰を行おうとしております。この際に、関数step()を用いて、変数選択しようと試みたのですが、以下のようなエラーが出てうまくいきません。どのような原因でこのようなエラーが出るのか、また、このまま解析を進めても良いのか、教えていただけないでしょうか?

> h0 <- read.delim("c:/2000R2.txt")
> fs <- h0$fru/h0$flo
> result <- glm(fs~h0$ftl+h0$ptl+h0$ptw+h0$sta+h0$pis+h0$blt+h0$wit, weights=h0$flo)
> result2 <- step(result)
Start:  AIC= -2819.3 
 fs ~ h0$ftl + h0$ptl + h0$ptw + h0$sta + h0$pis + h0$blt + h0$wit 

         Df Deviance      AIC
- h0$wit  1    22.05 -2821.19
- h0$ptw  1    22.05 -2821.16
- h0$sta  1    22.06 -2821.13
- h0$blt  1    22.12 -2820.58
- h0$ptl  1    22.14 -2820.44
<none>         22.04 -2819.30
- h0$pis  1    22.33 -2818.70
- h0$ftl  1    23.20 -2811.30
Error in step(result) : number of rows in use has changed: remove missing values?

また、remove missing values? という問いかけが出てきますが、これに対しての答え方が良くわかりません。。どのようにすれば、欠損値を除いて、解析を先に進めることができるのでしょうか?
よろしくお願いいたします。

  • 欠損値NAがあるからでしょう。read.delim でデータを読んだ行の次に,h0 <- subset(h0, complete.cases(h0)) を入れてご覧になれば?(念を押す必要はないと思いますが,complete.cases の引数となるオブジェクトのすべての列を対象にしますから,分析に無関係な変数がある場合には complete.cases の前に,不要な列を落としておく必要があります。詳しくはオンラインヘルプをご覧くださいね)。 -- 2007-01-06 (土) 18:42:26
  • 早速のご教授いただきましてありがとうございました。試してみるとうまくいきました。誠にありがとうございました。 -- GEO? 2007-01-06 (土) 18:47:10

Rでの単位根検定

秋田県民A? (2006-12-17 (日) 17:43:33)

最近時系列分析を行うためにRを使い始めた初心者です。
まず定常性を確認するためにadf.test()関数を用いているのですが、
?定数項あり、トレンドあり ?定数項あり、トレンドなし
?定数項なし、トレンドあり ?定数項なし、トレンドなし
などの各状況に応じた使い方が分かりません。そのままadf.test()を使った場合にはどの場合の検定になるのでしょうか?
どなたかお分かりになる方がいらっしゃいましたら、教えてください。

  • 引数 alternarive は2通りしか設定できないし,k はラグだし,あなたのいうような4通りの条件設定での使い方などできそうにもないですね。まずは,答えの分かっているデータについて,adf.test を引数を変えて実行し,どの場合がどの結果に対応しているかを,発見的アプローチで確かめるのが良いかも。当然ながら,ちゃんと解説されている文書を探すのが最善解ですが。(ここは,中級者コースのQ&A????) -- 2006-12-17 (日) 18:55:03
  • ご返事どうもありがとうございました。文献を探しつつ、色々試して見ます。 -- 秋田県民A? 2006-12-18 (月) 15:56:34

intel mac でのRのインストール、起動

やまだ? (2006-11-21 (火) 11:14:18)

初めて書き込ませていただきます。どうぞよろしくお願いします。
今までPowerBookG4でMac版を動かして使っていたのですが、今回先月発売になったCore2DuoのMacBook? Proを新しく購入したのでインストールしてみたところ、起動時に以下のコメントが赤字で表示されるようになりました。

「2006-11-21 10:48:31.215 R[261] CFLog (21): dyld returns 2 when trying to load /Users/(ユーザ名)
/Library/ScriptingAdditions/YouHelper.osax/Contents/MacOS/YouHelper」

このときインストールしていたのがバージョン2.3.1でして、CRANを調べたらユニバーサル版の最新版として2.4がありましたので、それを再度インストールしてみましたが状況は同様で毎回起動時に表示されます。一応試しに使ってみましたが、問題なく動いてはいるようなんですが。。。ちょっと気持ち悪いので。
もしこの状況に見覚えのある方等おられましたらコメントいただけるとありがたいです。 どうぞよろしくお願いします。

  • IntelMac?は無いので, 参考になるかどうか. なんとなく先にインストールしたものが邪魔している気がします. ここ参照 ユニバーサル化された物は非常にややこしいバイナリに(元からややこしいけど)なってます. -- なかま 2006-11-21 (火) 11:23:30
  • コメントありがとうございます。リンクされていたサイトを参考に削除した上で再インストールしてみましたが状況は変わりませんでした。intel macが出てから結構たちますが、ほかのintel macでは問題が出てないのでしょうか。 -- やまだ? 2006-11-21 (火) 12:33:52
  • 何か変なもの入れてない?というのが,口癖の人がおりますが。YouHelper? が文句を言っているようなんですよね。それは,元から入っているもの?貴方が入れたもの?貴方が入れたものなら,削除してからRを再インストールしてみたらいかがでしょう。 -- 2006-11-21 (火) 13:06:03
  • そうですね. 新しい=人柱はデフォルトなのかも... -- なかま 2006-11-21 (火) 13:11:12
  • 手元のMacBookPro?では問題ありません。/Library/ScriptingAddtions? は本来(OSインストール時)何も入っていないフォルダなので、入れているソフトの問題だろうと思います。 -- 岡田 2006-11-21 (火) 14:21:08
  • 私のMacBookPro? MacOSX 10.4.8でも問題ありません。R 2.3.1ですが。 -- 谷村 2006-11-21 (火) 15:13:15
  • だって,ググったら,YouControl? とかあぶなそうなんだもん,他のアプリのショートカットに影響を与えるなんて書いてあるし -- 2006-11-21 (火) 15:59:06
  • みなさまコメントありがとうございます。元から入ってないものなんですか?このyouhelperって。特に自分で入れた覚えはないので何かのソフトをインストールしたときにいれられたのかもしれません。きもちわるいのでOSの再インストールしてみます。 -- やまだ? 2006-11-21 (火) 20:01:08

wavelet

lostway? (2006-11-12 (日) 01:58:50)

Rでwavelet解析やっている方いますでしょうか?

  • 不精しないで検索。 -- 2006-11-12 (日) 09:22:50
  • いたらどうだと言うんでしょうか? -- 2006-11-12 (日) 11:27:01
  • いくつかパッケージがありますが、パッケージ付属の使用例以外にもっと沢山の解説付の例題を見たいのですが、日本語検索ではうまく見つかりません。 -- lostway? 2006-11-12 (日) 12:28:00
  • いろいろ知りたいのなら,英語のページも見ましょう -- 2006-11-13 (月) 00:10:41
  • なんとなくですけど,できましたよ.どのような事をされたいのですか?? -- 藤野? 2006-12-12 (火) 22:33:21

cgiからRの起動

イシ? (2006-11-10 (金) 15:33:30)

cgiスクリプトからRを起動し、グラフを作成したいのですが、Rのjpegデバイスを開く段階でエラーが出てしまいます。対処法ありますか?
R-Version 2.3.1

#### エラーメッセージ #####

Error in X11(paste("jpeg::", quality, ":", filename, sep = ""), width,  : 
        unable to start device JPEG
In addition: Warning message:
unable to open connection to X11 display ''
Execution halted
  • エラーを再現できる情報をちゃんと提示する方がよいでしょう。問題を再現できる最小限のプログラム。2.4.0 を使っても同じなんでしょうね。ところで,プラットフォームは? -- 2006-11-10 (金) 16:04:22
  • X11()だからそれ以上のプラットフォームに関する情報は必要ないのでは。Xのライブラリが入っていないとjpegディバイスが使えないのではと予想。 -- 2006-11-10 (金) 16:28:11
  • プラットフォームはNetBSD 3.0_STABLEです。通常どおりRを起動すればjpegデバイスを開くことができるのですが、cgiから起動させるとエラーが出るようでした。cgiではrubyで以下のスクリプトを実行しています。system("/opt/R/bin/R --no-save < /home/takashi/test116_2.R > /home/takashi/log.dat 2>&1") ちなみに、パーミッションの問題ではないようでした。バッチモードで実行してみたいのですが、いまひとつ参考になるサイト・資料を探せませんでした。アドバイス、お勧めのサイト・資料があれば教えて頂ければ、幸いです。 -- イシ? 2006-11-10 (金) 16:51:29
  • RのJPEG,PNGはX11の動作している環境が必要です. CGIに環境変数DISPLAY=:0.0 をあたえる等してください. この手の問題はUnix系のFAQでXvfbとかでググれば沢山出てくると思います. -- なかま 2006-11-10 (金) 17:50:07
  • 問題が解決致しました。みなさん、ありがとうございました。 -- イシ? 2006-11-10 (金) 18:59:45

glmの説明変数に割合は使えるのか?

服部? (2006-11-02 (木) 14:06:43)

ある目的変数(比率)を説明する変数を特定するときに、glmを用いて解析をしたいと思っています。
その際説明変数に割合の変数含めたいのですが、どのようにしたらよいのでしょう?
現在以下のようにglm関数を使っています、訂正すべき場所があったらそこも指摘していただけると幸いです。

> a<-adult/colonysize
> yy<-glm(cbind(x,y)~a+b+c+d,binomial)
  • そうやって指定して分析していて,何か問題があるんですか? -- 2006-11-02 (木) 16:22:22
  • Rの教科書的な本を何冊か読みましたが、説明変数に割合を用いる場合のことを目にすることがなかったために質問させていただきました。割合を扱う場合変数変換(arcsin変換)をしなければならないと思うのですが、glmで変数変換を適用しなくてもいいのでしょうか? -- 服部? 2006-11-02 (木) 23:43:02
  • family=binomialは2項分布を前提としているのではないでしょうか?目的変数が比率では問題があるような気もしますが・・・ -- 2006-11-03 (金) 22:36:53
  • Stastistics An introduction using Rにpropotion dataの扱い方が載っています。そこに目的変数を割合で扱うときの詳しい説明がされています。目的変数が比率であることとfamily=binomialであることは問題が無いと思いますが、いかがでしょう? -- 服部 ? 2006-11-04 (土) 12:20:43
  • >そこに目的変数を割合で扱うときの詳しい説明がされています
    そもそもの質問の答えは載っていないのですか?
    arcsin 変換したときとそのままのときで,あてはめ結果がどのようになるかは見てみたんでしょうか? -- 2006-11-04 (土) 18:31:34
  • >質問の答えは載っていないのですか?
    見落としていなければ載っていないはずです。
    arcsin変換した場合では説明しているとされる(有意差の出る)変数がしない場合と比べ全く違ったものになります。 -- 服部? 2006-11-04 (土) 21:58:07
  • で,どちらが妥当な結果だと解釈されますか?やはり,理論的保証をお望みなんだとは思いますが。 -- 2006-11-04 (土) 22:46:37
  • どちらが妥当かといわれると、目的変数が比率である以上説明変数に何の処理も加えていない比率の変数をいれてしまうと有意差が出やすくなるのは当然だと思います。
    そのことをふまえると、他の変数も処理が必要になるとは思いますが、arc sin変換したほうが妥当だという意味では妥当だと思います。 -- 服部? 2006-11-06 (月) 12:36:58
  • 比率って2項分布するのですか?? -- 2006-11-07 (火) 00:48:07
  • 二項分布というのはあるXというものが一定の割合で含まれる集団からランダムに抽出した場合、その抽出したサンプルの中にXがどの程度含まれているかということを考える上で二項分布に従うとします。
    なのでどんな比率でも二項分布するわけではないのですが、今回用いている目的変数はある集団からランダム抽出した際のある形質が含まれる割合ということにしています。今回の質問では割合というと誤解を招くかと思ったので、わかりやすく比率ということにしたのですが余計誤解を招かれてしまったようですみません。ちなみに今回問題にしている説明変数も目的変数と同じような割合(比率)だとお考えください。
    お答えになったでしょうか? -- 服部? 2006-11-07 (火) 16:27:12

R2.4.0からの,無意味な正規表現におけるWarning

アール? (2006-10-27 (金) 16:26:24)

R 2.4.0 からは "?.foo" のような無意味なエスケープシークエンスに warning を出すようになりました。それはそれでいいのですが,これを考えていてちょっとした疑問が出てきました。
"foo.bar.baz" のような正規表現で,最初のピリオドは文字通りピリオド(他の言語の正規表現では"?.")二番目のピリオドは何でもよい一文字を表す正規表現"."なんかは,書きようがないんじゃないかと。fixed 引数も,全てに適用されるものなので無力だしね。

> sub("foo?.bar.baz", "match", c("foo.bar.baz", "foo.bar,baz", "foo,bar.baz", "foo,bar,baz"))
[1] "match" "match" "match" "match"
Warning messages:
1: '?.' is an unrecognized escape in a character string 
2: '?.' is an unrecognized escape in a character string 
> sub("foo.bar.baz", "match", c("foo.bar.baz", "foo.bar,baz", "foo,bar.baz", "foo,bar,baz"))
[1] "match" "match" "match" "match"
  • 明示的にこれはピリオドですと言うのはパターンに`??.' と書くんです. なんでもいーよは`.'です. パーサがエスケープする段階と, 正規表現に渡す段階があります. -- なかま 2006-10-27 (金) 16:48:47
  • なるほど。それを忘れていました。二段階あるんですね。 -- 2006-10-27 (金) 16:59:02
    > sub("foo??.bar.baz", "match", c("foo.bar.baz", "foo.bar,baz", "foo,bar.baz", "foo,bar,baz"))
    [1] "match"    "match"    "foo,bar.baz"    "foo,bar,baz"

閉曲線で囲まれた領域を塗りつぶす関数

青木繁伸 (2006-10-19 (木) 15:41:02)

お絵かきソフトでよくある「ペイント缶」の機能を果たす関数がないのかなあと。
曲線にこだわるわけではない(曲線だって,グラフに描くときには折れ線)ので,polygon関数でも良いわけだが,点を与えてポリゴンを描いて内側を塗りつぶすのではなくて,経過は問わず既にできている閉局面で囲まれている領域を塗りつぶす関数が欲しいということ。

#ref(): File not found: "ex.png" at page "Q&A (初級者コース)/13"

メモリについて

しも? (2006-10-02 (月) 21:40:16)

マニュアル等で調べても、解決法が見つかりませんでしたので質問します。
関数を作成し、計算をさせています。計算途中で、以下の警告が出て計算がストップします。

以下にエラーodbcQuery(channel, query, rows_at_time) : 
Calloc がメモリー (263168 of 1) を割りあてられませんでした
追加情報: Warning message:
Reached total allocation of 1015Mb: see help(memory.size)

使用するメモリーサイズを"--max-mem-size=2G"を使用して拡大しても、計算が止まる状況です。
関数内では「rm()」を使用し、こまめにオブジェクトは削除しています。
Windows タスク マネージャのPF使用量を見るとrm()を使用していても使用量がどんどん積み重なり、ある一定値で計算が止まっり、計算が止まっても使用量は減りません。使用量を減らす唯一の方法はq()でRを閉じる方法しかありませんでした。

メモリーを上手に割り当てるようにするにはどうしたらよろしいでしょうか?

  • 検索不足ですね。Rjpwikiでmemory.limitをすると同様の質問が過去にあります。
    一例を照会すると、「メモリの上限に関する質問です
    あとメモリの使用状況を確認していますか??gc() -- 2006-10-03 (火) 09:04:33
  • 物理的制限に関してはそういうことでしょう。それを論理的に避けるのがプログラム作成法(アルゴリズム)でしょう。よほど,まずい使い方をしているのではないかと言うことで,プログラムを開示すればとのアドバイスですが,真剣に取り組もうとしていないのかお返事がない。 -- 2006-10-03 (火) 09:54:08
  • 考えられる原因をメモしてみます。rm(...) で開放されたメモリは必ずしもそのあと再使用できないことが有る(特に、細切れに使っている場合)ようです.こうした場合はガベージコレクション gc() を実行して空きメモリの強制回収をします。ただし、これはそれなりに時間を喰いますから、頻繁に行うと実行時間が極端に低下する恐れが有ります。もう一つ考えられるのは、プログラムのまずいメモリ管理のせいでメモリを浪費することも有るようです.さらに留意すべきは、R 関数は基本的に「値渡し(引数オブジェクトのコピーをそのつど新規に作る)」ですから、巨大なオブジェクトを引数に与えるとその分メモリは消費されます。もしこれが原因なら、永続付値 <<- 等を使い、ある環境中に置かれたオブジェクトを直接操作することにより「参照渡し」にすべきです.なにかおもいあたることがありますか。 -- 2006-10-04 (水) 00:36:54
  • お返事、ありがとうございます。 過去の返信コメントはキツメの内容が多く、半分トラウマになってしまいました。質問時にはgc()も実行してもだめな状態でした。「2006-10-04 (水)」のコメントを拝見して、プログラムのメモリ管理の影響が原因かなと思っています。永続付値について勉強になりました。やってみたいと思います。 -- しも? 2006-10-04 (水) 16:43:38

optim()でエラーが出ます

SS? (2006-09-28 (木) 14:53:42)

2パラメータの最尤推定を行う際、optim()を使って尤度関数を最大化する値を探そうとしたら、「以下にエラーchol(M) : 次数 1 の主対角行列が正定値ではありません」というエラーメッセージを得ました。nlm()でも同様のエラーメッセージを得ました。

optimの場合、optionとして"Nelder-Mead", "BFGS", "CG", "L-BFGS-B", "SANN"の全てを試しましたが、同様のエラーメッセージが出ました。

2パラメータなので、尤度関数をプロットしてみた感じだと、山頂はある様子でした。初期値も、プロットした尤度関数の山頂付近に設定しました。

このエラーメッセージは、どういう状況のときに出力されるのか、ご存知の方がいらっしゃったら、教えていただけるとありがたいです。

  • エラーになるデータの例を示すことはできませんか?
    それと,貴方が実際にやったことの全てを説明しないと,どこがおかしいかわからない。
    データが変なんだと思います。あるいは使い方を誤っている。
    ? chol を読むとわかりますが,対象とするのは正定値行列です。どういうのが正定値行列かと言えば,固有値を求めたとき全部正の値であること。どれかが0,または,マイナスだと正定値行列ではないということですね。以下のような例を見てください。
    問題は,chol の引数になるものがどうやって作られているかです。つまり,データがおかしいのではないかと。 -- 2006-09-28 (木) 15:29:58
    > m <- structure(c(1, 0.1, 0.8, 0.1, 1, -0.7, 0.8, -0.7, 1),
    + .Dim = c(3, 3))
    > m
         [,1] [,2] [,3]
    [1,]  1.0  0.1  0.8
    [2,]  0.1  1.0 -0.7
    [3,]  0.8 -0.7  1.0
    > chol(m)
    以下にエラーchol(m) : 次数 3 の主対角行列が正定値ではありません
    > eigen(m)
    $values
    [1]  2.0147034  1.0990993 -0.1138027 # 3つめの固有値がマイナス
    
    $vectors
               [,1]        [,2]       [,3]
    [1,] -0.5262037 -0.65755945  0.5391894
    [2,]  0.4471271 -0.75329549 -0.4823104
    [3,] -0.7233167  0.01270732 -0.6903995
    
    > m <- matrix(-1, 1,1) # 次数1というと,1行1列の行列ですが。。。?
    > chol(m)
    以下にエラーchol(m) : 次数 1 の主対角行列が正定値ではありません
  • 先のコメントにもありますが、optim()の目的関数がどのようなもので、chol()がどのように使われているのかが分からない限り、推測で回答するしかありません。データがおかしい、あるいはchol()でコレスキー分解される対象にパラメータが入っていて、最適化の途中でコレスキー分解不可能な領域の値が試されている、といったところが原因ではないでしょうか。 -- ジェットラグ? 2006-09-28 (木) 16:11:14
  • ご解答、ありがとうございました。特に、cholのエラーの例まで挙げていただいて、大変たすかりました。データはやはりおかしくなかったのですが、上の例のおかげで、統計的に最尤推定が不可能なモデルを想定していたことが原因だろう、ということが分かりました。ありがとうございました。 -- SS? 2006-09-29 (金) 13:34:42

legendにグラデーション

nonami? (2006-09-14 (木) 19:45:14)

散布図を作っています。
x, yのデータ以外に第3のデータがありまして、それが0〜100まであります。
rainbowをの一部を使って、0なら青、100なら赤その間は緑から黄色、オレンジというようになんとなくサーモグラフィっぽい感じで色をつけています。
plot自体はうまく行ったと思うのですが、legendを付けようとしたときに
はたと困ってしまいました。青→緑→黄色→オレンジ→赤の順に数値が高くなるよというlegendは作成できるのでしょうか?

  • ないもの(探しにくいもの)は作る。探している時間で作れる。 -- 2006-09-14 (木) 22:19:54
    cols=rainbow(101)
    x <- rnorm(1000)
    y <- rnorm(1000)*200
    z <- sample(101, 1000, replace=TRUE)
    plot(x, y, col=cols[z], type="p", pch=20)
    for (i in 1:101) rect(1.5, 502-2*i, 2.5, 500-2*i,col=cols[i], border=cols[i])
    text(2.5, seq(502, 300, length=3), c("lo", "med", "hi"), pos=4)
    定数で決め打ちしているところを引数で渡す位置情報に基づく計算できめるなど,汎用化して関数にすればよい。 こんな散布図を描いているんでしょうか?

    #ref(): File not found: "scatter.png" at page "Q&A (初級者コース)/13"

  • はい。その通りです。ありがとうございました。 -- nonami? 2006-09-15 (金) 08:59:17

安定分布の擬似乱数

TH? (2006-08-13 (日) 18:39:13)

Rで安定分布に従う擬似乱数を発生するパッケージ等をご存知の方はご教示ください。

  • fBasicsがありました。 -- TH(本人)? 2006-08-13 (日) 19:15:04
  • Hessian non-positive definite. No variance! -- -0.889? 2009-03-22 (日) 15:59:33

tune.svm を実行すると .Random.seed のエラーがでて実行できない

はるか? (2011-11-11 (金) 11:56:20)

R初心者です。先日は疑問に対して丁寧にお答えいただいてありがとうございました。

その後、tune.svmを使おうと先日からお世話になっているサイトで丁寧に解説があったので、下記のように同様に実行してみたところ

gammaRange <- 10^(-5:5)
costRange <- 10^(-2:2)
t <- tune.svm(Species ~ ., data = iris, gamma=gammaRange,
cost=costRange,tunecontrol = tune.control(sampling="cross", cross=8))
以下にエラー sample(n) : 
  .Random.seed は整数ベクトルではなくタイプ 'list' で

と出てしまい実行することができませんでした。.Random.seedの設定?など特にしていないのですが、何か特別な設定等必要なのでしょか?webを検索したのですが、同じような点で悩んでいる例がなかったので、質問させていただきました。
環境は、OS WindowsXp?, R version 2.12.1です。お手数ですが、アドバイスいただけると大変助かります。よろしくお願い致します。

  • R 2.13.1 でやってみましたが,何の問題もなく動きますね。特別な設定などは不要です。
    エラーは,sample 関数で起きているようですね。一度,.Random.seed=1L とでもやってみてください。その後 sample(5) などとしてエラーが起きなければ OK -- 河童の屁は,河童にあらず,屁である。? 2011-11-11 (金) 12:42:03
  • 河童の屁は,河童にあらず,屁である。さん、いつも有り難うございます。上記の通りにコマンドを打って実行してみたところ、問題なく動きました。本当にありがとうございました。 -- はるか? 2011-11-11 (金) 15:26:22

作業ディレクトリを、スクリプトが置かれてるディレクトリに変更

mat? (2011-11-10 (木) 13:03:16)

あるスクリプトを開いてそれを実行する際に、作業ディレクトリを(スクリプト内で動的に)そのスクリプトファイルが置かれている場所に変更することは出来ないのでしょうか?

  • setwd()じゃダメなんですか? -- 2011-11-10 (木) 13:38:45
  • スクリプトファイルと入出力ファイルを(両者の相対パス関係は変えずまるごと)移動させたときに、入出力ファイルのパスを書き換えるのがちょっと面倒くさいなぁと思いまして。setwd()使ったら一行書き換えるだけで出来そうですが、実行中のスクリプトファイルが置かれてるフォルダのパスを返してくれる関数があれば書き換えの必要ないかなぁと思ったので -- mat? 2011-11-10 (木) 14:39:10
  • スクリプトをどうやって動かしてますか?source("path/hoge.R")?それともターミナルからRscript path/hoge.R? -- 2011-11-10 (木) 15:14:03
  • sourceしてるなら、chdir=TRUEでそのディレクトリに移動しますよ。 -- 2011-11-10 (木) 15:17:18
  • Rscriptからなら、commandArgsの中に--file=があるので、こっからパスを拾えます。 -- 2011-11-10 (木) 15:18:49
  • RGuiのメニューで、『ファイル → スクリプトを開く...』でスクリプトファイル開いて、『編集 → 全て実行』してました -- mat? 2011-11-10 (木) 15:57:53
  • あー、えー、その場合はスクリプト内でどうこうするのは難しいでしょうね。それはスクリプトを実行してるというより、スクリプトの内容をコンソールにコピペしてるんです。 -- 2011-11-10 (木) 16:39:48
  • まああ,対応するのにそんなにたいした手間でもないことを,効率的にやろうとしたところが,そもそもの出発点。そもそも,対象とするファイルのディレクトリ関係をそんなに頻繁に・複雑に変化させなければならないという事にも共感できないし。
    普通は,関係するスクリプトと入出力ファイルを同じディレクトリに置くというのが最も予測される対処なのだから,作業ディレクトリをどこにしようと,そこにスクリプトと入出力ファイルがあるというようにすれば,複雑な状況は生じないでしょう。
    また,最も予測されるのは,処理プログラムは共通(対象とするファイルなどはその都度変わるかも知れないけど,別のディレクトリに置いておけば良いだけの話)つまり,関係するディレクトリを作業ディレクトリにすれば,そこに,スクリプトも入出力ファイルもあると言うこと。単純明快だと思いますけど?
    何かをやるたびに作業ディレクトリを変更しなければならないということなら,変更するディレクトリをリストにしておけば良いだけのことだし,そもそもそんな慌ただしいことをしなければならないということ自体を避ける(あるいは自動的対処をする)というようにするのが正しい対処というものでしょう。
    基本:何を繰り返しとするか。
    繰り返しに規則はあるのか。
    規則をプログラムできるのか(プログラムできないのなら,その規則自体が不適切なのだ)
    もうちょっと,具体的にいわないとわからないかな?というか,あなたの状況がこういうことかな?ということでしかないのだけど(だからこそ,あなたがどういう状況で,どういう事をやりたいのか,もっと詳しく書かないといけないよと言うこと)
    なにかを統一的な方法で処理するプログラムがある。ただし,対象とするデータは別々のディレクトリに用意されている。それぞれのディレクトリにあるデータに,同じ分析プログラムを適用する。
    1)分析しようとするデータのあるディレクトリに移動する。(ディレクトリ名に規則性を持たせていれば,プログラム的に移動することは可能。何の規則性もないとしても,対象とするディレクトリ名のリストを与えれば(そのリストも自動亭に生成できる可能性は大)自動処理も可能。
    目的とするディレクトリに移動した後の処理は,自動処理できますね。
    教訓:
    コンピュータは繰り返しに基づく自動処理は得意---人間は「このような規則で繰り返し処理すればよいのだよ」ということを教えてやる必要がある。
    両方がうまくいけば,最大のコスト・パフォーマンスが得られる。
    現場では,単純な記述で表現できない複雑な状況があると思うので,その場その場での対応が大切!!!こんなところで,短い記述で解決できるものとも限らないので,よく考察すべし!!!。 -- 河童の屁は,河童にあらず,屁である。? 2011-11-10 (木) 22:00:59

図の上での計測について

KT9? (2011-11-09 (水) 09:45:58)

医学系の研究者です。
JPEG形式の超音波画像があります。これをRで取り込んで、ある一点の(x,y)座標、2点間の距離、面積などを計測する方法はあるのでしょうか。
  (x,y)さえ打ち出せれば、後は自分で別個に組んだプログラムで、距離、面積、角度などは簡単に測れると考えています。
 以前他の研究者がMathLab?では、JPEGで取り込んだ画像上で、様々な処理を行っているのを見ました。
 宜しくお願い致します。

  • 高階さんが開発されたrimageというライブラリ(現在maintainerがORPHANEDとなっているので,もうサポートされないかもしれませんが)のread.jpeg()関数でJPEG画像を読めます。そのオブジェクトをplot()すれば画面に画像表示できます。そこでlocator()関数を使えばマウスでクリックした点の座標を得ることができます。しかし,たぶんその用途ならば,imageJ(旧NIH Image)を使う方が楽なんではないでしょうか(もしかしたら,既にそれ用のパッケージが存在しているかもしれませんが,寡聞にして知りません)。 -- 中澤? 2011-11-09 (水) 10:34:07

CSVファイルからのデータのインポートができない

diereinevernunft? (2011-11-03 (木) 00:17:54)

R初心者です。
Rを2.13.0から最新バージョン(2.14.0)に更新し、Rコマンダーも新たに1.7-0をインストールし直したのですが、データのインポートでCSVファイルからデータを読み込もうとすると、

Dataset <- 
read.table("C:/Users/Documents/ワークショップ/Rデータ処理用/(ここで強制改行)
修論素材/加工後/R用/111024/tsushin_growth.csv",
header=TRUE, sep=",", na.strings="NA", dec=".", strip.white=TRUE)

が実行されたあと、メッセージ欄に

[2] エラー: NA

と表示され、データがインポートできません。
ちなみに、CSVファイルをtxtファイルに変えるとインポートできるようなので、現在はそれで対応しています。
googleで検索してみたのですが、現状では有効な対策を見つけることができませんでした。

OS Windows7(64bit)
R version 2.14.0
Rcmdr version 1.7-0
  • エラーメッセージだけを見ると文字コード関連のエラーだと思うんですが、txtファイルにすると直るというのがよくわからないですね。
    いくつか質問なんですが、txtファイルに変えるというのはタブ区切りにするということであっていますか?
    txtファイルにしてインポートしたときに実行されるコマンドは上のcsvをtxtに変えたものですか?
    新しいRとRcmdrでは日本語の扱いがうまくできないようなので極力日本語を使わないようにするか(データのパスにも)、バージョンを落とすか、Rcmdrを使わないかが今のところは良さそうです。 -- Iona? 2011-11-03 (木) 01:14:20

svmの結果, Total Accurancyがでない

はるか? (2011-11-02 (水) 15:38:48)

R初心者です。svmに興味があって、googleを検索したところ、丁寧な解説があったのでこのWebに沿って、同じようにやると

Total Accuracy:94
Single Accuracies:
90 96 96

と同じように結果が再現され正答率がでたところまではよかったのですが、いざ自分の持っているデータでやって結果を見ようとすると...

model <- svm(judge~., data=dataset, corss=3)
summary(model)

Parameters:
   SVM-Type:  eps-regression 
 SVM-Kernel:  radial 
       cost:  1 
      gamma:  0.01190476 
    epsilon:  0.1 

Number of Support Vectors:  51

3-fold cross-validation on training data:

Total Mean Squared Error: 0.6049732 
Squared Correlation Coefficient: 0.06871624 
Mean Squared Errors:
 0.4767778 0.5592772 0.7788645 

と出てしまい、Accurancyが出てきません。
何がいけないのか分からず、困っています。
OS WindowsXp?, R version 2.12.1でやっています。

扱ったデータから解を求められないということなのでしょうか?
それとも何か別に問題点があるのでしょうか。
周りにアドバイスを求める人がおらず困っています。
お手数ですが、アドバイスいただけると大変助かります。よろしくお願い致します。

  • あなたのデータセットが分からないので,追試してみることができませんが,一つ気になるところは,svm の 引数の名前が corss になっているところ。正しくは cross でしょう。
    あなたのデータの分析結果を見ると,SVM-Type: eps-regression となっており,例題では SVM-Type: C-classification となっておりますね。例題は判別だからTotal Accuracy や Single Accuracies が出るのです。regression には,accuracy はありませんからね。
    引数 cross のオンラインヘルプの説明に,the Mean Squared Error for regression と書いてありますよ。
    では,なぜあなたのデータを分析すると svm は eps-regression をやるのかは,同じくオンラインヘルプの type 引数の所に Depending of whether y is a factor or not って書いてありますよ。
    オンラインヘルプは良く読みましょう。 -- 河童の屁は,河童にあらず,屁である。? 2011-11-02 (水) 16:48:07
  • judgeの部分に数値で0,1を入れていたのが原因だったのですね。今後もっと気をつけてオンラインヘルプをしっかり読んで勉強したいと思います。本当に有り難うございました。 -- はるか? 2011-11-04 (金) 09:35:57

導関数の求め方について

みのむし? (2011-10-30 (日) 16:58:40)

R初心者です。導関数を求めるのに、deriv()を使っています。直接、カッコ内に関数を打ち込まないといけないようなのですが、そのほかの方法はないのでしょうか?

たとえば、

> Df <- deriv(~x^2, "x", func=TRUE)
> Df(2)
[1] 4
attr(,"gradient")
     x
[1,] 4

と答えがえられるのですが、カッコ内に打ち込む関数x^2を、最初にfと定義し、それを代入するとうまくいきません。

> f <- expression(x^2)
> Df <- deriv(f, "x", func=TRUE)
> Df(2)
expression(x^2)
attr(,"gradient")
     x
[1,] 0

ご存じの方がいらしゃれば、教えていただけないでしょうか?お忙しいところ申し訳ありません。よろしくお願いいたします。

  • ちゃんと動くけど?
    あなたの OS の種類とバージョン,R のバージョンは?
    ちなみに,(直したけど)投稿法を確認することと,TRUE/FALSE を T/F などと横着しないことと,空白を適切に置くなど,初心者の頃からのプログラミング作法を身につける方がよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2011-10-30 (日) 17:41:26
    > f <- expression(x^2)
    > Df <- deriv(f, "x", func=TRUE)
    > Df(2)
    [1] 4
    attr(,"gradient")
         x
    [1,] 4
  • ご回答ありがとうございます。解説書にfunc=Tと書いていたのを、意味も分からず、使っておりました。ご指摘いただき、感謝申し上げます。R version 2.13.1を、Windows7で使っております。おっしゃる通り、ちゃんと動きました。Deriv(~f,"x",func=TRUE)と書いておりました。~fとしたのが良くないかったとわかりました。お騒がせいたしました。 -- みのむし? 2011-10-31 (月) 10:29:21

plotの軸目盛りの指定について

ringori? (2011-10-27 (木) 01:48:51)

お忙しいところ失礼します。plotを使って折れ線グラフを作成しているのですが、x軸の目盛りの内容の一部を文字列で指定したく思っています。少し調べた所

test <- c(0.8699, 0.9029, 0.9133, 0.9014, 0.9160)
plot(test, type="l", lwd=2, xlab="test", ylab="AUC", xaxt="n")
mtext(1:4, 1, 1, at=1:4)
mtext("Q", 1, 1, at=5)

として近いものは出来たのですが、目盛りの線が無くなってしまうのと、もっとスマートな方法があればご教授いただければと思います。 もし、過去の投稿等見逃していましたら申し訳ありません。環境は

sessionInfo()
R version 2.10.1 (2009-12-14) 
i386-pc-mingw32 

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

  • これでいいのかしら? -- 里見聡美?
    plot(test, type="l", lwd=2, xlab="test", ylab="AUC", xaxt="n")
    axis(side=1, at=1:5, label=c(1:4, 'Q'))
  • まさに求めていたものでした。迅速な返信ありがとうございます!! -- ringori? 2011-10-27 (木) 12:54:44

grepでの検索について

Toy? (2011-10-26 (水) 14:12:37)

お世話になります。
Windows 7 で R version 2.13.0 を使用しています。
様々な記入形態がある文字列について抽出処理を行おうとしています。
下記のような文字ベクトルについて

x <- c("マツホ−ム", "タケハウス", "ウメコウムテン",
		"カブ)マツホ−ム", "タケハウスカブシキガイシャ", "ウメコウムテンカブ")

次のような例では、正しく結果が表示されます。

> grep("_*ウメコウムテン_*", x, value = TRUE)
[1] "ウメコウムテン"     "ウメコウムテンカブ"

ところが、次の例では

> grep("_*タケハウス_*", x, value = TRUE)
character(0)

と全く結果が得られず、次の例では、

> grep("_*マツホ−ム_*", x, value = TRUE)
[1] "マツホ−ム"         "ウメコウムテン"     "カブ)マツホ−ム"   "ウメコウムテンカブ"

と余計なものまで出力されてしまいます。
どうしてこのような結果になるのか、お教えいただければ幸いです。

  • Mac OS X 10.7.2 で,R version 2.13.2 ですが,どの例もちゃんと結果が出ますけど。
    Windows 版は日本語の扱いが十分ではないのかな。
    perl=TRUE を指定すれば,理由は分からないけど,少なくとも挙げられた場合についてはうまくいくようですよ。 -- 河童の屁は,河童にあらず,屁である。? 2011-10-26 (水) 16:00:46
    > x <- c("マツホ−ム", "タケハウス", "ウメコウムテン",
    + 		"カブ)マツホ−ム", "タケハウスカブシキガイシャ", "ウメコウムテンカブ")
    > grep("_*ウメコウムテン_*", x, value = TRUE)
    [1] "ウメコウムテン"     "ウメコウムテンカブ"
    > grep("_*タケハウス_*", x, value = TRUE)
    [1] "タケハウス"                 "タケハウスカブシキガイシャ"
    >  grep("_*マツホ−ム_*", x, value = TRUE)
    [1] "マツホ−ム"       "カブ)マツホ−ム"
  • 本当だ!うまくいきました。「河童の屁は,河童にあらず,屁である。」さん、ありがとうございます!でも、不思議ですねえ・・・ -- Toy? 2011-10-26 (水) 16:50:29

CSVを読み込んだあとで、ある特定の文字列の行数まで読み飛ばす方法

nya? (2011-10-23 (日) 01:21:25)

read.csv でカンマ区切りのCSVファイルを読み込んだ後、ある特定の文字列から始まる(たとえば"hoge test")行数まで読み飛ばす方法はありませんか?
この行数はファイルによって異なるため、read.csvのskip=xxxでは対応できず、困っております。
ご教授いただければ幸いです。

  • いったん全部読み込んでから、"hoge test"で始まる行より前を削除するのではダメですか?
    data <- read.csv("csvfile.csv")
    data <- data[which(data[,1] == "hoge test"):nrow(data),]
    とか -- 2011-10-23 (日) 07:32:05
  •  ありがとうございます、その方法で試したところ、読み込みのときにカンマ区切りと改行が崩れて変になってしまいます。
    そのためなんとかスキップで処理したいのですが、ほかの方法が思いつきません。 CSVファイルを添付いたしますので、他の方法か回避する方法を教えて頂けると幸いです。
    添付のCSVでは"Well"以下をデータフレームとして取り出そうとしています。-- nya? 2011-10-23 (日) 08:06:43
  • 追記です。以下のスクリプトを組んでみましたが、
    Windows 7 64bit Professional R version 2.13.2 (2011-09-30) Platform: x86_64-pc-mingw32/x64 (64-bit)
    では作動したのですが、
    Ubuntu 10.04 Lucid 64bit R version 2.13.2 (2011-09-30) Platform: x86_64-pc-linux-gnu (64-bit)
    では作動しませんでした。(なにも出力しない)
    追加のプラグインなどは導入しておりません。
    実際に動かす環境はUbuntu上で解決できない為、困っております。
    x <- "csvfile.csv"
    table <- read.table(x, sep="\n", header=F)
    c <- grep("Well", table$V1) - 1
    read.table(x, sep = ",", header = T, skip = c)
    どうかよろしくお願いします。 -- nya? 2011-10-23 (日) 09:57:06
  • Ubuntu 11.04上のR 2.12.1では、そのスクリプトでちゃんと動作しましたが。なにか、ファイル名を間違われたりとか、作業ディレクトリが違うとか、そういう類のミスはされてません? -- 2011-10-23 (日) 10:50:04
  • 大変お騒がせしました。
    読み込み元のCSVを確認したところ csvデータのインポート とおなじ現象が起こっていたため、
    x <- "csvfile.csv"
    table <- read.table(x, sep="\n", header=F, blank.lines.skip = F, fill = T)
    c <- grep("Well", table$V1) - 1
    read.table(x, sep = ",", header = T, skip = c, blank.lines.skip = F, fill = T)
    とすることで解決しました。
    名無しのおふたり方、どうもありがとうございました。 -- nya? 2011-10-23 (日) 11:19:00
  • 読み飛ばす部分が必ずしも読み込む部分と同じフィールド数であるとは限らないのと,読み込む部分は read.csv で読むのが妥当(余分な指定をしなくても済む。そのための read.csv なのだから)。また,Excel のだめだめ仕様で,最終行が改行を含まないので,「In readLines(x) : 'test.csv' で不完全な最終行が見つかりました 」というエラーメッセージが出てしまうけど,無視しましょう。 -- 河童の屁は,河童にあらず,屁である。? 2011-10-23 (日) 20:00:15
    x <- "test.csv"
    table <- readLines(x)
    c <- grep("Well", table) - 1
    read.csv(x, skip = c, blank.lines.skip = FALSE)
  • 河童の屁は,河童にあらず,屁である。様の方がシンプルで明解です、有難うございました。 -- nya? 2011-10-24 (月) 12:45:15
  • realtimePCRの出力形式は定型じゃないのかな?grepせずともskipは決まらない? -- akira? 2011-10-26 (水) 23:12:35

複数のブロック行列

複数のブロック行列? (2011-10-18 (火) 22:35:10)

A = (3,7,4,6,...,)のような列ベクトルがあり、I[N*N]を単位行列としたとき、B = (I[3*3], I[7*7], I[4*4], I[6*6], ...)のような、Aの要素を次元とするブロック対角行列Bを作成したいのですが、方法が分からず苦慮しております。
ご教授願えませんでしょうか。

  • diagという対角行列を作る関数がありますよ。 -- Iona? 2011-10-19 (水) 04:28:40
  • ありがとうございます。ご指摘いただいた方法で、mlist <- list(diag(1,A[3]),diag(1,A[7]), ....) としてbdiag(mlist)でできそうなのですが、Aが大きいときに、listに追加していくような方法はありますでしょうか。 -- 複数のブロック行列? 2011-10-19 (水) 09:38:48
  • 単位行列は diag(1, 3) のようにしなくても,diag(3) でできますよ。
    また,A の 1 番目の要素の大きさの単位行列をつくるのに (diag(1,A[3]) だと A の 3 番目の要素の大きさの単位行列ということになるので,間違いですよね。A[1] にしないと。
    とにもかくにも,A がどんなに長くても,単位行列のリストを作るのは lapply(A, diag) だけでできてしまいますよ。
    A <- c(3, 7, 4, 6)
    (mlist <- list(diag(1, A[1]), diag(1, A[2]), diag(1, A[3]), diag(1, A[4])))
    lapply(A, diag)
    結果を比較すると同じものができるのが分かるでしょう。
    しかし,bdiag というのは Matrix パッケージにある関数でしょうかねえ?
    例えば,3, 7, 4, 6, の単位行列のブロック対角行列というのは,20×20の対角行列に過ぎないんじゃない?つまり diag(20) だけでできてしまう。
    A の情報を使うなら diag(sum(A)) でよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2011-10-19 (水) 13:39:18
  • ありがとうございました。lapply(A, diag)でできまして、感謝申し上げます。例がまぎらわしく、申し訳ありません。例えば、I がN*Nの、要素を1とする行列とすると、このように簡単にはいかないでしょうか。 -- 2011-10-19 (水) 15:36:53
  • > I がN*Nの、要素を1とする行列
    単位行列というから,おかしいなあと思っていたわけです
    すべての要素が1である N×N 正方行列ですか。
    A <- c(3, 7, 4, 6)
    mlist <- lapply(A, function(N) matrix(1, N, N)) # このようにする
    library(Matrix)
    bdiag(mlist)
    のようにすればよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2011-10-19 (水) 16:52:55
  • お陰さまでうまくゆきました。有難うございました。 -- 複数のブロック行列? 2011-10-19 (水) 17:26:38

t検定に関して

tau? (2011-10-17 (月) 22:09:13)

R 2.13.1を使用しております。

下記のようにt.testを行いました。

> group1
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16]
[1,]   15   12   12   14   14   12   16   11   19    18    15    11    10     9     7    15
[2,]   14   16   12    9   14   16   14   11   11     6     7    11    16    12     9     9
[3,]   16   10   11   16   20   20   16   18   17    16    12     8    14    12    17    10
> group2
    [,1] [,2] [,3] [,4]
[1,]   18   19   12   16
> group3
    [,1] [,2] [,3] [,4]
[1,]   14   17   17   15
> group4
    [,1] [,2] [,3] [,4]
[1,]   13   19   11   17
> t.test(group1,group2,var.equal=F)
       Welch Two Sample t-test
data:  group1 and group2 
t = -1.9197, df = 3.667, p-value = 0.1337
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval:
-7.810966  1.560966 
sample estimates:
mean of x mean of y 
  13.125    16.250 
> t.test(group1,group3,var.equal=F)
       Welch Two Sample t-test
data:  group1 and group3 
t = -2.9049, df = 6.241, p-value = 0.02597
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval:~
-4.8156168 -0.4343832 
sample estimates:
mean of x mean of y 
  13.125    15.750 
> t.test(group1,group4,var.equal=F)
       Welch Two Sample t-test
data:  group1 and group4 
t = -0.9899, df = 3.474, p-value = 0.3861
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval:~
-7.463495  3.713495 
sample estimates:
mean of x mean of y 
  13.125    15.000 


group1とgroup2,3,4の平均値を比較していますが、group2とgroup4の平均値の中間の値を取るgroup3でのみP値が小さくなるのはなぜでしょうか?
ご教示頂ければ幸いです。

  • group3の分散が小さいからだと思います。 -- 2011-10-17 (月) 22:37:19
  • 名無しさんさんの仰るとおりですね,データを図示してみると明らかというか。 -- 河童の屁は,河童にあらず,屁である。? 2011-10-17 (月) 23:11:58
    diff2.png
  • 皆様、ご回答頂き誠にありがとうございました。 -- tau? 2011-10-18 (火) 14:11:52

複数回答の処理

pp? (2011-10-13 (木) 15:34:41)

こんにちは。
複数回答のアンケートを作って読み込んだところ、下記のように表示されます。(データフレーム)

> data

1     にんじん,たまねぎ
2     にんじん
3     にんじん,たまねぎ,じゃがいも

これをtable(data)とすると上記がそのまま出てしまいますが、

にんじん 3
たまねぎ   2
じゃがいも 1

とするような方法はないでしょうか。(文字をカンマで分割したい)

初心者で恐縮ですが、ご回答いただけますと幸いです。

  • 以下のようにでも
    > table(unlist(strsplit(as.character(data[,1]), ",")))
     じゃがいも   たまねぎ   にんじん
              1          2          3
    内側の as.character は,データを読み込むときに文字列が factor にならないようにしておけば不要。 -- 河童の屁は,河童にあらず,屁である。? 2011-10-13 (木) 16:08:04
  • できました!ありがとうございます!!! -- pp? 2011-10-13 (木) 20:02:55

入力された変数名を文字列に変換

Minako? (2011-10-12 (水) 08:31:41)

はじめまして。R初心者(31歳前田敦子似)です。
データフレームのhogeという変数名を入力すると、その変数のサマリーや検定結果などをresult.txtという名前のファイルに保存する関数を作ろうと思ってます。計算結果の前に、どの変数について調べたか記載したいので、
あるデータフレームに年齢が入力されたageという変数名があるときに、ageage(x)という関数

ageage(x)<-function(x) {
m<-sprintf("title\t%s\n",x)
cat(m,file="result.txt",append=T)
}

を作って、result.txtに、title age と表示させたいです。
ところがこれでageage(age)を実行すると

title  50
title  54
title  76

などとageが年齢を含んだベクトルとして理解されて、全部記載されてしまいます。関数のxに入力された変数名を文字列として取得するためにはどのようにすればよいでしょうか??

  • deparse と substitute を使います。(プログラムは,<- の前後や , の後に空白を置くなどしないと読みにくいですよ) -- 河童の屁は,河童にあらず,屁である。? 2011-10-12 (水) 10:14:40
    > d <- data.frame(age=c(50, 54, 76), sex=c("male", "female", NA))
    > deparse(substitute(d$age))
    [1] "d$age"
    > attach(d)
    > deparse(substitute(age))
    [1] "age"
    > ageage <- function(x) {
    +     m <- sprintf("title\t%s\n", x)
    +     cat(m, file="result.txt", append=T)
    + }
    > ageage(d$age)
    > ageage(age)
  • 屁さんありがとうございます。うまく変数名の文字列になりました。help(substitute)をよく読んでみます。 -- Minako? 2011-10-12 (水) 18:51:15
  • 一般的に言えば,あなたがやっていることはあまりお勧めではない。なぜかというと,分析対象が多い場合(数百数千の場合),毎回の分析で変数名(列名)を指定するのは面倒くさいこと限りなし。「データフレームの,何番目から何番目と,何番と,何番目から何番目...」などという指定法がましかなあと思うわけで(まあ,列数が数百数千でなくてもネ)。
    そんな場合には,集計関数には「何番目の変数」という情報を渡して,関数側では「何番目の変数の名前はなんだ?」というのをcolnames(データフレーム,列番号)で取り出して,分析を「データフレーム[,何番目]に対して行えばよいということ。 -- 河童の屁は,河童にあらず,屁である。? 2011-10-12 (水) 20:51:53
    func <- function(data.frame, vector)
    {
    	for (i in vector) {
    		variable.name <- colnames(data.frame)[i]
    		values <- data.frame[,i]
    		cat("variable=", variable.name, "  n=", length(values),   
                       "  mean=", mean=mean(values, na.rm=TRUE), 
                       "  s d=", sd=sd(values, na.rm=TRUE), "\n")
    	} 
    }
    と定義しておけば,以下のようになるだろうと言うこと(まあ,趣味の問題かも知れないけど)
    > func(iris, 1:4)
    variable= Sepal.Length   n= 150   mean= 5.843333   sd= 0.8280661 
    variable= Sepal.Width   n= 150   mean= 3.057333   sd= 0.4358663 
    variable= Petal.Length   n= 150   mean= 3.758   sd= 1.765298 
    variable= Petal.Width   n= 150   mean= 1.199333   sd= 0.7622377 

1秒以下の扱いについて

tx? (2011-10-11 (火) 11:00:45)

プレートリーダーが出力する以下のようなフォーマットのエクセルファイルから、Rへのデータの読み込みを試みておりますが、

Plate	Repeat	Well	Type	Time	Luciferase (CPS)	Time	 Luciferase (CPS)
1	1	A01	M	00:00:06.80	53530	00:02:38.05	47900
1	1	A02	M	00:00:07.07	107230	00:02:38.31	94150
1	1	A03	M	00:00:07.34	103510	00:02:38.58	95070


取り込むと、一秒以下の部分が削られてしまいました。
読み込みにはこちらのサイトに書かれていた方法を用いました。

> library(RODBC)
> sheet <- odbcConnect("Excel Files")
> tab <- sqlQuery(sheet, "select * from [List ; Plates 1 - 1$]")
> t <- as.numeric(difftime(tab[,7], tab[,5], units="secs"))
> t[1]
[1] 152


コンマ秒の部分を扱う方法を教えていただけると嬉しいのですが、
どうぞよろしくお願い致します。

  • あなたの OS は? R のバージョンは? 以下の結果はどのようになりますか? -- 河童の屁は,河童にあらず,屁である。? 2011-10-11 (火) 13:47:03
    > (x <- difftime("2011-10-11 00:02:38.05 JST", "2011-10-11 00:00:06.80 JST", units="secs"))
    Time difference of 151.25 secs
    > as.numeric(x)
    [1] 151.25
  • 河童の屁は,河童にあらず,屁である。様。ご回答いただきありがとうございます。Verは2.13.2です。上式を試したところ私の環境でも151.25となりました。中段の式中のtab[1,5]を表示すると、[1] "1899-12-30 00:00:06 CST" となることから、sqlQuery()の段階で値が削られているようです。上手に変換をする方法等がございましたら、御教授いただけると嬉しく思います。 -- tx? 2011-10-11 (火) 14:22:31
  • help(DateTimeClasses?) はご覧になりましたか?(Sub-second Accuracy のところ) -- 2011-10-11 (火) 14:53:59
  • ODBCは使えないので試していませんが、sqlQueryの引数にas.is = TRUEを追加してみるとどうなりますか? 恐らく文字列データとして読み込まれるはずです。 -- Iona? 2011-10-12 (水) 21:01:35
  • "" 様ありがとうございます。 Sub-secondを扱えるのですね。詳しく読んでみます。 -- tx? 2011-10-14 (金) 05:03:54
  • Iona様ありがとうございます。as.is = TRUEを試したところ、文字形式になりました。が、"1899-12-30 00:00:06"となりすでに小数点が削られておりました。あと一歩の所まで来ている感じなんですが。ありがとうございます。 -- tx? 2011-10-14 (金) 05:10:01
  • そこで既に削られているとなるとちょっとわからないですね。ODBCを使わなくてもいいならもっと簡単なんですが。 -- Iona? 2011-10-16 (日) 23:22:54
  • Ionaさんが指摘されるとおり、ODBCの縛りを一度解いて検討されてはどうでしょうか。xlsかxlsxかによってアプローチは異なるでしょうが、前者なら別パッケージのExcelファイルを読み込む関数を使うとか、system("xls2csv ...")でCSVとして読み込むとか、後者ならunzip()またはzip.file.extract()でxlsxを展開してxmlとして読み込むとか。 -- 2011-10-17 (月) 14:29:10
  • 御返事ありがとうございます。ODBCを使わない方法を検討してみたいと思います。 -- tx? 2011-10-28 (金) 06:42:40
  • ODBCを使わないならgdataパッケージのread.xls関数が一番使い勝手がよかったと思います。xlsxでも読み込めたはずです。 -- Iona? 2011-10-28 (金) 07:00:19

時間差の計算について

tx? (2011-10-11 (火) 07:18:37)

POSIXct形式の時刻の差を使って乗除計算をしたいのですが、defftimeの値を使っての割り算をRは認めてくれません。"difftime"オブジェクトを数値の配列に変換する方法、または他の方法での時間差の計算法がありましたら御教授いただけませんでしょうか。どうぞよろしくお願い致します。

  • 人に聞くより help(difftime) -- 2011-10-11 (火) 07:27:49
  • ありがとうございます -- tx? 2011-10-11 (火) 10:49:21

GIF形式での保存

tetora? (2011-10-10 (月) 00:22:25)

既出でしたらすみません。Rの出力をGIF形式で保存したいのですが、デフォルトでGIF出力する関数が見当たりませんでした。こちらのページを参照すると、パッケージでもGIF形式での保存に対応したものはないようなのですが、どうしてもGIF形式で保存したい場合は、一度別の形式(jpeg,pngなど)で保存した後、外部のプログラムで形式変換するしか方法はないのでしょうか?

  • GDD というライブラリがあるようですけど。http://www.rforge.net/GDD/files/
    まあ,今時なぜ「GIFファイルにこだわる」必要があるのかよく分かりませんし(GIFファイルのメリットなんて何がありますか?),必要なら貴方の言うように外部プログラムで変換すれば良いだけ。Rでシームレスに操作したいなら,system 関数なんかを使って,体感的にはシームレスということにしてしまえばそれでおしまいでしょう(終わってる)。 -- 河童の屁は,河童にあらず,屁である。? 2011-10-10 (月) 08:15:15
  • ありがとうございます。私も通常はGIFファイルを扱わないのですが、GUI作成に使用しているTcl/Tkが、デフォルトだとJPEGやPNGを読み込めなかったため、できれば画像をGIF形式で出力できないかと考えていました。 -- tetora? 2011-10-11 (火) 09:32:11
  • こことかを見ると、jpgを使っているようですが、gif縛りなんてありましたっけ?Tkのビルドインコマンドマニュアルを見ても、そのように見えませんが。 -- 2011-10-11 (火) 11:46:56
  • 説明が足りませんでしたが、Rは作図のみでGUI作成にはRuby/Tkを使っていました。そのRubyスクリプト中で、Tkの拡張ライブラリ(tkextlib/tkimg/jpeg,png)を呼び出せば、jpg,pngなども読み込めるのですが、tkの呼び出しだけだとGIF等の限られた形式しか扱えない、ということでした。なのでGIF形式で出力してそのまま扱えれば楽かなと思ったのですが、素直に拡張ライブラリを呼び出してpng形式等を使っていくことにします。 リンクで示していただいた方法については、扱ったことがないので間違っているかもしれませんが、5行目の"tclRequire("Img")がtkの拡張ライブラリ呼び出しに対応しているのではないかと思います。 -- tetora? 2011-10-11 (火) 12:18:56
  • 一応png関数の中身の"png"を"gif"に書き変えてexportされてないオブジェクト(checkIntFormat?, .X11env, CQuarts)の前にgrDevices:::を追加すれば出力はできますよ。 -- Iona? 2011-10-12 (水) 21:04:11

image関数の分解能

まつだ? (2011-10-07 (金) 15:32:59)

image関数を使って、1または0のバイナリデータの表示を試みているのですが、データ量が多い時にうまく表示できずに困っています。

例えば、以下のようなデータを作ります。

x <- c(rep(0, 30000), 1, rep(0, 19999))

これをimage関数を使って表記するために以下を実行します。

m <- matrix(x, nrow=50000, ncol=2)
par(mfrow=c(2,1)) # plot関数との表示比較のため
image(m, col=c("white", "black"))
plot(1:nrow(m), m[,1], type="l")

plot関数では、50000データの中に1つだけある1のデータを表記できているようですが、image関数ではそれが消えてしまいます。

このようなときに、皆さんはどのように対処なされていますでしょうか。
ご教授いただければ幸いです。

ちなみに、以下くらいのデータであれば問題はないようです。

x <- c(rep(0, 300), 1, rep(0, 199))
m <- matrix(x, nrow=500, ncol=2)
par(mfrow=c(2, 1))
image(m, col=c("white", "black"))
plot(1:nrow(m), m[,1], type="l")

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

  • image 関数の分解能ではなく,あなたが設定したグラフィックデバイスの分解能が不足しているだけです。
    あなたの環境で,ピクセル数を指定せずに plot または image を使って表示されるグラフの実際のピクセル数は幾つですか?モニター上に表示したのなら分解能はまるっきり足りないでしょう。image は白と黒で塗り分けるので,1ピクセル以下の黒は後の白で部分的に塗りつぶされるでしょう。
    image(m, col=c("red", "black")) とすると,黒が描かれないのではなく赤が描かれる(塗りつぶされる)のだということが,よくわかるでしょう。
    完全に塗りつぶされるのではないので,グラフィックデバイスのピクセルとの関係で,飛び飛びに描画されることもある。
    もし pdf ファイルに描くとすれば,たとえその画像のサイズは小さくても,保存してから再度読み出し,拡大すればちゃんと黒線が描かれているのが分かります。
    6400×576のpdfファイルに描いて,全部は示せないので一部分を原寸大表示すると添付のようになります。色がうすいのはやはり,後に続く白で部分的に塗りつぶされるからでしょう。
    plot は黒で描くだけだから,後のデータのせいで塗りつぶされることはない。plot ではスパイクみたいに描かれるのがいやだということなら,該当箇所に垂直線を書くようにすればよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2011-10-07 (金) 17:41:08
    plot(1:nrow(m), m[,1], type="l") # あなたのプログラムだとスパイク状に描画される
    plot(1:nrow(m), m[,1], type="n")
    segments(1:nrow(m), 0, 1:nrow(m), m[,1]) # 垂直線を描く
    image.png
  • 河童の屁は,河童にあらず,屁である。様 早速のご教授ありがとうございます。PCのピクセル数という問題があるのですね。

    > あなたの環境で,ピクセル数を指定せずに plot または image を使って表示されるグラフの実際のピクセル数は幾つですか?
    大変申し訳ありませんが、自分のPCの環境をちゃんと把握しておらず、即答できません。 何とか調べてお答えしたいと思いますが、当面ピクセル数の問題として、plotで対応できるように試みたいと思います。

    > plot ではピークみたいに書かれるのがいやだということなら,該当箇所に垂直線を書くようにすればよいでしょう。
    ご提案ありがとうございます。plotでの表示を試みているのですが、実際のデータは17280行×183列のデータで、各行で異なる値の数列が含まれています。imageで表示する際のy軸は時系列として表示しています。データ量は違いますが、最近投稿された質問のケースとよく似ており、以下の投稿と質問を参考に作図しておりました。
    image における時系列軸の反転 http://www.okada.jp.org/RWiki/?%A3%D1%A1%F5%A3%C1%20%28%BD%E9%B5%E9%BC%D4%A5%B3%A1%BC%A5%B9%29%2F13#m560db05
    ごちゃごちゃしていて、大変申し訳ありませんが、大体以下のようなコードで描いております。

    st <- c("2008/12/19", "2009/3/24")
    st <- strptime(st, "%Y/%m/%d", tz="")
    y.days <- seq(st[1], st[2], by="1 day")
    x.hours <- seq(0, 48, length=3600*48/10) 
    
    m <- matrix(sample(c(0, 1), (3600*48/10)*length(y.days), rep=T, prob=c(10, 1)),
                17280, length(y.days))
    
    par(oma=c(2, 1.5, 1, 1))
    
    y.lim <- c("2008/12/17", "2009/3/26")
    y.lim <- strptime(y.lim, "%Y/%m/%d", tz="")
    image(x.hours, y.days, m, col=c("white", "black"), yaxt="n", xaxp=c(0, 48, 4),
          xlab="hours", ylab=NA,
          xlim=c(-0.1, 48), ylim=c(as.numeric(y.lim[2]), as.numeric(y.lim[1])))
    
    y.gr <- c("2008/12/18 12", "2009/3/24 12")
    y.gr <- strptime(y.gr, "%Y/%m/%d %H", tz="")
    y.gr <- seq(y.gr[1], y.gr[2], by="1 days")
    abline(h=y.gr, col="gray")
    
    axis(2, at=as.numeric(y.days[(1:4)*20]), labels=as.character(y.days[(1:4)*20],
         format="%Y/%m/%d"), las=2)
    これを、plotを使って再現するにはどのようにすればよいのか、いいアイデアが浮かびません。 作図は、アイデア次第で色々な図が描けると承知しているのですが、 まだまだRの関数の知識も圧倒的に少く、どのようにして描いていいものか困っております。 自分の勉強不足は十分承知しておりますが、もし、教えても構わないという方がいらっしゃいましたら、 ご教授いただけると幸いです。 -- まつだ? 2011-10-07 (金) 18:39:08
  • 河童の屁は,河童にあらず,屁である。様 投稿のタイミング重なってしまったようで、申し訳ありません。 しかも、投稿の整形がひどく見にくくなってしまいました。 投稿の書式を読んでみるのですが、わからない用語ばかりで戸惑っています。 本当に申し訳ありません。 PDFへの出力、再読み込みの例は非常にわかりやすくて、理解が進みました。大変感謝いたします。 -- まつだ? 2011-10-07 (金) 18:45:58
  • plot()でtype="n"を指定して、描画領域(座標)を確保した後に、segments()で線分をpolygon()で四角を描画すればよいだけのことでは。 -- 2011-10-07 (金) 20:59:17
  • 皆さんにヒントをいただいているのですが、どうにもうまくいきません。segments()やpolygon()を使えばいいということなのですが、いまだ描写できていません。ベクトルとしてのプロットならばうまくいくのですが、行列になるとわけがわからくなっています。よろしければ、もう少しヒントをいただけないでしょうか。 -- まつだ? 2011-10-07 (金) 22:30:24
  • pdfやpngに書き出してから拡大して見ればいいと思うのですが。 -- Iona? 2011-10-08 (土) 20:45:12
    png(, length(x1), length(y1))
    par(mar = c(0, 0, 0, 0))
    image(x.hours, y.days, m, col = c("white", "black"))
    dev.off()
    プロットを使いたいならこんな感じでどうでしょう。
    x <- x.hours[matrix(1:length(x.hours), length(x.hours), length(y.days))[m == 1]]
    y <- y.days[matrix(1:length(y.days), length(x.hours), length(y.days), byrow = TRUE)[m == 1]]
    plot(x, y, pch = 20, cex = 1) # 真っ黒になるときはcex = 1の値を小さくしてみる。
    ちなみに、wikiで">"(半角)を行頭に書きたいときはチルダを入れて"~>"としてください。
  • Iona様、皆様、いろいろご教授ありがとうございました。作図の件ですが、一つアイディアが浮かびました。以下のループを使ってプロットできました。
    for(i in 1:ncol(m)){
    segments(x.hours[m[,i]==1], y.days[i], x.hours[m[,i]==1], y.days[i+1]) 
    }
    ループを作図に使うという発想はこれまでありませんでしたが、試行錯誤しているうちに思いつきました。まだまだ勉強することがたくさんありますが、今回の件はすごくためになりました。ありがとうございました。-- まつだ? 2011-10-09 (日) 00:42:13
  • segments の引数はベクトル可なので,for を使う必要はないですね(for だと遅くなる)。あなたのプログラムを生かして segments で書くと以下のようになるかな。 -- 河童の屁は,河童にあらず,屁である。? 2011-10-09 (日) 09:47:24
    st <- c("2008/12/19", "2009/3/24")
    st <- strptime(st, "%Y/%m/%d", tz="")
    y.days <- seq(st[1], st[2], by="1 day")
    x.hours <- seq(0, 48, length=3600*48/10) 
    
    m <- matrix(sample(c(0, 1), (3600*48/10)*length(y.days), rep=T, prob=c(10, 1)),
                17280, length(y.days))
    
    par(oma=c(2, 1.5, 1, 1))
    
    y.lim <- c("2008/12/17", "2009/3/26")
    y.lim <- strptime(y.lim, "%Y/%m/%d", tz="")
    plot(c(-0.1, 48), c(as.numeric(y.lim[2]), as.numeric(y.lim[1])), type="n",
         yaxt="n", ylab="")
    y.days2 <- rep(y.days, each=17280)[m==1]
    x.hours2 <- rep(x.hours, 96)[m==1]
    mk <- diff(y.days)[1]
    segments(x.hours2, y.days2, x.hours2, y.days2+mk)
    y.gr <- c("2008/12/18 12", "2009/3/24 12")
    y.gr <- strptime(y.gr, "%Y/%m/%d %H", tz="")
    y.gr <- seq(y.gr[1], y.gr[2], by="1 days")
    abline(h=y.gr+mk/2, col="gray")
    
    axis(2, at=as.numeric(y.days[(1:4)*20]), labels=as.character(y.days[(1:4)*20],
         format="%Y/%m/%d"), las=2)
  • 河童の屁は,河童にあらず,屁である。様 更なるご教授をありがとうございません。本当にまだまだ勉強しなけれいけないことばかりです。工夫と関数の知識があれば、こういった書き方もできるのですね。さらにforループを避けることで、遅くなることを避けることもできるのですね。本当に勉強になりました -- まつだ? 2011-10-13 (木) 02:26:28

2要素ずつのマッチング (forループを使わないで)

shannon? (2011-10-05 (水) 18:38:21)

質問のタイトルが不適当かもしれませんが、よろしくお願いします。

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

上のような"0"と"1"が並んでいるベクトル(a)に対して、

a2 <- c(0, 1, 1, 0, 1, 0)

"0"が2つ以上ならんでいる部分を削除して、"1"の前後にそれぞれ"0"が1つだけ入るように(a2)したいのですが、forループを使って

a2 <- 0
for (i in 1:9) {
   if (a[i]==0 && a[i+1]==0) next
   a2 <- c(a2, a[i+1])
}

のようにすると、ベクトルの要素数が膨大になった場合にかなり時間がかかってしまいます。
そこで0が2つ並んでいる要素番号(上記のaでいえば、要素番号1,5,6,9)に、FALSEを当てはめたような、論理ベクトル(a3)を作成して、下のように計算したいのですが、方法が分からず悩んでいます。forループを使わずに、a3のようなベクトルを作るにはどうしたらよいのでしょうか。もしくは別の方法でa2を作りだす良い方法はないでしょうか。分かりにくい質問で申し訳ないですが、ご教授お願いします。

> a3 <- c(FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,TRUE,TRUE,FALSE,TRUE)
> a2 <- a[a3]
> a2
[1] 0 1 1 0 1 0
  • with(rle(a), rep(values, ifelse(values == 1, lengths, 1))) で。 -- 2011-10-05 (水) 21:12:19
  • ご返答ありがとうございました。関数"rle"がまさに探していたものでした。また、with関数も使用したことがなかったので、大変参考になりました。例示していただいた命令文の方がシンプルかもしれませんが、私の方でもサンプルを示しておきます。-- shannon? 2011-10-06 (木) 09:43:54
    b <- rle(a)
    b$lengths[which(b$values==0)] = 1
    a2 <- inverse.rle(b)

軸の入れ替えについて

afromonkey? (2011-10-05 (水) 16:26:51)

統計ソフトRで、横軸をy軸、縦軸をx軸にして線グラフやヒストグラムを描くには、どうすればよいのでしょうか。
barplot関数の場合は引数に horiz = T を与えればよいということが分かったのですが、 plot や hist などの他の関数についてはどのように設定すればよいでしょうか。
よろしくお願いします。

  • plot(x, y) の代わりに plot(y, x) でいかかでしょう? -- 里見聡美? 2011-10-05 (水) 22:37:00
  • 言葉足らずで失礼しました。私が意図しているのは、たとえばヒストグラムについていえば、それぞれの棒が縦棒ではなく横棒になっているようなものです。すなわち、身長のヒストグラムを描くとする場合、縦軸に身長、横軸に頻度がくるようなヒストグラムです。線グラフについても同様のものを描きたいと思っています。 -- afrooooomonkey? 2011-10-06 (木) 01:00:14
  • はい。 -- 里見聡美? 2011-10-06 (木) 07:46:02
    set.seed(10); x <- rnorm(100)
    hi <- hist(x, plot=F)
    plot(0, 0, xlim=range(hi$counts), ylim=range(hi$breaks), type='n',
         xlab='', ylab='', las=1, bty='L')
    for(i in seq(length(hi$counts))) {
      rect(0, hi$breaks[i], hi$counts[i], hi$breaks[i+1], col=grey(0.8),  
           border=grey(0.7))
    }
    box(bty='L')
  • 簡単にしてみました。 -- Iona? 2011-10-08 (土) 11:06:00
    set.seed(10); x <- rnorm(100)
    h <- hist(x, plot = FALSE)
    barplot(h$counts, space = 0, horiz = TRUE)
    plot.window(xlim = range(h$counts), ylim = range(h$breaks))
    axis(2)
    ところで、線グラフについては里見さんがおっしゃってるようにplot(y, x)で十分だと思うのですが、それでは駄目なんですか?

R ver 2.13.1以降 Rコマンダーで不正なマルチバイト文字エラー

365? (2011-10-04 (火) 22:28:06)

Rの2.13.1以降でRコマンダーで2バイト文字のファイル名などを使用すると不正なマルチバイト文字があるというエラーが出ます。
Rconsoleでは当該ファイル名は認識され、データもロードできますので、Rコマンダーの方の問題かと思うのですが原因がよくわかりません。過去に同様な投稿も見つけられませんでした。
また、R2.13.0以前では同様なエラーは出ませんでした。
OSはwindowsXP sp3、RcmdrはそれぞれのRバージョンで更新しています。
バージョンアップが出来ずに困っています。どなたかお心当たりのある方、ご教授下さい。

  • 補足ですが、ファイルのロードで -- 365? 2011-10-04 (火) 22:34:54
  • load("C:/Documents and Settings/dad/デスクトップ/二バイト文字.rda") を実行するとメッセージ欄に 「<87><e3><82>ケ繧ッ繝医ャ繝<97>/莠後ヰ繧、繝域枚蟄<97>.rda")に不正なマルチバイト文字があります」となります -- 365? 2011-10-04 (火) 22:36:34
  • >2バイト文字のファイル名などを使用すると不正なマルチバイト文字があるというエラーが出ます
    2バイト文字のファイル名を使わなければ良いだけのことでは?
    何,贅沢言っているんだろうかと思うだけですけど? -- 河童の屁は,河童にあらず,屁である。? 2011-10-04 (火) 22:47:05
  • A<-"文字"  を実行すると 「エラー: NA」となります -- 365? 2011-10-04 (火) 22:51:49
  • 漢字交じりのファイル名は内容が判りやすいと思いますが、贅沢でしょうかねえ -- 365? 2011-10-04 (火) 23:03:41
  • どうも漢字によって「NA」になったり「不正なマルチバイト文字」エラーになったり、問題なかったりしますし、#以降のコメントでも文字によってエラーになるようです。 「#行数」はよくて「#行」はエラーなど、データやスクリプトの中にも2バイト文字は使えないということのようです。 -- 365? 2011-10-04 (火) 23:34:17
  • Sys.setlocale(locale = "ja_JP.UTF-8")かoptions(encoding = "UTF-8")は試してみました?
    Rcmdrは使ったことがありませんが、その問題はUTF-8で書かれたものをShiftJISで読み込もうとして起きる問題なのでこのあたりで解決するかもしれないです。 -- Iona? 2011-10-08 (土) 09:47:13
  • Iona様、ご示唆頂き有難うございます。その方法では解決いたしませんでした。遅くなり申し訳ありませんでした。 -- 365? 2011-10-14 (金) 22:21:56
  • こちらでも試してみましたが最新のRだとエラーになりますね。Rのバージョンを下げるか二バイト文字を使わないかのどちらかしかないと思います。いずれは対応してくれると思いますが。 -- Iona? 2011-10-19 (水) 18:50:09

パッケージの中身を書き換える

西田? (2011-10-01 (土) 15:48:10)

あるパッケージに含まれる動作を拡張して使いたいと思っています。
今まではlibrary()で読み込んだ後、関数等を書き換えていたのですが、今回拡張したい部分がどうやらC言語で書かれているようで(.Call)書き換え方がわかりません。
パッケージの中身を直接いじることができれば一度で済みますし、余計な不具合の原因にもならないと思い質問させて頂きました。どうかご教授ください。

  • パッケージによる部分があります。完全にオープンソースなパッケージなら(かつ、多分大丈夫だけどライセンス的に問題なければ)自分でいじることもできます。 -- 2011-10-04 (火) 00:24:09

類似度によって欠損値補完

tak? (2011-09-30 (金) 16:41:40)

下のような、縦方向にケース番号、横方向にデータ番号を配置した欠損値ありの行列(1)があるとします。(実際はケース数、データ数の種類がもっと多いものを使います。)

> data
       data1 data2 data3 data4  data5
case1     NA    10   100  1000  10000
case2      2    NA   200    NA  20000
case3      3    30   300  3000  30000
case4     NA    40    NA  4000     NA
case5      5    NA   500  5000  50000
case6      6    60   600    NA     NA
case7      7    70   700  7000  70000
case8     NA    80   800  8000     NA
case9      9    90    NA  9000  90000
case10    10    NA  1000 10000 100000

上の行列に対して、ケース毎の類似度を計算した行列(2)が下のようになります。(例えば1行2列は、case1のcase2との類似度です。『case1の、case2との類似度』と『case2の、case1との類似度』は同様に計算しているので対称行列になっています。)

> similarity
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,] 0.00 0.16 0.46 0.50 0.77 0.84 1.38 1.41 1.61  1.73
 [2,] 0.16 0.00 0.20 0.00 0.60 0.67 1.00 0.67 1.17  1.61
 [3,] 0.46 0.20 0.00 0.17 0.46 0.63 1.05 1.00 1.42  1.61
 [4,] 0.50 0.00 0.17 0.00 0.11 0.25 0.50 0.67 0.84  0.67
 [5,] 0.77 0.60 0.46 0.11 0.00 0.17 0.46 0.47 0.80  1.15
 [6,] 0.84 0.67 0.63 0.25 0.17 0.00 0.21 0.33 0.53  0.67
 [7,] 1.38 1.00 1.05 0.50 0.46 0.21 0.00 0.20 0.47  0.69
 [8,] 1.41 0.67 1.00 0.67 0.47 0.33 0.20 0.00 0.17  0.31
 [9,] 1.61 1.17 1.42 0.84 0.80 0.53 0.47 0.17 0.00  0.20
[10,] 1.73 1.61 1.61 0.67 1.15 0.67 0.69 0.31 0.20  0.00

そこで、行列(1)に存在する欠損値を類似度によって補完する処理を作成したいのですが、どのようにすればよいのか思いつかず困っています。

処理の内容は、欠損値補完対象のケース番号と類似度の高い上位k個のケース(但し、kは任意で、補完対象のデータと同じ番号のデータが欠損値であるケースは除く)の、同じ番号のデータの平均値を入れるようにします。

例えば(k=3の場合)、case1のdata1が欠損値になっていますが、case1と類似度の高い上位3ケースは、case10, case9, case8です。しかし、case8のdata1は欠損値なので、次に類似度の高いcase7を使って、case10, case9, case7のそれぞれのdata1である10,9,7の平均をとって、8.66を補完値とします。この処理を全ての欠損値に対して行います。

説明がわかりづらくて申し訳ありませんが、宜しくお願いします。

  • あまり凝ってもしょうがないので,for をバリバリ使って計算。
    正しいかどうか検証のこと。
    この線でよければ,徐々にベクトル計算に書き換える。
    十分速度が出ているならそのままでもよいし。 -- 河童の屁は,河童にあらず,屁である。? 2011-09-30 (金) 19:05:18
    n <- nrow(data)   # 列数
    m <- ncol(data)   # 行数
    suf <- integer(3) # 類似度が高いもの3つの添え字を入れる
    for (i in 1:n) {  # 各 case について
      for (j in 1:m) { # 各 data について
        if (is.na(data[i, j])) { # もし,欠損値なら,類似度によりランク付け
          # ties.method は average 以外ならどれでもよい?
          hi <- rank(similarity[1,], ties.method="first")
          # 類似度が高く,かつ,データが欠損値でない case の添え字を
          # suf に格納(3つまで)
          l <- 0           
          for (k in n:1) {
            if (!is.na(data[hi[k], j])) { # 欠損値でないなら
              l <- l+1              # カウンタを増やす
              suf[l] <- k           # 添え字を格納
              if (l == 3) break     # 3つ見つかったら脱出
            }
          }
          if (l == 3) {    # 3つないときには NA のままにする?
                           # (平均値でよいと思うけど)
             data[i, j] <- mean(data[hi[suf], j])
          }
        }
      }
    }
    実行結果
               data1 data2     data3 data4     data5
    case1   8.666667    10  100.0000  1000  10000.00
    case2   2.000000    80  200.0000  9000  20000.00
    case3   3.000000    30  300.0000  3000  30000.00
    case4   8.666667    40  833.3333  4000  86666.67
    case5   5.000000    80  500.0000  5000  50000.00
    case6   6.000000    60  600.0000  9000  86666.67
    case7   7.000000    70  700.0000  7000  70000.00
    case8   8.666667    80  800.0000  8000  86666.67
    case9   9.000000    90  833.3333  9000  90000.00
    case10 10.000000    80 1000.0000 10000 100000.00
  • 遅くなりました、ありがとうございます。 結果を確認してみたのですが、例えばcase8のdata1は、case8と類似度の高いケースは順に、case1, case3, case2, case4, case5, case6, ...となって、その中でdata1が欠損していない、case2, case3, case5のdata1である2, 3, 5の平均値である3.33が補完されるはずなのですが・・・? -- tak? 2011-10-03 (月) 11:34:12
  • 連投すみません、7行目を以下のように直したらイケました。まだ全部確認してないのでチェックしてみます。 -- tak? 2011-10-03 (月) 11:42:34
    hi <- rank(similarity[1,], ties.method="first") # 変更前
    hi <- rank(similarity[i,], ties.method="first") # 変更後
  • んー・・・うまくいかないですね・・・ -- tak? 2011-10-03 (月) 16:55:02
  • 平均値を入れてしまうと分散が小さくなってしまいませんか? library(Hmisc) ; ?aregImpute -- 里見聡美? 2011-10-03 (月) 23:26:24
  • 欠損値補完ならpackage miを使ってmultiple imputationしたらいいと思いますが…… -- 2011-10-04 (火) 22:51:46
  • 実は研究で欠損値処理の比較をやろうとしていて、過去の論文に挙げられてる処理法のプログラムをRで組もうとしているのです、、、 -- tak? 2011-10-05 (水) 10:14:03
  • 以下のように、rank()関数でランク付けされたものを、ランクが高いものの添え字から順に入れていく(つまり、類似度の高いものから順に"ケース番号"を格納)して、それに従って各ケースを順に見ていくようにすれば上手くいきました。これをfor文使わずにもっと簡単にできないですかねぇ。 -- tak? 2011-10-05 (水) 14:13:14
    hi  <- rank(similarity[i,], ties.method="first")
    hi2 <- hi
    for (a in 1:max(hi)) {
    	for (b in 1:max(hi)) {
    		if (hi[b] == max(hi) + 1 - a) {
    			hi2[a] <- b
    			break
    		}
    	}
    }
  • rankの高い順にcase番号を取り出すにはorder(hi, decreasing = TRUE)という関数がありますよ。 -- Iona? 2011-10-08 (土) 22:38:18
    なんとなく凝ったものを1つ作ってみました。
    ifelse(is.na(data), t(apply(similarity, 2,
           function(i) apply(data[order(i, decreasing = TRUE), ], 2,
           function(x) mean(x[head(which(!is.na(x)), 3)])))), data)
              data1    data2     data3     data4     data5
    case1   8.666667 10.00000  100.0000  1000.000  10000.00
    case2   2.000000 73.33333  200.0000  8666.667  20000.00
    case3   3.000000 30.00000  300.0000  3000.000  30000.00
    case4   8.666667 40.00000  633.3333  4000.000  66666.67
    case5   5.000000 60.00000  500.0000  5000.000  50000.00
    case6   6.000000 60.00000  600.0000  4666.667  43333.33
    case7   7.000000 70.00000  700.0000  7000.000  70000.00
    case8   3.333333 80.00000  800.0000  8000.000  20000.00
    case9   9.000000 90.00000  200.0000  9000.000  90000.00
    case10 10.000000 36.66667 1000.0000 10000.000 100000.00

指定行へのジャンプ

ohno? (2011-09-30 (金) 15:37:38)

C言語などで使うgoto文のように、指定行へジャンプしたい時に使う関数はあるのでしょうか?
下の行へジャンプする場合は、以下のようにジャンプ先の命令文の前までをwhileなどの条件式で囲って途中でbreakすれば、一応はジャンプできますが、
この方法では上の行へジャンプする時が複雑になるので、なにか良い方法がないかと考えています。

while (1) {
    ...
    if (1) break
    ...
}
... #ここへジャンプ

良い方法がありましたらご教授お願いいたします。

  • そのような機能をは,たとえあったとしても使わないというのが共通理解でしょう。分かりやすくエレガントなプログラムを書くためには不要どころか害悪のみを持つということで,先進的なプログラミング言語はそのような機能(文)は持たないようです。そして,そのような機能がなくても問題なくプログラムが書けるようになっています。
    Rも同様で,そのような機能(文)はありません。行番号もないし文にラベルを付けることもできないので,そもそもジャンプ先を指定できません。また,while(1) や if(1) などを使って,goto文をシミュレートするのも,わかりにくいプログラムを書くことになるのでお勧めしません。 -- 河童の屁は,河童にあらず,屁である。? 2011-09-30 (金) 15:49:00
  • なるほど。ご返答ありがとうございました。goto文を使うのに慣れてしまっていたので不便に感じたのですが、確かにプログラムは分かりにくくなりますし、建設的な方法ではないかもしれません。ご丁寧な回答ありがとうございました。 -- ohno? 2011-10-01 (土) 13:32:32

文字列の何番目がマッチするかを調べる

do-san? (2011-09-29 (木) 15:30:24)

例えば、文字列"abcde"があったとして、文字パターン"d"にマッチするのが何番目かを調べるにはどうすればよいのでしょうか?(答えが4になる。)
文字列"abcde"を一文字ずつ分解・ベクトル化して、charmatchで調べる、というようなことをすればいいのでしょうか?

  • 例えば -- 2011-09-29 (木) 16:22:54
    > strsplit("abcdedcba","")[[1]]
    [1] "a" "b" "c" "d" "e" "d" "c" "b" "a"
    > which(strsplit("abcdedcba","")[[1]]=="d")
    [1] 4 6
  • regexpr("d", "abcde") -- 2011-09-29 (木) 16:47:29
  • ご回答ありがとうございました。2つ目のregexpr("d","abcde")[1] がよりシンプルですね。 -- do-san? 2011-09-29 (木) 17:40:06

名前のマッチの不具合

BCD? (2011-09-27 (火) 18:38:03)

時折、名前のマッチを行うと不具合が生じます。これは何故でしょうか? 今回起こった不具合までの経過は以下のようになります。どなたか解決法をご存知の方がいらっしゃれば教えていただけないでしょうか?

数値と値に対する名前が入っているベクトルA、ベクトルBがあります。

> AB <- c(names(A), names(B))   # 名前を取り出して一つのベクトルにします。
> CD <- AB[duplicated(AB)]   # 重複している名前を一つにする。
ここで以下のような行列xがあります。
V1には名前が入っていて、ベクトルAとベクトルBの名前は
この中に全て含まれています。
> x
      V1   V2
1  名前1   値
2  名前2   値
3  名前3   値
:
> x[x$V1 == CD, ] # CDの要素と行列xの名前とが
                    一致する行を取り出します。

これらを実行しても最後に名前が一致する行が取り出されないのです。この時エラーが出るのですが「長いオブジェクトの長さが短いオブジェクトの長さの倍数になっていません 」と表示されます。

  • つまり,x$V1 と CD の長さが違うのですよ。以下のようにでもすれば? -- 河童の屁は,河童にあらず,屁である。? 2011-09-27 (火) 18:44:50
    > CD <- c("foo", "bar", "baz")
    > (x <- data.frame(V1=c("abc", "foo", "zoo", "boo",
                            "baz", "yah", "bar"), V2=1:7))
       V1 V2
    1 abc  1
    2 foo  2
    3 zoo  3
    4 boo  4
    5 baz  5
    6 yah  6
    7 bar  7
    > x[x$V1 %in% CD,]
       V1 V2
    2 foo  2
    5 baz  5
    7 bar  7
  • どうもありがとうございます。下の問題のこともありこの方法を使うとうまく行きました。 -- BCD? 2011-09-27 (火) 19:57:30

ベクトルからのマッチした要素の除去

BCD? (2011-09-27 (火) 17:58:16)

c("水", "金", "地", "火", "木", ......) のようなベクトルがあります。
ここから c("水", "地", ....) を除いたベクトルを作りたいのですが、ifやforを使わずに簡単に行う方法はありますか?ご存知の方がいらっしゃいましたらどうか教えてください。

  • 条件を与えて部分集出する場合はsubset()を使います。この場合は、「"水"ではなく、かつ"地"でもない」が条件です。 -- 2011-09-27 (火) 18:04:36
  • 素早いreplyをどうもありがとうございました。duplicated関数は知っていたのですが、それの逆的な扱いをすることができるsubsetに関しては知りませんでした。勉強になります。 -- BCD? 2011-09-27 (火) 18:20:15
  • 除く要素が多い場合には以下のようなものも。 -- 河童の屁は,河童にあらず,屁である。? 2011-09-27 (火) 18:39:56
    a <- c("水", "金", "地", "火", "木", "土", "天", "海")
    b <- c("水", "地", "土")
    a[!a %in% b]

任意の形状でプロット

宗二? (2011-09-26 (月) 11:25:26)

plot関数を使用する際に、グラフィックスパラメータ"pch"で点の形を選択できますが、用意されている形状以外で、任意に点の形を変えることはできるのでしょうか。
具体的には、一点ごとに角度と長さの異なる矢印をプロットしたいのですが、良い方法がありますでしょうか。

  • arrowsで描くのが普通ではないでしょうか。 -- 2011-09-26 (月) 11:39:13
  • ご返答ありがとうございます。細かい話で申し訳ないのですが、例えばarrowsで描かれる矢印の先端(>)の角度等も自分でいじりたいのですが、それは難しいでしょうか。 -- 宗二? 2011-09-26 (月) 11:48:21
  • 「返し」部分の角度はangle引数、長さはlength引数でそれぞれ指定できますよ。 -- 2011-09-26 (月) 12:31:59
  • 重ねてありがとうございます。arrowsのヘルプをよく読んでいませんでした。失礼しました。教えていただいた方法で、目的の図は描けそうです。
    参考までに教えていただきたいのですが、自作のさらに複雑な図形(渦巻きなど)をプロットの点として扱う場合は、gridパッケージか何かを勉強すればいいのでしょうか? -- 宗二? 2011-09-26 (月) 13:26:38
  • うーん、どなたかgridパッケージなど使っておられる方、お答えいただけますか。わたし自身は、よっぽど複雑な図であっても、標準パッケージのlines・points・rectなどを使って描画する自作関数をつくるのが好きですね。どんな環境でも間違いなく動くし…gridとかきっと便利なのでしょうけど、結局は自分でつくったもののほうが融通が効くし、当然ながら自分に理解しやすいんですよね。 -- 2011-09-26 (月) 14:46:49
  • 複雑な図形を描く関数を作って,描画位置,サイズなどを指定してその関数を呼ぶ。 -- 河童の屁は,河童にあらず,屁である。? 2011-09-26 (月) 15:08:35
    spin <- function(x0, y0, factor=1, rotation=2)
    {
    	r <- seq(0.1, 1.0, length=100)*factor
    	theta <- seq(0, -rotation*2*pi, length=100)
    	x <- r*cos(theta)+x0
    	y <- r*sin(theta)+y0
    	lines(x, y)
    }
    plot(0:10, 0:10, type="n", axes=FALSE, xlab="", ylab="")
    spin(3, 5, 0.5)
    spin(5, 5, 1)
    spin(7, 5, 0.2)
    spin(3, 7, 0.5, rotation=5)
    spin(5, 7, 1, rotation=4)
    spin(7, 7, 0.2, rotation=1)
    spin.png
  • ご返答ありがとうございました。いろいろと質問を広げてしまいましたが、当面は標準パッケージを自在に使えるように練習したいと思います。追加パッケージに頼るのはちょっと早かったです。 「河童の屁は,河童にあらず,屁である。」さん、関数の例示までしていただいてありがとうございました。 -- 宗二? 2011-09-26 (月) 15:18:16

マルコフ連鎖

square? (2011-09-25 (日) 18:59:28)

マルコフ連鎖とは、乱数発生の方法みたいですが、sample関数による乱数発生とは何が違うのでしょうか?
どんな分布もsampleで発生できると思うのですが。

  • > マルコフ連鎖とは、乱数発生の方法みたいですが
    違います。 -- 河童の屁は,河童にあらず,屁である。? 2011-09-26 (月) 06:46:33
  • 失礼しました、 -- square? 2011-09-26 (月) 18:51:31
  • mcmcでのサンプリングはsample関数のサンプリングとどう違うのでしょうか? -- square? 2011-09-26 (月) 18:52:20
  • > mcmcでのサンプリング
    もうちょっと具体的に言うとどういう事でしょうか?
    聞きたい事を正確に聞くのも技量のうちですよ。 -- 河童の屁は,河童にあらず,屁である。? 2011-09-26 (月) 21:33:19
  • mcmcパッケージは「マルコフ連鎖」ではなくて「マルコフ連鎖モンテカルロ法」ですね。「モンテカルロ法」と「マルコフ連鎖モンテカルロ法」の違いを調べれば知りたいことは見つかるんじゃないかと思います。 -- Iona? 2011-10-08 (土) 23:56:05

閾値を求める方法について

ランゲル・ハンス? (2011-09-21 (水) 08:49:14)

いつも掲示板を参考にしております。
これまでExcelで計算していたのですが、Rでもぜひ計算できるようにしたいと思います。
ベースラインy=cと回帰直線y=ax+bの交点から閾値を求めたいと思います。
次のようなデータ(dataXY)があります。

X	Y
4	1.1
4.1	0.6
4.2	0
4.3	0.9
4.4	0.9
4.5	0
4.6	0
4.7	0
4.8	0.7
4.9	0.9
5	0
5.1	1
5.2	1.1
5.3	0
5.4	0.4
5.5	1.5
5.6	0.9
5.7	1.5
5.8	2.1
5.9	2.6
6	3.2
6.1	4.3
6.2	6.1
6.3	8.3
6.4	10
6.5	11.9
6.6	15.3

data <- read.table("dataXY.txt", header=T)

(1)データの1行目から16行目までのYの値の平均cを求める。

data1 <- data[1:16,]
c <- mean(data1$Y)
c

(2)データの20行目から27行目までのX,Yの値を一次回帰してy=ax+bのaとbを求める。

data2 <- data[20:27,]
L <- lm(Y~X, data= data2)
L

(3)y=cとy=ax+bの交点から閾値(X座標)を求める。
(4)最後に作図する。

plot(data)
abline(h=c, col=2)
abline(L, col=4)

(3)をご教示いただけないでしょうか?
また、グラフ中に交点の座標を表示したいと思います。
どうぞよろしくお願いいたします。

  • y=cとy=ax+bの交点は,ax+b=c を x について解くだけでしょう。x=(c-b)/a です。a=coefficients(L)[2], b=coefficients(L)[1]を代入するだけ。
    (x <- (c-coefficients(L)[1]) / coefficients(L)[2])
    points(x, c, pch=19)
    text(x, c, sprintf("(%.3f, %.3f)", x, c), pos=4, xpd=TRUE)
    (簡単なものは自分で計算する。なんでもかんでも「パッケージにあるはず」とないものねだりはしない方がよいでしょう。投稿も整形しました。どんな風に整形されたか見ておくとよいでしょう。) -- 河童の屁は,河童にあらず,屁である。? 2011-09-21 (水) 10:13:16
  • 河童さま、ご教示ありがとうございました。地道に計算いたします。とくに最後のtext( )は大変参考になりました。 -- ランゲルハンス? 2011-09-21 (水) 10:45:41

readShapeLines?関数とプロット範囲

宗二? (2011-09-20 (火) 15:57:37)

maptoolsパッケージの"readShapeLines?"関数を使って、GISデータをプロットしようとしているのですが、plot()関数内の引数xlim,ylimを使って範囲指定しても、実際のプロット範囲(緯度経度)がずれてしまいます。

練習用にshapefileライブラリにあるtokyok.zipを使って、以下のプログラムでプロットしたのですが、

library(maptools)
map <- readShapeLines("tokyok.shp")

lon1 <- 138   ### 経度138E-141E
lon2 <- 141
lat1 <- 35    ### 緯度35N-35.5N   
lat2 <- 35.5

par(usr=c(lon1, lon2, lat1, lat2))
plot(map, xlim=c(lon1, lon2), ylim=c(lat1, lat2))

作図領域を確認すると

> par("usr")
[1] 138.00000 141.00000  33.90625   36.59375

というように、(緯度の)指定範囲がずれてしまいます。
これは何が原因なのでしょうか?また、修正方法はあるのでしょうか?

  • 環境によっては,経度もずれますね。 -- 河童の屁は,河童にあらず,屁である。? 2011-09-21 (水) 10:47:57
    > sessionInfo()
    R version 2.13.1 Patched (2011-08-31 r56868)
    Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
    
    locale:
    [1] ja_JP.UTF-8/ja_JP.UTF-8/C/C/ja_JP.UTF-8/ja_JP.UTF-8
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets
        methods   base     
    
    other attached packages:
    [1] maptools_0.8-9  lattice_0.19-33 sp_0.9-83
        foreign_0.8-45 
    
    loaded via a namespace (and not attached):
    [1] grid_2.13.1  tools_2.13.1
    > par("usr")
    [1] 137.88000 141.12000  32.23003  38.26997
  • ご返答ありがとうございました。他のグラフィックスパラメータもいじってみましたが、やはりずれは修正されませんでした。
    ただ、動作環境や他のパラメータによるによる”ずれ”の程度が違っていても、par(usr= ...)で明示することで、座標系が固定されていることだけは確認できました。 -- 宗二? 2011-09-22 (木) 15:57:52
  • setParUsrBB = TRUEを入れると上手く行くようです。 -- Iona? 2011-10-01 (土) 02:41:21
    library("maptools")
    map <- readShapeLines("tokyok.shp")
    lon1 <- 138   ### 経度138E-141E
    lon2 <- 141
    lat1 <- 35    ### 緯度35N-35.5N   
    lat2 <- 36 # 35.5だと何もプロットされないので変更してます。
    plot(map, xlim = c(lon1, lon2), ylim = c(lat1, lat2), setParUsrBB = TRUE)
  • 回答が遅くなり失礼しました。Ionaさん、ご返答ありがとうございました。ご指摘いただいたサンプルを使うと、確かにpar("usr")の値がxlim,ylimの値と同期しました。
    ただ、plotするデータタイプによっては、グラフィックパラメータ"setParUsrBB"が使えず、エラーが生じてしまうので、その点は注意が必要とのことでした。
    また、範囲のずれがmaptoolsパッケージの使用によるものかと勘違いしていたのですが、こちらのページを読むと、グラフィックスパラメータ"xaxs","yaxs"の仕様として、既定値x/yaxs="r"では、指定軸範囲が左右に 4% 拡大される、とありました。これが質問の"ずれ"の原因となっていたようで、x/yaxs="i"を指定することで解決できました。基本的な理解が足りずお手数おかけしましたが、ご回答をいただいた皆様、ありがとうございました。 -- 宗二? 2011-10-05 (水) 15:55:53

複数ページのpdfの作成

まあくん? (2011-09-20 (火) 11:35:53)

pdfを作成するときに、複数ページのpdfの作成はできないでしょうか?。複数のグラフを1度に作成していますが、現在は各ページごとにpdfファイルを作成し、手動で1つのpdfファイルにしています。

  • pdf関数で複数のグラフをpdf化すれば複数のページになると思いますが。適当な例ですけど、こういうのとか。-- 2011-09-20 (火) 12:33:21
    pdf("test.pdf")
    plot(1:10)
    hist(1:10)
    dev.off()
  • ありがとうございました。うまくいきました。今まで全く気が付きませんでした。 -- まあくん? 2011-09-20 (火) 16:54:02

発症率の検定?

tau? (2011-09-19 (月) 22:56:26)

いつも、色々と教えていただきましてありがとうございます。

暴露Yが疾患Xの発症に及ぼす影響を調べたいと考えています。
調査の対象はA県、B県の県民です。両県の県民共に暴露を受けており、暴露前後での疾患の発症数が判明しています。
A県では暴露前1ヶ月で100例、暴露後1ヶ月で110例の疾患Xの発症があり、B県ではそれぞれ、80例、120例の発症がありました。A県よりB県で暴露による疾患の発症率が増加したことを証明したいと考えています。
1.A県とB県の人口が分かれば単位人口当たり(/1000人など)の発症率を計算してそれを比較と言うことになるかと思われますが、この場合はどのような検定が用いられるのでしょうか?
2.また、A県とB県の人口が十分に大きいと言うことは分かるものの、詳細な人口が分からない場合、上記の仮説を証明する方法はありますでしょうか?(暴露前後での発症数の比を取ってその比を検定する方法はありますでしょうか)
ご教示いただければ幸いです。

  • R とは何の関係もないようですが。
    1. 全数調査なので,検定する必要がない(標本調査ではないので,検定できない)。
    2. 「県の人口がわからない」などということはない(1の位まで正確である必要などないし)。「暴露前後での発症数の比を取ってその比を検定する方法」もない。そもそも,そのような検定があったとして,データ数(サンプルサイズ)はいくつになる?。A県とB県の比が2個だけです。そんな状態ではどんな検定もきるわけがありません。
    架空の話なのだろうけど,曝露後一ヶ月で発症率が変化する疾患って? -- 河童の屁は,河童にあらず,屁である。? 2011-09-21 (水) 10:54:39
  • 以前、Rを用いた一様性の検定等の件でご教示頂いた者です。検定ができないと言う事が分かっただけでも収穫でした。ありがとうございました。暴露というのは、地震です。種々の急性疾患の発症が直後から増加しているようです。 -- tau? 2011-09-22 (木) 09:32:14

多目的最適化で特殊制限

西田? (2011-09-15 (木) 00:08:11)

複数の入力値と制約条件から一つの出力が最適になるように分散共分散行列利用の進化的戦略cmaesというパッケージを使ったプログラムを作ろうと頑張っています。

制約条件である説明変数の下限上限がlower(0,0,0),upper(10,10,10)のように定数であればなんとか動いてくれるようになったのですが、下限上限が変動する、具体的にはx1+x2+x3=10のような条件が追加されたときにきちんと動かず困っています。

現在はcmaes内部で、新しく子集合を作る際に

x <- xmean + σ # 親集合の重心周辺に点を取っているのだと思う(σは変数)
x <- 10 * ( x / sum(x) )      #xの合計が5なら5で割ってその後10倍
...##色々計算 よくなっていたら更新
...##くり返し

として無理やりx1+x2+x3=10を実現しています。が、これできちんと最適化してくれているのか不安です。できればcmaes関数を変更することなく、つまりその外部でx1+x2+x3=10という条件を満たしたいと思っています。 何かいい方法はないでしょうか。(cmaes関数自体にコダワリはないです)

  • 最適化する関数内のx3を10-(x1+x2)に置き換えるとかではダメなのですか? -- Iona? 2011-10-01 (土) 03:30:25
  • わかりづらい質問にお答えいただきありがとうございます。どうやら関数内ではxをリストで持ち一括実行しているようで、動きとしてx1が変わったとしてもx3はそれを受けつけず一つ前の状態のx1で実行されてしまうようです。渡されたものをそのまま使っていましたがもっと一般的なRパッケージを用いてやってみようと思います。ありがとうございました -- 西田? 2011-10-02 (日) 22:58:22

一般化加法モデル(gam)の回帰式の出力の仕方

Saito? (2011-09-14 (水) 16:58:49)

いつもお世話になっております。ネットや過去ログで調べましたが、見つからなかったので質問させてください。mgcvパッケージの中に、一般化加法モデルが扱えるgamという関数があります。これで回帰式の推定を行うとそれらしい曲線が引けるのですが、その曲線の関数形が知りたいのです。以下にサンプルを示します。

> n <- 30
> x <- seq(-n, n)
> y <- 0.04*x^3+0.03*x^2+0.02*x+rnorm(2*n+1, 0, 1) # 真の関係
> plot(x, y)
> 
> res <- lm(y ~ x) # 直線回帰
> func <- function(x){
+ coef(res)[1] + coef(res)[2]*x # これが直線回帰の回帰式
+ }
> points(x, func(x=x))
> 
> res2 <- gam(y~s(x, k=3)) # 加法モデル(
                           # デフォルトは薄板スプライン)による回帰
> points(x, predict(res2), type="l", col=2, lwd=3)
                           # predictによる予測で何故か直線回帰と一致
> coef(res2) #回帰係数が何か出力されてはいるがヘルプを見ても分からない
  (Intercept)        s(x).1        s(x).2 
 9.309025e+00 -1.199402e-09  3.932092e+02 
> 
> res2 <- gam(y~s(x, k=4)) #節点の数を増やすと曲線となる
> points(x, predict(res2), type="l", col=2, lwd=3)
> coef(res2) 
(Intercept)      s(x).1      s(x).2      s(x).3 
   9.309025 -843.683785 -129.386077 1162.199292 

パッケージを扱うのに問題はありませんが、結局、どのような回帰式になったのかを知りたいのです。ヘルプを見れば書いてあるはずなのですが、私には見つけられませんでした。どこかの本に、回帰式の求め方が書いてある、という情報だけでも構いません。
どなたか、ご教授頂けると幸いです。どうぞよろしくお願い致します。

  • 関数形ってよくわかりませんが、gamっていれたら出てくるんじゃないですか? -- 2011-09-14 (水) 17:38:53
  • 早速のコメントありがとうございます。gamと入れて、後を追ってみたところ、 estimate.gam()で推定しているのかな?とあたりをつけました。ですが、その関数名を入力しても中身が見れません。何が原因なのか分からずまた止まってしまいました。もしこの先の見方を知っていましたらご教授ください。 -- Saito? 2011-09-14 (水) 18:25:58
  • mgcv:::estimate.gam とすれば見えますけど。その先は知らない。 -- 河童の屁は,河童にあらず,屁である。? 2011-09-14 (水) 22:42:04
  • パッケージ「mgcv」の参考書は、Generalized Additive Models: An Introduction with R (Chapman & Hall/CRC Texts in Statistical Science) Simon Wood (著) Chapman and Hall/CRC (2006) です。 -- 竹澤? 2011-09-16 (金) 16:48:55

ablineで横軸の指定した範囲に直線を描く

くま? (2011-09-14 (水) 15:50:47)

lmで得られた回帰直線式をグラフに描くのに、ablineを使っていますが、これを使うと、直線は横軸の全領域にわたって引れてしまいます。指定した横軸の範囲にのみその直線を描くにはどうすればよいでしょうか。たとえば、グラフの横軸の範囲のxlim=c(0,100)のときに、回帰直線式を描く範囲をc(20,80)にすることは可能でしょうか。

  • points()ではいかがでしょう?
    > set.seed(1)
    > x <- seq(0, 100)
    > y <- 0.02*x+rnorm(101, 0, 1)
    > plot(x, y)
    > 
    > res <- lm(y ~ x)
    > func <- function(x){
    + coef(res)[1] + coef(res)[2]*x 
    + }
    > points(x, func(x=x), type="l", lwd=3, col=2)
    > x2 <- seq(0, 80)
    > points(x2, func(x=x2), type="l", lwd=3, col=3)
    • Saito? 2011-09-14 (水) 17:01:02
  • lm が返すオブジェクトを a, 回帰直線を描く x の範囲を,x.range <- c(20, 80) とすれば,
    lines(x.range, coefficients(a)[1]+x.range*coefficients(a)[2], col=2)
    でよいでしょう。二点を結ぶ直線を描くだけです。全然うまい方法ではないですが,間違いなく結果の出る方法です。 -- 河童の屁は,河童にあらず,屁である。? 2011-09-14 (水) 18:07:41
  • Saitoさん、河童の屁さんありがとうございました。Rは奥が深いので、もっとスマートな方法があるのではないかと思っていましたが、両端の位置を計算して線分を引く方法しかないのですね。ありがとうございました。 -- くま? 2011-09-14 (水) 21:01:57

行列の任意の列に含まれる欠損値NAの割合算出

(2011-09-08 (木) 13:46:05)

行列の任意の(全ての)列に、欠損値NAがどれだけあるか、割合を算出したいのですが、どうすればよいでしょうか。全ての列に対して、それぞれNAの割合を求めたいです。

例えば、100行10列の行列において、3列目にNAが40個あれば、NAの割合は40% ← この40(または0.4)を求めたい

宜しくお願いします。

  • 行数はnrow()、NAかどうかの判定はis.na()を使えばできるでしょう。sum(TRUE)は1, sum(FALSE)は0と知っていれば、次のようにできます。 -- 2011-09-08 (木) 14:08:18 まずはNAを含む100行10列の適当な行列を作成します
    > a <- matrix(sample(c(1:9,NA),1000,replace=TRUE),100)
    3列のNAの割合は次のようにします。
    > sum(is.na(a[,3]))/nrow(a)
    [1] 0.12
    全ての列に対して同様にしたい場合は、sapply(),apply(),for(),などで一括処理を行います。
  • 回答ありがとうございました。上手くいきました。 -- 2011-09-08 (木) 14:51:05
  • colSums(is.na(a))/nrow(a) -- 河童の屁は,河童にあらず,屁である。? 2011-09-08 (木) 14:52:41
  • おぉ、河童さんさすがです。is.na()に行列まるごと与えてもそのまま行列を返すとは知りませんでした。参りました。 -- 2011-09-08 (木) 18:01:28 調べたら、is.na()はdata.frameでもそのままdata.frameを返すようですね。listは要素単位で返すようです。
    > b <- list(a1=a,a2=a)
    > is.na(b)
       a1    a2 
    FALSE FALSE
  • is.naはNaNも含むので, !is.nan(a)&is.na(a)は必要*かも*しれません. -- 2011-09-08 (木) 18:20:23

理論的な標本分布について

manabu? (2011-09-06 (火) 12:03:05)

本で勉強していて、以下のような問題がありました。

サンプルサイズをn=1、3、5、10と変化させた時に、標本分布の形状がどのように変わるか調べてみましょう。
※母集団分布は標準正規分布N(0,1^2)

答えは以下のように書いてありました。

curve(dnorm(x, sd=sqrt(1/10)), -3, 3)
curve(dnorm(x, sd=sqrt(1/5)), -3, 3, add=TRUE)
curve(dnorm(x, sd=sqrt(1/3)), -3, 3, add=TRUE)
curve(dnorm(x, sd=sqrt(1/1)), -3, 3, add=TRUE)

母集団の標準偏差や分散が1である時に標本の偏差の二乗の合計が1と言えるのは何故でしょうか?

  • 標本の偏差の二乗の合計は1じゃないでしょう。偏差の二乗和はサンプルサイズに等しくなり,偏差の二乗和をサンプルサイズで割ると(理論上)1になる。だって,それが分散(不偏分散でない方)の定義だもの。 -- 河童の屁は,河童にあらず,屁である。? 2011-09-06 (火) 14:12:20
  • 回答ありがとうございます。本の回答にある1/10や1/5の1はどのように計算しているのでしょうか? -- manabu? 2011-09-06 (火) 15:16:44
  • sqrt(1/10) などは,標本平均の標準誤差ですよ。標準誤差は,母標準偏差をサンプルサイズの平方根で割ったものになる。つまり,サンプルサイズが10で,母標準偏差が1なら,1/sqrt(10) となる。教科書の,「標本平均の標準誤差」の項を参照のこと。 -- 河童の屁は,河童にあらず,屁である。? 2011-09-06 (火) 17:20:18
  • 丁寧にご説明頂き、ありがとうございます。本当に助かりました。 -- 2011-09-06 (火) 18:22:28

SPSSのWEIGHTと同等の機能

じゃんぽけ? (2011-09-05 (月) 10:41:06)

Rを利用してアンケート分析を実施したいのですが、
SPSSのWEIGHT(重み付け)の様な機能はどうすれば再現できるでしょうか?

  • どのような目的でそのような機能を望むのだろうか?
    例えば,以下のような集計表を与えるデータを,weight を使って表現するには
    > d <- table(x)
            b
    a         1  2  3
      female 13  2  6
      male    6 14  9
    data.frame 関数を使って
    > data.frame(d)
           a b Freq
    1 female 1   13
    2   male 1    6
    3 female 2    2
    4   male 2   14
    5 female 3    6
    6   male 3    9
    のようなデータフレームにできる。このデータフレームの Freq を重みとして,元のデータを再構成することはできる。そのデータを使えば何でもできる。SPSS の weight も内部ではこんな風にして,重み分のデータの複製を作っているのじゃないかな。
    重み付きの平均値を求めるには,weighted.mean というのがありますね。
    lm, glm などには,weights という引数があります。
    実際にやりたいことをもう少し詳しく説明すると,R でならどういう風にすればよいという回答がつくかも。 -- 河童の屁は,河童にあらず,屁である。? 2011-09-05 (月) 17:43:33
  • アドバイスありがとうございます。 -- じゃんぽけ? 2011-09-08 (木) 21:08:46

image における時系列軸の反転

てるよ? (2011-09-01 (木) 11:59:52)

投稿の前にテキスト整形のルールを読んでも、ほとんど意味がわかりませんでした。お見苦しい投稿になっていましたら、どうぞお許しください。

image() における時系列軸の反転について教えていただけたら幸いです。

"2008/12/19"から"2009/3/24"の96日間に、等間隔でデータを記録したデータがあります。等間隔とは、1時間に1点で1日に24点を記録したデータで、要素数が94日×24点の2304です。このデータは1または0のバイナリデータです。

このデータで1がどのような時間帯に現れるのかを調べるために、縦軸(y軸)に日付、横軸(x軸)に時刻(0時から24時)をとってプロットした図を書くために以下のコマンドを実行しました。

st <- c("2008/12/19", "2009/3/24")
st2 <- strptime(st, "%Y/%m/%d", tz="")
y.days <- seq(st2[1],st2[2], by="1 day")
x.hours <- seq(0, 24, by=1)

m <- matrix(sample(c(0, 1), 24*length(y.days), rep=T),
            nrow=24, ncol=length(y.days))

image(x.hours, y.days, m, col=c("white", "black"), yaxt="n",
      xaxp=c(0,24,4), xlab="hours", ylab=NA)

r <- as.POSIXct(round(range(y.days), "days"))
axis.POSIXct(2, at=seq(r[1],r[2], by="20 day"), 
             format="%Y/%m/%d", las=2)

これでとりあえずグラフは書けたのですが、y軸の時間軸を反転させて、日付の進行を上から下に向かって進むように変更したいと思ったのですが、これがなかなかうまくいきません。

四苦八苦しているうちに、

image(...,  ylim=c(as.numeric(y.days[96]), as.numeric(y.days[1])))

を書くことでプロット自体の反転はできたのですが、今度は

r <- as.POSIXct(round(range(y.days), "days"))
axis.POSIXct(2, at=seq(r[1],r[2], by="20 day"), 
             format="%Y/%m/%d", las=2)

を実行してもy軸に日付が表示されなくなってしまいました。

y軸の時系列軸を反転させた後も、日付を表示するうまい方法がありましたら教えていただけると幸いです。

  • as.numeric()でy軸を数値型に変換しているに、日付型の軸をそのままはめようとしてもはまりません。数値型のy軸を描画するのも1つの解法でしょう。 -- 2011-09-02 (金) 17:16:36
    image(x.hours, y.days, m, col=c("white", "black"),
          yaxt="n", xaxp=c(0,24,4),xlab="hours", ylab=NA,
          ylim=c(as.numeric(y.days[96]), as.numeric(y.days[1])))
    axis(2,at=as.numeric(y.days[(1:4)*20]),
         labels=as.character(y.days[(1:4)*20]), las=2)
    20110902a.png
    labelsのフォーマットにもう少し手を入れる必要がありますが、台風12号のため学生も教職員もすぐに帰宅しろと学内放送がかかっているので、あとはご自分で。

Linuxでのメモリ不足解消

BCD? (2011-08-29 (月) 15:17:00)

初歩的なことかもしれないので恐縮なのですが、教えてください。
Linuxのスパコンを使ってRのheatmap.2関数で作図をしているのですが 'サイズ 1.4 Gb のベクトルを割り当てることができません'というエラーがでました。調べてみたところ、メモリが足りないということでそれまでに使ってきた変数を削除したりgc()をしてメモリの節約もしたりしました。windowsではメモリの制限を解除するようなコマンドがあるのは分かりましたが、Linuxではどのようにすれば良いのか分かりませんでした。この問題を解決する方法を教えてください

  • それって32bitのRではないでしょうか? 本当に64bitのRですか? -- 2011-09-08 (木) 18:23:10
  • 確かに64bitのRだと思います -- BCD? 2011-09-17 (土) 20:47:22

データフレームの抽出と並び替え

BCD? (2011-08-28 (日) 12:16:08)

>x
	1	2	3	4	.	.
A	20	50	60	29    .       .
B	49	74	90	38    .       .
C	57	49	20	39    .       .
>Y
[1] "C"	"A"	.....

のようなデータフレーム'x'(行、列ともに20000行ある)とxの全行名の一部がある順番に従って格納されているベクトル'Y'(C, A,......7000個。要素の順序は重要)が入っているベクトルがあります。このベクトル'Y'を参照して行名から'x’を抽出&並べ替える方法を探しています。

現在、私は以下のスクリプトでこの作業を実行しています。しかし、データが膨大で時間がかかってしまいます。この作業が早くなる方法をご存知の方がいらっしゃればどうか御教示願います。

result <- NULL
for (i in 1:length(Y)) {
    result <- rbind(result, x[rownames(x) == Y[i], ])
}
  • 一行ずつrbindするのでは結構遅いのでしょうね。
    t(sapply(Y, function(a) x[a,]))
    というようにすることもできますね。x が2000行×2000列, Y の長さが 1000 のテストデータについて速度を比較したところ,この方法は,x が matrix の場合にはあなたの for を使うやりかたより三倍速いけど,同じ内容の data.frame に対しては,あなたのより四倍遅いので要注意。
    ところが,吃驚することに,「一行ずつrbindするのでは結構遅いのでしょうね。」ということを,以下のように改めるだけで,もとのプログラムの百倍速くなります!!。sapply を使うより6倍速い。
    result <- matrix(0, length(Y), 2000)
    for (i in 1:length(Y)) {
        result[i,] <- x[rownames(x) == Y[i], ]
    }
    サイズの小さいデータでいろいろ試して,最速のやり方を見つけてください。-- 河童の屁は,河童にあらず,屁である。? 2011-08-28 (日) 14:49:11
  • 速度が問題になる場合,リスト(含むデータフレーム)、ループ(apply関数族を含む)、if文、既存オブジェクトのサイズの変更、を極力なくすのが大原則です(参考:Rコード最適化のコツと実例集)。以下の参考例では文字値を数値(因子)化することで、すべてを行列と行列基本操作で表現しています。 -- 2011-08-29 (月) 14:15:20
    #簡単な例
    > set.seed(1234)
    > n <- 6; m <- 4
    > x <- matrix(rnorm(n^2),nrow=n,ncol=n)
    > colnames(x) <- seq(n)
    > rownames(x) <- sample(LETTERS,n,rep=TRUE)
    
    > B <- rownames(x); uB <- unique(B)
    > A <- sample(uB,m,rep=TRUE)
    
    > z <- factor(B,levels=uB)
    > zx <- cbind(z,x) # 行ラベルを数値(因子)化し行列の先頭列に加える
    
    > Ax <- zx[factor(A,levels=uB),][,seq(2,n+1)]
    
    > x
               1          2           3          4          5          6
    A -1.2070657 -0.5747400 -0.77625389 -0.8371717 -0.6937202  1.1022975
    U  0.2774292 -0.5466319  0.06445882  2.4158352 -1.4482049 -0.4755931
    C  1.0844412 -0.5644520  0.95949406  0.1340882  0.5747557 -0.7094400
    N -2.3456977 -0.8900378 -0.11028549 -0.4906859 -1.0236557 -0.5012581
    J  0.4291247 -0.4771927 -0.51100951 -0.4405479 -0.0151383 -1.6290935
    B  0.5060559 -0.9983864 -0.91119542  0.4595894 -0.9359486 -1.1676193
    > B
    [1] "A" "U" "C" "N" "J" "B"
    > A
    [1] "U" "J" "B" "C"
    > z
    [1] A U C N J B
    Levels: A U C N J B
    > zx
      z          1          2           3          4          5          6
    A 1 -1.2070657 -0.5747400 -0.77625389 -0.8371717 -0.6937202  1.1022975
    U 2  0.2774292 -0.5466319  0.06445882  2.4158352 -1.4482049 -0.4755931
    C 3  1.0844412 -0.5644520  0.95949406  0.1340882  0.5747557 -0.7094400
    N 4 -2.3456977 -0.8900378 -0.11028549 -0.4906859 -1.0236557 -0.5012581
    J 5  0.4291247 -0.4771927 -0.51100951 -0.4405479 -0.0151383 -1.6290935
    B 6  0.5060559 -0.9983864 -0.91119542  0.4595894 -0.9359486 -1.1676193
    > Ax
              1          2           3          4          5          6
    U 0.2774292 -0.5466319  0.06445882  2.4158352 -1.4482049 -0.4755931
    J 0.4291247 -0.4771927 -0.51100951 -0.4405479 -0.0151383 -1.6290935
    B 0.5060559 -0.9983864 -0.91119542  0.4595894 -0.9359486 -1.1676193
    C 1.0844412 -0.5644520  0.95949406  0.1340882  0.5747557 -0.7094400 
    
    # n=10000, m=3500の場合の実行速度
    > system.time(Ax <- zx[factor(A,levels=uB),][,seq(2,n+1)])
       ユーザ   システム       経過  
         1.804      0.156      1.965
  • ありがとうございます。試してみたところ、とても速くなりました。何故こうなるのかは分かりませんがこんな風になることもあるのですね。勉強になります。 -- BCD? 2011-08-29 (月) 14:27:43
  • 横からすみませんが、なぜx[Y,]じゃだめなのでしょうか -- 2011-08-29 (月) 14:51:03
    > x <- matrix(round(runif(12)*100),ncol=4)
    > colnames(x) <- as.character(1:4)
    > rownames(x) <- LETTERS[1:3]
    > x
       1  2  3  4
    A 93 68 20  5
    B 26 20 17 74
    C 86 35 59 64
    > Y <- sample(LETTERS[1:3],10000,replace=TRUE)
    > head(Y)
    [1] "C" "C" "A" "C" "C" "B"
    > system.time(x[Y,])
       ユーザ   システム       経過  
         0.000      0.000      0.001 
    > system.time({result <- matrix(0, length(Y), 4);
    +             for (i in 1:length(Y)) {
    +               result[i,] <- x[rownames(x) == Y[i], ]
    +             }})
       ユーザ   システム       経過  
         0.080      0.000      0.087
  • なるほど行列の成分抽出演算子[,]には列名、行名ラベルが使えるんですね。昔からこんなでしたっけ。初耳です。速度も早くなりますね。 -- 2011-08-29 (月) 15:21:38
    >  system.time(Ax <- x[A,])
       ユーザ   システム       経過  
         1.048      0.080      1.132
  • x[Y, ]を試してみました。うまくいきますし、とても速いですね。どうもありがとうございました。 -- BCD? 2011-08-29 (月) 15:27:10
  • > なぜx[Y,]じゃだめなのでしょうか
    さようでございました,function(a) x[a,] のところで,気づくべきでした(泣く) -- 河童の屁は,河童にあらず,屁である。? 2011-08-29 (月) 21:05:30

一様性の検定について

tau? (2011-08-27 (土) 10:46:47)

一様性の検定に関して質問致します。
発症が希な疾患を有する患者が一年間に何人入院したかを2008-2011年の4年間で比較したいと考えています。2008年から2011年までそれぞれ1,2,1,7例ずつ入院があり、2011年のみ入院が多い事を証明しようと思います。
カイ二乗検定を用いて下記のように検定を行いましたが、度数が少ないためか「不正確かもしれません」のコメントがでます。

> chisq.test(c(1,2,1,7))
Chi-squared test for given probabilities
data:  c(1, 2, 1, 7)
X-squared = 9, df = 3, p-value = 0.02929
警告メッセージ: 
In chisq.test(c(1, 2, 1, 7)) :  カイ自乗近似は不正確かもしれません

分割表でカイ二乗検定を行うとき同様、度数が少ない場合は、この検定法を用いない方が良いのでしょうか?
不適当な場合、Fisherの正確検定を用いるのかと考え、調べてみましたが、同方法による一様性の検定の方法がわかりませんでした。
可能であればFisherの正確検定による一様性の検定の方法を、不適当であれば他の検定方法をご教示頂ければ幸いです。

  • http://aoki2.si.gunma-u.ac.jp/R/gft.html にあるような,一様性の検定の正確バージョンを使えばよいのは? -- 河童の屁は,河童にあらず,屁である。? 2011-08-28 (日) 00:12:46
  • ありがとうございました。調べていた際、青木先生のHPがみられず、内容を確認できずにおりました。ただ今、確認できました。ありがとうございます。 -- tau? 2011-08-31 (水) 17:02:57

質問紙尺度データのクロス集計の値をパーセントになおす方法

Wombat? (2011-08-25 (木) 09:16:29)

私の書き方が不明瞭だったようなのでもう一度投稿させて下さい。以下のデータは5が各質問に対して「強くそう思う」で1が「まったくそう思わない」になる質問紙尺度と呼ばれるものになります。

     ID class Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q11 Q15
1     1     a  5  4  4  4  4  2  4   4   5
2     2     a  4  4  3  3  4  4  3   4   2
3     3     a  4  4  3  5  4  4  3   4   5
4     4     a  4  4  1  3  3  4  5   3   5
5     5     a  5  4  1  5  5  3  2   4   4
6     6     a  4  4  4  4  4  2  1   2   1
            -- 省略--
94   94     d  4  4  3  4  4  2  3   4   4
95   95     d  4  3  4  3  3  4  4   4   4
96   96     d  4  4  1  4  3  3  2   4   3
97   97     d  4  5  2  5  5  5  4   4   4
98   98     d  5  4  4  4  3  4  5   4   4
99   99     d  4  4  2  4  4  3  3   4   4
100 100     d  4  4  2  3  4  4  5   4   4
101 101     d  5  4  2  4  4  5  4   4   1
102 102     d  5  4  4  4  3  5  2   4   2

これを各クラスごとに項目別にsapply(d01[,3:11],function(x) table(d01$class,x))でクロス集計を行なう(河童さんのおかげです。)と以下のようになります。

$Q1
   x
     3  4  5
  a  2 15  8
  b  0 21  6
  c  2 19  4
  d  0 14 11

$Q2
   x
     2  3  4  5
  a  1  5 19  0
  b  1  6 20  0
  c  0  8 14  3
  d  0  4 17  4
 -- 以下省略--

これにより、Q1はclass aは強くそう思うと答えた回答者が8人いることがわかりますが、クラスの数が同じではないので、8人ではなくて、32%というふうにパーセントで報告するのが普通になると思うのですが、いちいち手で計算するのは効率が悪いので、この8という頻度を表す数字をパーセントになおす方法をご存知でしたら教えてください。よろしくお願いします。

  • table の結果をパーセントに直すのは,定石中の定石。小数点以下1桁にしておきます。
    sapply(d01[,3:11],function(x) { tbl <- table(d01$class,x); print(round(tbl/rowSums(tbl)*100,1)) }))
    正しい答えを出せればよいのであって,うまく書く必要はないのです。for でも何でも使って,プログラムを書くのもまっとうな方法です。
    http://aoki2.si.gunma-u.ac.jp/R/cross.html にあるプログラムなんかが,参考になると思うけど。 -- 河童の屁は,河童にあらず,屁である。? 2011-08-25 (木) 11:17:27
  • ありがとうございました。上の式の最後のカッコを取るとうまくいきました。一応ここに投稿させていただく前にあれこれと自分で本やネットの情報を参考にしてやってうまくいかないので投稿させてもらっているのですが、sapplyとrowSumsの基本的な使い方と意味は理解しているつもりなのですが、それだけでは自分の頭で考えてもできそうにないのですが、何せまだRを使い始めて1ヶ月くらいですので。なるべく自分で考えて、試してから投稿しますので、これから皆さんよろしくお願いします。 -- Wombat? 2011-08-25 (木) 18:23:37

クラスと項目別のクロス集計の値をパーセントになおす方法

Wombat? (2011-08-24 (水) 19:26:14)

河童さんのおかげでクラスと項目別のクロス集計ができるようになりましたが、論文に書くときにはクラス間で人数の差があるので、パーセントに変換して書きます。1つ1つ計算してもいいのですが、もし、その値を簡単にパーセント値に変換する方法がありましたら教えてください。よろしくお願いします。OSはWindows XP, RのVersionは2.13.1です。

$Q1

  x
    3  4  5
 a  2 15  8
 b  0 19  3

$Q2

  x
    2  3  4
 a  1  5 19
 b  1  5 16
  • だからいったでしょう。colMeans だろうって。0/1 データの平均は割合(0〜1)ですよ。
    集計数をデータ数で割って100を掛けるだけだけど,先に挙げたものとの関連では難易様々。
    sapply(split(d, d[,2]),
           function(x) colSums(x[3:9])/nrow(x)*100)
    sapply(split(d, d[,2]), function(x) colMeans(x[3:9])*100)
    sapply(d[3:9], function(x) tapply(x, d$class, mean)*100)
    by(d[3:9], d[,2], colMeans)
    一番目のが一番直感的に分かりやすいかな。
    最後の by を使う例は,%にするために100をどんな風に掛けたらよいのかわからないので,割合(0〜1)のまま。
    まあ,お好きなものを。
    なお,for ループなんかを使ってプログラムすれば,どんな複雑な分析もできるということは,追記しておこう。 -- 河童の屁は,河童にあらず,屁である。? 2011-08-24 (水) 21:25:05
  • ありがとうございました。でも、この関数は各グループごとにそれぞれの項目の変量を集計(和)を求めるやり方でしたよね。クロス集計のときは、colSumsをtableに変えることはできないと思うのですが。前に教えていただいた関数はsapply(dato1[3:9],function(x) table(dat01$class,x))だったと思うのですが。                                -- Wombat? 2011-08-24 (水) 21:47:30
  • 目的に応じてプログラムは変わるということです。 -- 河童の屁は,河童にあらず,屁である。? 2011-08-25 (木) 11:23:19

一度にクラスごとに各項目を集計(和を求める)する方法

Wombat? (2011-08-24 (水) 01:52:47)

次のようなデータがあります。これはある英語教授法を4つのクラスでおこなって、英語力のどの部分が伸びたかを学生に尋ねたアンケートの結果を表したものです。複数回答項目ですので、各項目ごとに変数を準備して、選択したら1、しなければ0で処理しています。このデータの集計でクラスごとに各項目の和を一度に求めるにはどのようにしたら良いでしょうか。このクラスごとにどの項目が多いかを調べらばいいので、クロス集計でなく、単に和を求めるだけで良いと思います。sapply(dat01[1:25,3:9],sum)でclass aにおける各項目の集計は求めることができますが、何度も[ ]の中の行の値を変えるのはあまり効率の良い方法とは言えないと思います(4回くらいやれよと言われそうですが)ので、よろしくお願いします。OSはWindo coef(res2)

(Intercept)      s(x).1      s(x).2      s(x).3 
   9.309025 -843.683785 -129.386077 1162.199292 

パッケージを扱うのに問題はありませんが、結局、どのような回帰式になったのかを知りたいのです。ヘルプを見れば書いてあるはずなのですが、私には見つけられませんでした。どこかの本に、回帰式の求め方が書いてある、という情報だけでも構いません。
どなたか、ご教授頂けると幸いです。どうぞよろしくお願い致します。

  • 関数形ってよくわかりませんが、gamっていれたら出てくるんじゃないですか? -- ws XP, RのVersionは2.13.1です。
      ID class R Wr L Spk Vocab Gr Spd
       1     a 0  0 0   0     0  0   0
       2     a 0  0 0   0     0  0   0
       3     a 0  0 0   0     0  0   1
       4     a 0  0 0   0     0  0   0
       5     a 1  0 0   0     0  1   1
          :  省略
     100     d 1  0 0   0     1  0   0
     101     d 1  0 0   0     1  0   0
     102     d 0  0 0   0     0  0   0
     103     d 1  0 0   0     1  0   0
  • colSums じゃなく,colMeans では?
    sapply(split(d, d[,2]), function(x) colSums(x[3:9]))
    または,
    by(d[3:9], d[,2], colSums)
    または
    sapply(d[3:9], function(x) tapply(x, d$class, sum))
    お好きな方を。 -- 河童の屁は,河童にあらず,屁である。? 2011-08-24 (水) 08:21:32
  • 河童さん、いつも的確なヘルプありがとうございます。ちなみにこれらの関数が実際のデータを使って演習形式で学べる初心者向きの書籍をご存知でしたら教えてください。 -- Wombat? 2011-08-24 (水) 12:10:01
  • 本を薦めるのは難しい。本屋なり図書館なりへ行って,実際にそれぞれの本を見て,決めて。 -- 河童の屁は,河童にあらず,屁である。? 2011-08-24 (水) 12:14:59

グラフの細かいx軸範囲制御

BCD? (2011-08-22 (月) 19:09:35)

plot関数で折れ線グラフを作る時にxlimでグラフの中のx軸の範囲を決めることができますが、その中のある領域だけそのグラフ内で広げるようにすることはできますか?
例えば xlim = C(0, 10000) のグラフの場合、グラフの左端が0で右端が10000になり中心が5000になります。これを操作してグラフのx軸の左端から1/4までが0~4500の範囲、1/4から3/4までが4500~5500の範囲、3/4から右端までが5500~10000の範囲と部分的にx軸を広げたいのです。

  • X 座標値を線形変換し,X 軸は,axis 関数で描く。
    しかし,こういう,グラフを見る人を誤解させるようなグラフは描かない方がよいですよ。統計学的センスに欠けます。 -- 河童の屁は,河童にあらず,屁である。? 2011-08-22 (月) 19:36:27
    set.seed(123456789)
    n <- 500
    y <- rnorm(n)
    x <- sample(10000, n, replace=TRUE)
    for (i in 1:n) {
    	xi <- x[i]
    	if (xi < 4500) x[i] <- xi/4500
    	else if (xi < 5500) x[i] <- (xi-4500)/500+1
    	else x[i] <- (xi-5500)/4500+3
    }
    x <- x*2500
    plot(x, y, xaxt="n")
    axis(1, at=0:4*2500,
         labels=c(0, 4500, 5000, 5500, 10000))
    cheat.png
  • どうもありがとうございます。axis関数を使えば良かったのですね。どうしても軸の数値を変更しなければならなかったので助かりました。 -- BCD? 2011-08-22 (月) 23:36:41

read.tableでファイルを読み込む時に、先頭が数字である列ラベルに付加される'X'を取り除きたい

BCD? (2011-08-22 (月) 13:13:44)

read.tableでファイルを読みこむと列ラベルの先頭が数字の場合、その前にXが付加されてしまいます。Xが付加されないようにするにはどうしたらよいですか?(以前、Rjpwikiに投稿があったと思いますが、見つけ出すことができませんでした)

ex)
     0002jh 0043sss
  1         2           4

のようなtxtデータをread.tableで読み込むと

    X0002jh X0043sss
   1       2        4

となります。これを解消したいです。

  • ?read.tableでcheck.namesオプションを調べてください。FALSEに設定すると不正なな変数名もそのまま読み込みます。なお、数字で始まる変数名は、真にやむを得ない場合(自分自身に決定権がないなど)を除いて、禁止です。趣味的な理由であればやめた方がよいでしょう。あえてそうするなら茨の道を進むことになります。 -- 2011-08-22 (月) 13:33:07
  • ありがとうございました。おかげ様でうまくいきそうです。 -- BCD? 2011-08-22 (月) 19:10:13

複素数を含む積分(変数は実数)

square? (2011-08-21 (日) 17:47:20)

下のような複素数の積分はできませんか?
f=function(x) exp(i*x)
integrate(f,0,1)
integrateでは実数限定のようですが。

  • すみません、誤記:exp(1*i*x) -- square? 2011-08-21 (日) 17:50:28
  • -- 2011-08-21 (日) 19:50:51
    > f <- function(x) exp(1i*x)
    > integrate(function(x) Re(f(x)),0,1)$value+
                (1i)*integrate(function(x) Im(f(x)),0,1)$value 
    [1] 0.841471+0.4596977i
  • ありがとうございます -- square? 2011-08-21 (日) 21:16:18

data.frameをtransactionに変換する際の問題

アレックス? (2011-08-17 (水) 15:58:26)

R 2.13.1を利用しています。

要素1,要素2,要素3
りんご,バナナ,みかん
バナナ,なし,
パイン,もも,みかん

という中身のファイル(data.txt)を以下のコマンドで読み込み

data1 <- read.table("C:/lab/kankou.txt",sep=",",
                    header=TRUE)
 要素1  要素2  要素3
1 りんご バナナ みかん
2 バナナ なし
3 パイン もも   みかん

というdata.frame形式のデータを読み込むことはできたのですが、これをtransactionに変換する際に

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

としてdata.frameを開いてみると

1{要素1=りんご,要素2=バナナ,要素3=みかん}
2{要素1=バナナ,要素2=なし,要素3=}
3{要素1=パイン,要素2=もも,要素3=みかん}

となってしまいます。これを

1{りんご,バナナ,みかん}
2{バナナ,なし,}
3{パイン,もも,みかん}

となるようなtransactionを生成する方法はないでしょうか。

  • それに続いて,
    data.frame[,2] <- gsub("要素[1-3]=", "", data.frame[,2])
    などとすればよいのでは? -- 河童の屁は,河童にあらず,屁である。? 2011-08-17 (水) 16:36:26
  • 申し訳ありません。私の書き方が悪かったようです。 data.frameの段階ではなく、data.tranの段階で成形する方法、
    もしくはdata.tranを生成する段階で直接可能とする方法をご教授していただけないでしょうか。
    arulesを用いて分析を行いたいので、transaction形式で読み込みを完了したいのです。 -- アレックス? 2011-08-17 (水) 17:54:17
  • transactionsクラスのオブジェクト構造をいじりたいのか、printメソッドを提示しているような望む形にしたいのか、質問が不明瞭で助言は難しいと思いますよ。data.frameクラスに変換されていますが、質問に無関係なdata.frameクラスの話を混ぜると、読む側は混乱しますよ。 -- 2011-08-19 (金) 11:15:46
  • あなたは,
    1{りんご,バナナ,みかん}
    2{バナナ,なし,}
    3{パイン,もも,みかん}
    という内容のテキストファイルが欲しいんですか?(たぶん違うのだろうけどね) -- 河童の屁は,河童にあらず,屁である。? 2011-08-19 (金) 20:28:34

Plmをインストールする方法

z? (2011-08-12 (金) 18:52:21)

Plm Pacakgeを用い、下記の分析を行いたいのですが、うまくインストールできません。Rは2.13.1を利用しており、スペックは満たしているようです。
このぱっページをインストールする方法か、類似の分析方法をご教示頂けましたら、幸いです。自身でも、plmを使わずに分析を行うコードを色々と試行錯誤しているのですが、なかなか解決できていません。宜しくお願い致します。
the Fixed effects model (within),
• the pooling model (pooling),
• the first-difference model (fd),
• the between model (between),
• the error components model (random).

  • 何度も繰り返して指摘されるし,上の方の注意事項にも書いてあるんだけど,あなたは,どのような指定をして,どのようなエラーメッセージが出て旨くインストールできなかったのでしょうか。あなたの質問には,問題解決のための何の情報も含まれていません。「スペックは満たしているようです」といっても,あなたのOSは何で,バージョンは幾つなんでしょう。こんな基本的な情報すら何にもわからないのです。何がやりたいとか,インストールせずに別の分析コードを試しているなんてこと,いくら書かれても,問題解決には何の役にも立ちません。答えようがないと思いませんか? -- 河童の屁は,河童にあらず,屁である。? 2011-08-12 (金) 22:52:06
  • エラーコードは下記です。
    > library(plm)
     以下にエラー library(plm) :
        'plm' という名前のパッケージはありません 
    > install.packages(plm)
     以下にエラー install.packages(plm) :
        オブジェクト 'plm' がありません 
    スペックと記載しましたのは、下段の内容についてです。 私のPCはWindows XP(32bit)でR2.13.1を使用しています。
    参照)https://r-forge.r-project.org/R/?group_id=406
    Logs: Linux x86_32 Linux x86_64 Windows x86_32/x86_64 MacOS X Leopard~ Daily build: patched patched patched | devel patched | devel (N/A)
    Daily check: offline* patched | devel offline* patched | devel (N/A)
    "plm"Zipファイルのダウンロードはできるのですが、  参照) http://cran.r-project.org/web/packages/plm/index.html
    「ローカルZipファイルからのインストール」を試みると下記のようなエラーメッセージが出ます。
    > utils:::menuInstallLocal()
     パッケージ 'plm' は無事に開封され、
     MD5 サムもチェックされました 
    > library(plm)
     要求されたパッケージ bdsmatrix をロード中です 
     エラー:  パッケージ 'bdsmatrix' を
               ロードできませんでした 
     追加情報:   警告メッセージ: 
    1:  パッケージ 'plm' はバージョン 2.13.1 の R の下で
        造られました  
    2: In library(pkg, character.only = TRUE, 
                  logical.return = TRUE, lib.loc = lib.loc) :
       'bdsmatrix' という名前のパッケージはありません 
    次に、'bdsmatrix'を同様にWebsiteからダウンロードし、 参照) http://cran.r-project.org/web/packages/bdsmatrix/index.html
    ローカルのZipファイルからインストールしようとしたところ、下段のようなエラーmsgが出ます。
    utils:::menuInstallLocal()
     以下にエラー gzfile(file, "r") :
        コネクションを開くことができません 
     追加情報:   警告メッセージ: 
    In gzfile(file, "r") :
       圧縮されたファイル 'bdsmatrix_1.0[1]/DE木SCRIPTION'
         を開くことができません,
       理由は 'No such file or directory' です 
    > utils:::menuInstallLocal()
     以下にエラー gzfile(file, "r") :
        コネクションを開くことができません 
     追加情報:   警告メッセージ: 
    In gzfile(file, "r") :
       圧縮されたファイル 'bdsmatrix_1.0[1]/DESCRIPTION' を
       開くことができません,
       理由は 'No such file or directory' です 
    尚、他の方法、とは、「解説書等を読み漁ってFEやREのプログラミング方法を検討しているが、それらも最終的にはplmパッケージのコードが必要になってなかなかうまくいきません。」という意味です。
    以上、宜しくお願い致します。 -- z? 2011-08-15 (月) 09:01:20
  • R 2.13.0, XP32bitだとインストール、読み込みともにできました。2.13.1をアンインストールし、2.13.0をインストールしてみてはいかがでしょうか -- 2011-08-15 (月) 10:43:34
  • 私は残念ながら Windows ではないので適切な対処法を伝えられるかどうか心許ないのですが。
    「 'bdsmatrix' という名前のパッケージはありません」といわれていることからもわかるように,plm は bdsmatrix のほかにも sandwich, MASS, Formula, nlme パッケージを必要とします。
    取りあえずは,まず bdsmatrix パッケージを先にインストールしてみてはいかがでしょうか? -- 河童の屁は,河童にあらず,屁である。? 2011-08-15 (月) 10:48:45
  • 有り難うございます。まずRを再インストールしたら、bdsmatrix をインストールできるようになりました。その後は、順にsandwich, MASS, Formula, nlmeがインストールでき、plmも利用できるようになりみあした。コメントを誠に有り難うございました! -- z? 2011-08-15 (月) 11:55:21
  • ちなみに、再インストールした場合、Rは2.13.1でも大丈夫でした :) -- ? 2011-08-15 (月) 11:56:51

混合モデルの重回帰

酔鯨? (2011-08-12 (金) 17:05:34)

使用しているOS=Windows XP Rのバージョン=2.10.0
独立変数が、定量データと定性データが存在する混合モデルを重回帰分析をしました。定性データは(0,1)の2値データです。この場合は、重回帰データとして同じ扱いが出来ると市販本に書かれていたので、AIC最小モデルを変数減増法と群馬大青木先生の総当り法で求めました。結果は同じになりました。定性データは、最小モデルには残りませんでした。
単回帰の結果では、定性データでモデルを別々にしなければならないという結果が出たのですが、重回帰の方法に誤りは無いでしょうか?

  • すみません。言葉を間違えました。.関数ではありません。去年もd <- as.dist(data) というコマンドを使っていて、そのときのものをコピーしたらできたということです。「再現できる状況を提供」というのは、データを転記するということでしょうか?次回から気をつけます。最新バージョンも入手しておきます。 -- 2011-08-12 (金) 21:19:56
  • 上のコメントを書かれた人はたぶん間違って書かれたのだとは思いますが、質問に対する回答になっていませんので削除をお願いします。 -- 酔鯨? 2011-08-17 (水) 12:42:18

RMA回帰の予測区間について

ryuji? (2011-08-11 (木) 23:37:05)

現在、ある昆虫の体の一部から体長を推定するために、これまで採集した標本をもとにRMA回帰を求めました。そこまではRを使ってできたのですが、実はこの昆虫の死骸が多く見つかるため、一体これらの死骸の体長がどのくらい大きさであったかを推定したいと思っております。そこでRMA回帰に代入して体長を求める前に、予め予測区間内に入るかどうか、グラフで表示しておきたいのですが、その方法が分かりません。超初心者で申し訳ないのですが、ご教授願えないでしょうか?よろしくお願いいたします。

  • 何がしたいのかさっぱりわかりません。もう少し具体的な質問した方が良いですよ。予測区間って何ですか?何をグラフで表示したいのですか? -- さより? 2011-08-12 (金) 03:22:54
  • RMA は説明変数が1変数の場合だけだし,あまり細かい吟味はありませんね。単純な予測を行うだけの分析方法だと言えるでしょう。
    直線回帰においては,予測値の期待値の信頼区間,予測値の信頼区間,については http://aoki2.si.gunma-u.ac.jp/lecture/Soukan/pearson.html の後半に書かれていますね。予測区間ですが,これは何だろう?定義の日本語はなんか変だけど。いずれにしろ,RMA では定義されていないのかな? -- 河童の屁は,河童にあらず,屁である。? 2011-08-12 (金) 08:16:02
  • ありがとうございます。予測区間では意味が通りませんでした。私が今やりたいことは、RMA回帰直線と、その95% confidence intervalおよび95% prediction intervalをグラフで表す事ができるのかを教えていただきたかったのです。ただ、河童様が言われるようにRMAでは定義されていないのかもしれません。 -- ryuji? 2011-08-12 (金) 23:30:08

cannot coerce type 'closure' to vector of type 'any' というメッセージ

tavia? (2011-08-11 (木) 20:46:50)

お世話になります。

Rを使って、クラスター分析をしようとしています。
データの読み込みまではできるのですが、その後
d <- as.dist(data)
を実行すると、

以下にエラー as.vector(x, mode) : 
 cannot coerce type 'closure' to vector of type 'any'

というメッセージが出ます。
このようなメッセージが出たら、どういうところをチェックすればよいでしょうか。
教えていただければ幸いです。

Rのバージョンは2.10.1
OSはWindows Vista Business S.P.2
です。
よろしくお願いいたします。

  • すみません。去年同じ処理をしたときに使った関数を使ったら、なぜかできました。同じに見えるのですが、何かゴミがついていたのかもしれません。それにしてもエラーの意味は知りたいので、どなたかご存知でしたらお願いいたします。 -- tavia? 2011-08-11 (木) 21:47:12
  • 再現できる状況を提供しないと,何が原因か特定するためには,あなたのコンピュータで同じことをやってみるしか方法がないということが分かりませんか?
    それを避ける(そのようなことをしないで済ませる)には,十分な情報の提供が必要なんですよ。
    > 去年同じ処理をしたときに使った関数を使ったら
    え,どんな関数を使ったというのですか?あるいは,バージョンが違ったとか?
    それにしても,現在の最新バージョンはR 2.13.1 なので,あまり古いバージョンで不都合があったといわれても,最新バージョンで同じ不都合があるとは限らないので,不都合があった場合は,最新バージョンにアップデートして状況が変わらないのかどうかということを試してからクレームを付けるなりしてください。古いバージョンでどうのこうのは,追試できる人も限られてきますし,古いバージョンでの結果は重要性が低いことは誰も納得すると思います。 -- 河童の屁は,河童にあらず,屁である。? 2011-08-11 (木) 22:43:31
  • ありがとうございました。まさに私が行いたかった事です。この関数で上手く行きました。できれば、この関数でfunction以下の意味を説明してくださると有難いです。 -- Wombat? 2011-08-12 (金) 08:28:39
  • すみません。言葉を間違えました。.関数ではありません。去年もd <- as.dist(data) というコマンドを使っていて、そのときのものをコピーしたらできたということです。「再現できる状況を提供」というのは、データを転記するということでしょうか?次回から気をつけます。最新バージョンも入手しておきます。 -- 2011-08-12 (金) 08:57:17

configure で失敗してしまいます。

nob? (2011-08-11 (木) 11:31:15)

Rそのものは超初心者ですが、結構前から使っています。
Plamo Linux 4.7.3でのつまずきです。
いつもパッケージをCRANからダウンロードしてconfigure、make、make install でシステムをインストールしています。が、plamo Linuxのバージョンを4.7.3にしたら、
checking for xmkmf... /usr/X11R7/bin/xmkmf
configure: WARNING: I could not determine FPICFLAGS.
configure: error: See the file doc/html/R-admin.html for more information.
で止まってしまいます。2.13ばかりでなく古いバージョンも同様です。こちらのHPを見たらconfigureで失敗した場合不足しているものをconfig.logで確認して再度configureせよとのことだったのですが見ても何が不足なのかよくわかりません。
どなたか同じような件で解決された方がおりましたら、どのように解決されたか教えていただけないでしょうか?
よろしくお願い致します。

  • エラーセージを検索されましたか?SUSEのケースですがこれとか。 -- 2011-08-11 (木) 12:03:44
  • 検索はしました。が、英語のばかりだったので見ないで避けていました。もう少し腰を落ち着けて調べてみようと思います。有難うございます。 -- nob? 2011-08-11 (木) 13:38:00
  • gfortranのバージョンを4.3.5にアップしたら解決しました。お騒がせしました。 -- nob? 2011-08-12 (金) 13:33:22

グループごとに各質問項目の答えの頻度を計算する方法

Wombat? (2011-08-10 (水) 12:18:35)

R超初心者です。御回答よろしくお願いします。以下のようなデータがあります。

     ID class Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q11 Q15
1     1     a  5  4  4  4  4  2  4   4   5
2     2     a  4  4  3  3  4  4  3   4   2
3     3     a  4  4  3  5  4  4  3   4   5
4     4     a  4  4  1  3  3  4  5   3   5
5     5     a  5  4  1  5  5  3  2   4   4
6     6     a  4  4  4  4  4  2  1   2   1
7     7     a  5  4  2  2  4  3  4   4   2
8     8     a  4  4  2  5  4  3  3   4   3
9     9     a  4  4  2  3  3  4  3   5   5
10   10     a  5  4  4  4  5  3  3   4   4
11   11     a  4  3  2  3  2  3  1   3   3
12   12     a  3  2  3  4  3  5  4   3   2
13   13     a  5  4  2  4  4  4  5   4   4
14   14     a  3  3  4  3  4  3  1   3   2
15   15     a  4  4  3  4  4  4  4   4   3
16   16     a  5  3  2  4  4  3  3   5   5
17   17     a  4  4  2  4  3  3  4   3   3
18   18     a  4  4  2  2  4  3  2   3   4
19   19     a  5  4  4  4  4  2  5   4   5
20   20     a  4  4  3  4  4  5  4   4   5
21   21     a  4  4  1  4  3  4  4   4   2
22   22     a  4  3  2  3  3  5  3   3   3
23   23     a  4  3  3  3  4  3  3   4   3
24   24     a  5  4  1  4  4  4  4   4   2
25   25     a  4  4  3  4  4  5  4   3   3
26   26     b  4  4  1  4  4  5  3   5   5
27   27     b  5  4  3  4  3  3  3   4   3
28   28     b  4  3  2  4  3  5  4   3   2
29   29     b  4  4  2  3  3  4  4   4   2
30   30     b  4  4  2  3  4  4  3   4   3
31   31     b  4  4  4  3  4  4  2   4   4
32   32     b  4  4  4  4  3  4  3   4   3
33   33     b  4  4  4  3  3  4  4   3   3
34   34     b  4  4  5  3  3  4  3   3   3
35   35     b  5  4  3  4  4  3  3   4   4
36   36     b  4  3  1  3  3  4  5   3   1
37   37     b  4  4  5  4  3  4  4   4   2
38   38     b  4  4  5  2  2  4  2   3   3
39   39     b  4  4  4  4  3  4  2   4   3
40   40     b  4  4  3  4  4  3  3   4   4
41   41     b  4  3  2  3  3  4  4   4   2
42   42     b  5  3  3  4  3  4  5   3   2
43   43     b  4  3  2  3  4  5  5   4   5
44   44     b  4  2  3  3  3  4  3   3   3
45   45     b  4  4  3  5  3  3  5   4   1
46   46     b  4  4  3  3  5  4  5   4   4
47   47     b  4  4  3  4  3  4  4   4   2

Q1からQ11の数値はリッカートスケール(5が強く思う〜1全くそう思わない)です。この表ではグループ(Class)はaとbしかありませんが、実際のデータではdまであります。例えば、aクラスにおけるQ1における数値の頻度は> table(dat01[1:25,3])で求めることができことは「Rによるやさしい統計書」インターネットでわかりました。しかし、この方法では時間がかかってしまうので、これを一度にグループことの各質問項目におけるリッカートスケールの数値の頻度を求めるにはどのような関数を使えば良いのか教えてください。

  • すみません、補足です。OSはWindows XPでRはVersion 2.13.1です。 -- 2011-08-10 (水) 12:37:33
  • sapplyなど、apply系の関数でできます。 -- 2011-08-10 (水) 13:18:58
  • ありがとうございました。私の質問の仕方が悪かったと思いますが、このデータににおける具体的な式まで教えてくださると助かります。 -- Wombat? 2011-08-10 (水) 13:41:26
  • 私なら次のようにします -- 2011-08-10 (水) 14:01:28
    > dat01 <- data.frame(ID=1:47,class=c(rep('a',25),rep('b',22)),
                                 Q1=sample.int(5,size=47,replace=TRUE),
                                 Q2=sample.int(5,size=47,replace=TRUE))
    > apply(dat01[,3:4],2,function(x){tapply(x,dat01$class,table)})                  
    $Q1
    $Q1$a
    
     1  2  3  4  5 
     3 10  1  5  6 
    
    $Q1$b
    
    1 2 3 4 5 
    4 7 3 4 4 
    
    
    $Q2
    $Q2$a
    
    1 2 3 4 5 
    6 4 2 7 6 
    
    $Q2$b 
    
    1 2 3 4 5 
    2 5 4 4 7 
    Q1とQ2しかサンプルを作っていませんが、実際に使うときには適宜読み替えてください。
  • 丁寧な解説がりがとうございました。この式でやってみますが、もう1つ質問させて下さい。あれから自分でもやってみて apply(data01[,3:11],table)という式でQ1からQ11までの各質問項目の頻度を出すことはできましたが、この式に書き加える形でクラス別のものをできないでしょうか。 -- Wombat? 2011-08-10 (水) 14:42:08
  • これらはリッカートスケールではないので注意。
    クラス別に集計するというのは,クラスと項目のクロス集計をすればよいということ(コンパクトに結果が出るし)。
    あなたのデータを d という名前のデータフレームに読み込んだとして以下のように。 -- 河童の屁は,河童にあらず,屁である。? 2011-08-10 (水) 17:07:25
    > d <- read.table("data01.dat", header=TRUE)
    > sapply(d[3:11], function (x) table(d$class, x))
    $Q1
       x
         3  4  5
      a  2 15  8
      b  0 19  3
     
    $Q2
       x
         2  3  4
      a  1  5 19
      b  1  5 16
       : 以下略
  • ありがとうございました。私が正におこないたかったことです。この関数で上手く行きました。できれば、関数のfunction以下の式を説明してくださると有難いです。よろしくお願いします。 -- Wombat? 2011-08-12 (金) 08:33:09

grepで検索元の単語に「ー」が含まれていても正しく検索できる方法について

ひろ? (2011-08-09 (火) 18:14:41)

grepコマンドの実行で,検索元(パラメータ1)の単語の中に「ー」が含まれていると下記通りエラーメッセージが表示されて失敗だと失敗します.他の「日」「月」「年」といった言葉であれば問題なく検索できました.

検索元の単語に「ー」が含まれていても正しく検索できる方法はございますでしょうか?

grep("リー","あ","い","う","え")

以下にエラー grep("リー", "あ", "い", "う", "え") : 
  "リー" は不正な正則表現です, 理由は 'Missing ']''
  • 質問するときには,コンソールに入力されたものをそのまま,コピーしてペーストしてください。grep の使い方がおかしいというか,grep("リー","あ","い","う","え") と入力してもそのようなエラーにはなりませんけど。って,あなたの OS, R のバージョンもわからないのだけど。
    関係ないけど,「正則表現」というのは「正規表現」の間違いじゃ?エラーメッセージの日本語化の段階で間違えた?
    Mac OSX 10.7, R 2.13.1 だと,以下のようになりますけどねぇ。 -- 河童の屁は,河童にあらず,屁である。? 2011-08-09 (火) 21:15:55
    > grep("リー", c("スリー","い","リード","え"))
    [1] 1 3
  • Windows (CP932)の話ですね.それ以外のOSなら河童さんの仰る通りに動作します.上の例を拝借するなら,grep("リー", c("スリー","い","リード","え"),fixed = TRUE) -- [[ ishida ]] 2011-08-09 (火) 21:57:56
  • ishida先生.私の記入(OS,version)の不足を推測して頂き,的確な回答をありがとうございました.先生のコード通り実行したら期待通りの結果を得られました.helpをみるにfixedによって正則表現(regular expression)ではなく,純粋な文字列として扱うという意味なのだと思いました. -- ひろ? 2011-08-10 (水) 15:52:49
  • 環境はwin7(32),R-2.13.0でした.記入しておらずお手数をおかけいたしました.上記は結果そのままをコピーしたのですが,私も最初なんで正規表現ではなく,正則表現なのかと思いました. -- ひろ? 2011-08-10 (水) 15:55:44
  • regularを「正則の」と訳すのは数学屋さんですね。 -- 2011-08-11 (木) 15:46:06

Rコマンダーで日本語が使えません

nappa? (2011-08-04 (木) 12:50:45)

下記のように日本語があると「不正なマルチバイト文字があります」と表示され、うまく動作しません。コメントなのですがダメです。以前は大丈夫だったのですが、エンコードの仕様が変わったためでしょうか?
対策がありましたら、教えてください。

#サンプル
x <- 2
x

R Version:  2.13.1
RコマンダーVersion:  1.6-4
  • あなたの OS は? ファイルから読むのですか? だとしたら今のエンコーディングは? エンコーディングを UTF-8 にしたらどうなりますか? -- 河童の屁は,河童にあらず,屁である。? 2011-08-04 (木) 14:25:14
  • OSはWindowsXPです。ファイルから読むのではなく、直接スクリプトを記述しています。 -- nappa? 2011-08-04 (木) 17:06:36
  • nappaさんに限りませんが、何をどうしたらどうなったのかを伝わるように説明できない人だと、目の前で実際に操作してエラーを再現してもらわない限り助言のしようがありませんね。インターネットを通じてではなく、実際に会えるRユーザに助言を求めるしかないでしょう。少なくとも私にはnappaさんが何をして「不正なマルチバイト文字があります」とエラーが出たのかさっぱり分かりません。河童さんの提案にも無反応だし。役に立たないコメントですみません。 -- 2011-08-10 (水) 13:45:25

パッケージ"adapt"がインストールできません

しげ? (2011-08-03 (水) 16:04:22)

パッケージ"adapt"をインストースしようとすると

In getDependencies(pkgs, dependencies, available, lib) :
  package ‘adapt’ is not available (for R version 2.13.1

と警告メッセージが出てインストールできないのですが、どのようにしたらインストールできるようになりますか?使用環境は

> sessionInfo()
R version 2.13.1 (2011-07-08)
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     

other attached packages:
[1] rgl_0.92.798

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

です。かなり初歩的なことだと思いますが、教えてもらえると嬉しいです。よろしくお願いします!

小数点のデータをrankでソートできますか?

ひろ? (2011-07-29 (金) 16:01:26)

小数点(ex 4.564e-05, 4.234e-02 etc.)のデータセットはrankでソートできないのでしょうか?これをソートすると正しく順序づけられなく困っております.並び替える方法はございますでしょうか?お知恵をお貸いただけますでしょうか?

■ コマンド
res.sorted <- res[rank(res$D),]
データセットresの中のD(eviance)の列は小数点データで,これをrankコマンドで昇順に並べた添え字リストを得て,resを並び替えた結果をres.sortedに入れようとしています.

  • ソートしたいのなら,何故素直に sort 関数を使わないのですか。また,せめて rank 関数ではなく order 関数を使うべきではないですか。rank と order の違いはご存じですか?
    今回の質問は,以上で片付くと思いますが,今後のために。質問するときは,どのようにうまくいかないのか,はっきり書くべきでしょう。うまくいかない例(データ数5,6個で用意できるでしょう?)を挙げておくと,問題がはっきりします。res.sorted=res[rank(res$D),] なんて書かれても,res$D がどんなのかわからないので,何の情報もないでしょう? -- 河童の屁は,河童にあらず,屁である。? 2011-07-29 (金) 17:12:27
  • 回答ありがとうございました.契約上データをお見せできず,サンプルも用意できず失礼しました.用語の理解が足りてませんでしたが,よく読んでsortにて期待した結果を得ることができました.ありがとうございました. -- ひろ? 2011-07-29 (金) 18:15:55

ピーク面積の求め方

どぜう? (2011-07-26 (火) 10:41:16)

 お世話になっております。過去ログにも無いようですので、質問させてください。
 とあるスペクトルデータがあり、ピーク面積を求めたいのです。前処理でバックグランドデータを引いたデータを用意するまではよかったのですが、ピークのあるチャンネル番号や、そのピークが囲む面積(ピクセル数?)の求め方が分かりません。
 よろしくお願い申し上げます。

  • あなたにとっては、なんのこともない、スペクトルデータとかピーク面積とか、バックグラウンドデータを引くとか、ピークのあるチャンネル番号とかも、わからない人もたくさんいるでしょう。そのような言葉ではなく、一般的な言葉で説明できませんか?たとえば、ピーク面積ってえのは、折れ線とx軸で囲まれた面積のことなんですか?だとすれば、折れ線の角を通る垂直線で分割した三角形や台形の面積の和ということになるのでは? -- 河童の屁は,河童にあらず,屁である。? 2011-07-26 (火) 13:39:07
    peak.png
  • すみません。絵の貼り方が分からなくて・・・。お示しいただいた絵はとても的を射ています。ただ、曲線でできていて、とがったところが1つだけでなく、色んな高さや太さのとがったものが、もっとたくさんあるものです。 -- どぜう? 2011-07-27 (水) 16:33:59
  • > 曲線でできていて、とがったところが1つだけでなく、色んな高さや太さのとがったものが、もっとたくさんあるものです
    図は模式的なものです。曲線でできていてというのは,横座標が細かいので曲線に見えるだけで拡大すれば折れ線なのでは?だったら,解法は上の通りなのでは?
    下の図は,1630の座標点からなる曲線。拡大すればただの折れ線グラフ。
    図の投稿法がわからないということなら,投稿フォームの前に「投稿する前にまず [heart] 投稿文書の書式 [heart] を読んでください」と書いてあることに注意を払うべきですね。 -- 河童の屁は,河童にあらず,屁である。? 2011-07-27 (水) 16:46:42
    peak2.png
  • ありがとうございます。おっしゃる通りです。面積は、グラフ各点のy値を足し合わせることにします。ピーク値は、simecolというパッケージのpeaksというコマンドを使ってみようと思います。 -- どぜう? 2011-07-27 (水) 17:47:54
  • > 面積は、グラフ各点のy値を足し合わせることにします
    ではだめですよ。台形(三角形)の面積の和ですからね。
    x <- 0:4*0.25 # 等間隔であるとする
    y <- c(0, 4, 10, 7, 2)
    plot(x, y, type="l", yaxs="i")
    polygon(c(x, rev(x)), c(y, rep(0, 5)),
            col="#00FF0040")
    abline(h=y, lty=3)
    segments(x, y, x, rep(0, 5))
    両端が三角形でも,三角形は上底(下底_が0の台形なので,面積は
    (y[1]+y[2])*0.25/2 + (y[2]+y[3])*0.25/2 + (y[3]+y[4])*0.25/2 + (y[4]+y[5])*0.25/2
    これをまとめると,y 座標値の和の 2 倍から両端の y 座標値を引いて台形の高さ(x座標値の間隔)を掛けて 2 で割るのと同じ
    (2*sum(y)-y[1]-y[5])*0.25/2
    答えは 5.5 になる。 -- 河童の屁は,河童にあらず,屁である。? 2011-07-27 (水) 19:04:43
    peak3.png
  • 重ね重ね、丁寧な回答をいただきありがとうございます。非常に参考になりました。 -- どぜう? 2011-07-27 (水) 20:27:51
  • splancsライブラリのareapl関数を使ってみたらよいのでは。自分もこんな関数は知らなかったのですが、面積(area)なので、??areaで関連トピックを検索 → 使えそうな関数を探すというのが楽です。 -- 通りがかり? 2011-07-28 (木) 11:25:27
  • 上の方の,1630 点からなる曲線下面積を,areapl で求めるのと,ちょっと頭をひねった方法で求めるのと,どちらが速いか勝負した。
    areapl は一々関数を呼ぶのでそのオーバーヘッドも問題にならないのだろうが,惨敗。
    また,閉曲線でないと倍も時間がかかるのも意外。
    別の所にも書いてあるが,30時間かかるものが1時間で終わると嬉しいが,30秒かかるのが1秒でできても嬉しくない(今回のように,1万回やっても 0.068 秒しかかからないものが,2.586 秒かかっても,痛くもかゆくもない)。それよりも,あるかないかわからない関数を探すより,考えたり自分で書く方が「速い」し「早い」こともある。 -- 河童の屁は,河童にあらず,屁である。? 2011-07-28 (木) 15:36:14
    > delta.x <- x[2]-x[1] # x 座標の間隔
    > sum(y)*delta.x
    [1] 3.803799
    > system.time(for (i in 1:10000) sum(y)*delta.x)
       ユーザ   システム       経過  
         0.068      0.001      0.069 
    > polygon <- cbind(x, y) # 開曲線
    > areapl(polygon)
    [1] 3.803799
    > system.time(for (i in 1:10000) areapl(polygon))
       ユーザ   システム       経過  
         4.943      0.211      4.643 
    > polygon2 <- cbind(c(x, 0), c(y, 0)) # 閉曲線
    > areapl(polygon2)
    [1] 3.803799
    > system.time(for (i in 1:10000) areapl(polygon2))
       ユーザ   システム       経過  
         2.586      0.123      2.337
  • areapl関数の紹介をありがとうございました。手は広い方がよいので、色々試してみます。 -- どぜう? 2011-08-04 (木) 10:41:05

差の検定について

Tau? (2011-07-21 (木) 22:41:07)

統計手法の選択についてご教示ください。
ある疾患が、1週目に4例、2週目に5例、3週目に6例、4週目に17例生じたとします。1週目から3週目までの疾患発症数の平均と4週目の疾患発症数の差を検定する場合は、t.testあるいはノンパラメトリックな手法(U.testなど)を用いて良いものでしょうか?(つまり、比較したい2群があって一方は複数のcaseがあり平均値が算出されるのに、他方は一つのcaseしかない場合です)
ご教示いただければ幸いです。

  • 疾患発生数の違いを,(4, 5, 6) と (17) の2群で行いたい(4週目が他より多いといいたい)ということですか?
    普通は,t 検定だの U 検定だのは選択せず,計数値の検定として取り扱うでしょう。発生数の一様性の検定でしょう。 -- 河童の屁は,河童にあらず,屁である。? 2011-07-22 (金) 06:52:13
    > chisq.test(c(4, 5, 6, 17))
    
    	Chi-squared test for given probabilities
    
    data:  c(4, 5, 6, 17) 
    X-squared = 13.75, df = 3, p-value = 0.003266
  • 河童様、ご返信ありがとうございます。おっしゃるとおり4週目のみ他の3週より多いと言うことを証明したいのです。カイ2乗検定を用いれば、1,2,3,4週の疾患発生が一様でないことは証明できそうですね。 1-3週の平均と4週の発生数を比較して4週目が多いと言うことを証明する方法はないものでしょうか?例えば発生数が4,5,12,17となった場合に、カイ2乗検定ではどの週が不均一性に関与したか判断がつきかねると思われますが、いかがでしょうか? -- Tau? 2011-07-22 (金) 08:06:48
  • > 1-3週の平均と4週の発生数を比較して4週目が多いと言うことを証明する方法はないものでしょうか?
    ないでしょう。例えば,あなたは t 検定を候補に挙げたけど,t.test(c(4, 5, 6), 17) とやってみれば不適切であることがわかるでしょう。というか,このデータに t 検定は考えられない。U 検定は,このデータ数では絶対に有意にならない。
    > カイ2乗検定ではどの週が不均一性に関与したか判断がつきかねると思われますが
    多重比較すればよいだけでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2011-07-22 (金) 10:54:56
  • 度々、ありがとうございます。t検定、U検定共に不適切であろう事は了解いたしました。実際、論文にあたると同様の結果を得るためにカイ二乗検定がなされておりました。勉強不足でした。1変量だけの場合の多重比較というのが、理解できません。大変恐縮ですが、具体例で教えていただけませんでしょうか?よろしくお願い申し上げます。 -- Tau? 2011-07-22 (金) 11:17:23
  • 念のため,何故「 t 検定は考えられない」のか述べておきます。先にも書いたように,このデータは計数データであり,「32個のデータ」があるのです。あなたが考えたように「週の疾患発生数」とした場合には,データ数は(4, 5, 6, 17) の 4 つしかないことになってしまいます。別に,それでもよいではないかと思うかも知れませんが,それは違う。
    二群の平均値の差の検定を行うためには,各群2つ以上のデータがないといけないので,t.test(c(4, 5, 6), c(7,8)) で説明しよう。この場合 p-value = 0.04942 となる。では,毎週の発生数を 10 倍したら P 値は幾つになるか。
    t.test(c(40, 50, 60), c(70, 80)) では,p-value = 0.04942 となる。この結果は,例えば検定に使った数値が長さを表すもので,最初の t.test(c(4, 5, 6), c(7,8)) はセンチ単位だったのを,t.test(c(40, 50, 60), c(70, 80)) ではミリ単位で表して検定したというようなこと。当然測定単位を替えただけで有意になったりならなかったりするわけはないので,この結果はあたりまえである。
    しかし,患者の発生数が (4, 5, 6, 7, 8) というのと (40, 50, 60, 70, 80) が同じ訳ではない。
    chisq.test では,前者では合計 30 人,後者では 300 人と,ちゃんとデータの数を考慮する。chisq.test(4:8) では p-value = 0.7968。chisq.test(4:8*10) では p-value = 0.002243 となる。 -- 河童の屁は,河童にあらず,屁である。? 2011-07-22 (金) 11:03:59
  • 1 変量だからどうこうの問題ではないでしょう。chisq.test(c(4, 17)); chisq.test(c(5, 17)); chisq.test(c(6, 17)) をやって,p-value が α/3 より大きいか小さいか見ればよいだけです。2 カテゴリーの場合には,binom.test の方がよいでしょうけど。 -- 河童の屁は,河童にあらず,屁である。? 2011-07-22 (金) 11:29:40
  • 詳細なご説明、誠にありがとうございます。理解できました。 -- Tau? 2011-07-22 (金) 13:05:38
  • 疾患の発症データに対して,ポアソン分布を適用することを考えると,母欠点数に関する2標本の差の検定で単位数の異なる場合を適用できると考えます.詳細については,例えば,永田著『入門 統計解析法』日科技連出版社の9.5節を参照してください. -- 2011-07-22 (金) 14:26:32
  • 上記の本を注文しました。勉強します。 -- Tau? 2011-07-22 (金) 20:55:06

propensity score matchingについて

sui?? (2011-07-14 (木) 15:45:22)

propensity scoreを用いたマッチングの手法について質問させて頂きます。
Rはver.2.13.1、Matching 4.7-14を用いています。
datasetはMaching package内の「lalonde」を用いています。
以下の通り、propensity scoreを算出します。

> library(Matching)
> data(lalonde)
> Y <- lalonde$re78
> Tr <- lalonde$treat
> glm1 <- glm(Tr~age+educ+black+hisp+married+nodegr+
              re74+re75, family=binomial, data=lalonde)

glm1$fittedがpropensity scoreです。 これを用いてMatchingを行います。

> rr1 <- Match(Y = Y, Tr = Tr, X = glm1$fitted)
> summary(rr1)

Estimate...  2624.3 
AI SE......  802.19 
T-stat.....  3.2714 
p.val......  0.0010702 

Original number of observations..............  445
Original number of treated obs...............  185 
Matched number of observations...............  185 
Matched number of observations  (unweighted).  344 

サマリーを見ると185例でMatchingが行われたようですが、Matchig後のデータセットを表示したいと考えております。お分かりの方がいらっしゃいましたら教示頂けませんでしょうか?
よろしくお願い申し上げます。

  • Match のオンラインヘルプは読みました? また,str(rr1) で,何が返されるか見ました?
    上の例でいえば,lalonde[rr1$index.treated,] と lalonde[rr1$index.control,] なのでは? -- 河童の屁は,河童にあらず,屁である。? 2011-07-14 (木) 16:25:57
  • 河童様、早速のコメント誠にありがとうございます。オンラインヘルプは読んだのですが、ほとんど理解できていない状態でした。確認すると確かに記載がございました。申し訳ございませんでした。lalonde[rr1$index.treated,] と lalonde[rr1$index.control,] でtreat群とcontrol群のdata setが表示されるのは理解できました.ありがとうございました。ただ、このdata setを見ると一つの症例が複数回にわたって選択されています。デフォルトではone to oneのmatchingになるはずですが、どのように解釈すれば良いのでしょうか? -- sui?? 2011-07-14 (木) 20:47:11
  • 上記の件ですが、optionでtiesをFALSEにすれば、良いようでした。すみませんでした。もう一点ですが、Matchingさせるscoreの差の許容範囲を設定する項目はoptionのdistance.toleranceで良いのでしょうか?ご教示いただければ幸いです。-- sui?? 2011-07-14 (木) 21:18:10
  • > Matchingさせるscoreの差の許容範囲を設定する項目はoptionのdistance.toleranceで良いのでしょうか?
    聞くより,オンラインヘルプをよく読んで,試してみて,期待通りの結果になればそれでよいのでは? -- 河童の屁は,河童にあらず,屁である。? 2011-07-14 (木) 22:00:18
  • 河童さん、コメントありがとうございます。おっしゃる通りですね。試してみます。先ほどの一つの症例が複数回選ばれる点についてですが、ties=FALSEにすることでtreat群は複数回選ばれることがなくなりましたが、treat群 185例に合わせるために、control群が複数回選択されています。オンラインヘルプも参照したのですが、treat群、control群共に同一症例が選ばれないようにする方法が分かりません。おわかりになる方がいれば教えて頂けませんでしょうか?よろしくお願い申し上げます。 -- sui?? 2011-07-14 (木) 22:39:20
  • 私は,この関数を使う必要がないので,正しい使い方を知る必要がない(何が正しいかも知らない)。にもかかわらず,オンラインヘルプを読めば,replace=FALSE にすればよいのではないかなあと思う。やってみて,それが期待する結果かどうかは,あなたなら判定できるだろう。
    それが正しいとして,ヘルプに Matching without replacement will generally increase bias. と書かれていることに注意。 -- 河童の屁は,河童にあらず,屁である。? 2011-07-14 (木) 23:03:17
  • 河童様、度々ありがとうございます。おっしゃる通り、replace=FALSEで同一症例の重複はなくなりました。同一症例を用いないことが一般的であると考えていたので、この手法でbiasが増すという理由は分かりません。勉強します。この手法をRで使用する道筋ができたと思います。感謝申し上げます。 -- sui?? 2011-07-14 (木) 23:29:06
  • > この手法でbiasが増すという理由は分かりません
    重複して選択しない(後の方にもっと適切なデータがあるかも知れないのに,出てきた順にマッチングする)ので,最適マッチングではない可能性が高いということでは?
    使わねばならない人は,勉強してから使ってください。 -- 河童の屁は,河童にあらず,屁である。? 2011-07-14 (木) 23:33:51
  • おっしゃるとおりです。勉強します。 -- sui?? 2011-07-15 (金) 08:01:41

行列データの修正

内藤? (2011-07-14 (木) 10:28:10)

以下の行列データがあります(本物はもっとデータが大きい)

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    0    0    0    0    0    0    0    0    0     0
 [2,]    0    0    0    0    0    0    0    0    0     0
 [3,]    0    0    0    1    0    0    0    0    0     0
 [4,]    0    0    0  999    0    0    0    0    0     0
 [5,]    0    0    0  999    0    0    0    0    0     0
 [6,]    0    1    0  999    0    0    0    0    0     0
 [7,]    0    1    0  999    0    0    0    0    0     0
 [8,]    0    1    0  999    0    0    0    0    0     0
 [9,]    0    1    0  999    0    0    0    0    0     0
[10,]    0  999    0  999    0    0    0    0    0     0
[11,]    0  999    0  999    0    0    0    0    0     0
[12,]    1  999    0  999    0    0    0    0    0     0
[13,]    1  999    0  999    0    0    0    0    0     0

999以降の列データを2を8個,3を10個というようにプログラムで変更したいのですが,上手くいきません。
初歩的な質問で申し訳ありませんが,上手いやり方を教えてください。

  • 質問が正確ではないのですが,例えば,4列目の4行目から13行目の10個の999を2を3個,3を5個,4を2個で順に置き換える場合には,
    x[4:13, 4] <- rep(2:4, c(3, 5, 2)) # x[4:13, 4] <- c(rep(2, 3), rep(3, 5), rep(4, 2)) と同じ
    のようにしますけど...
    何行何列にあるか何個あるかもわからないときにどうするかというようなことですか?そのような場合なら,もっと条件を明確に示さないと(データ例を示しただけでは不十分。何の足しにもならない)実際のプログラムを示すことができませんよ。 -- 河童の屁は,河童にあらず,屁である。? 2011-07-14 (木) 11:54:07
  • 言葉が足りませんでした。10行1000列のデータで列には上図のように0⇒1⇒999という順になっています。それぞれが何個あるかはわかりません。このような行で,999が出現したら,999を順に2を8個,3を10個,4を20個というようにデータを変換したいのです。 -- 内藤? 2011-07-14 (木) 12:31:41
  • まだ仕様が不十分です。置き換えるのはいつも「順に2を8個,3を10個,4を20個」なんですか(そうじゃないと思うけど),そうでないなら,この置き換えベクトルはどのように決まるのか(どの列でも同じ?な訳ないと思うけど),999の数と置き換えベクトルの要素数は必ず同じ?(でないとするとそのようなときにはどう対処する?)などなど,実際にプログラムを書こうとしても,分からないことだらけなんですよ。 -- 河童の屁は,河童にあらず,屁である。? 2011-07-14 (木) 13:16:12
  • また,説明が足りませんでした。
    下記のプログラムを作成したのですが,CORR[i,j]の各列の999の最初の出現する行からt1個数まで2,そこからt2個まで3,そこからt3個まで4,それ以上は5と修正したいのです。999など与えずに,最初の繰返し計算で上記が可能であればいいのですが。 -- 内藤? 2011-07-14 (木) 14:05:41
    # 乱数発生数
    k <- 100
    # 解析年数
    n <- 50
    ###### データ入力(塩化物イオン拡散予測) ########
    C0 <- rweibull (k,   2.600, 9.631)
    D  <- rlnorm   (k, -17.454, 0.995)
    d  <- 6.85
    ###### データ入力(腐食環境) ####################
    a   <- 1500
    c   <- 0.005
    alf <- 220
    fai <- 1.3
    Fe  <- 7850
    ################################################
    # 誤差関数の設定
    erf <- function(x) 2 * pnorm(x * sqrt(2)) - 1
    # 塩化物配列の設定
    C <- matrix(0, n, k)
    ###### 塩化物拡散予測 ##########################
    for (i in 1:n) {      
      for (j in 1:k) {  
         C[i,j] <- C0[j]*(1-erf(d/(2*sqrt(D[j]*
                          i*31536000))))
      } 
    }
    ###### 鉄筋腐食予測(年数予測) #################
    t1 <- round((a/alf)*log(0.01/((4*a*c)/(fai*Fe))))
    t2 <- round((a/alf)*log(0.05/((4*a*c)/(fai*Fe))))
    t3 <- round((a/alf)*log(0.20/((4*a*c)/(fai*Fe))))
    
    # 劣化度の配列設定
    CORR<- matrix(0, n, k)
    ###### 劣化度設定 ##############################
    for (j in 1:k) {
      for (i in 1:n) {
        if (C[i, j] < 1.2) CORR[i, j] <- 0
          else if(C[i, j] < 2.0) CORR[i, j] <- 1
           else CORR[i, j] <- 999
      }
    }
    ################################################
  • 投稿方法も確かめておいた方がよいですよ。(プログラムの書き方も)
    以下のようにすれば取りあえず目的は達する。
    ifelse のくり返し部はもっとスマートに書くこともできるが,まあこの程度で。 -- 河童の屁は,河童にあらず,屁である。? 2011-07-14 (木) 14:24:45
    set.seed(123456789) # ★(テスト用)
    # 乱数発生数
    k <- 100
    # 解析年数
    n <- 50
    ###### データ入力(塩化物イオン拡散予測) ########
    C0 <- rweibull (k,   2.600, 9.631)
    D  <- rlnorm   (k, -17.454, 0.995)
    d  <- 6.85
    ###### データ入力(腐食環境) ####################
    a   <- 1500
    c   <- 0.005
    alf <- 220
    fai <- 1.3
    Fe  <- 7850
    ################################################
    # 誤差関数の設定
    erf <- function(x) 2 * pnorm(x * sqrt(2)) - 1
    # 塩化物配列の設定
    C <- matrix(0, n, k)
    ###### 塩化物拡散予測 ##########################
    for (i in 1:n) {      
      for (j in 1:k) {  
         C[i,j] <- C0[j]*(1-erf(d/(2*sqrt(D[j]*i*
                                31536000))))
      } 
    }
    ###### 鉄筋腐食予測(年数予測) #################
    t1 <- round((a/alf)*log(0.01/((4*a*c)/(fai*Fe))))
    t2 <- round((a/alf)*log(0.05/((4*a*c)/(fai*Fe))))
    t3 <- round((a/alf)*log(0.20/((4*a*c)/(fai*Fe))))
    t12 <- t1+t2   # ★
    t123 <- t12+t3 # ★
    
    # 劣化度の配列設定
    CORR<- matrix(0, n, k)
    ###### 劣化度設定 ##############################
    for (j in 1:k) {
      nn <- 0 # ★
      for (i in 1:n) {
        if (C[i, j] < 1.2) CORR[i, j] <- 0
        else if(C[i, j] < 2.0) CORR[i, j] <- 1
        else { # ★ ここから
          nn <- nn+1
          CORR[i, j] <- ifelse(nn <= t1, 2,
                        ifelse(nn <= t12, 3,
                        ifelse(nn <= t123, 4, 5)))
        } # ★ ここまで
      }
    }
    ################################################
  • ありがとうございます。昨日から色々やってみたのですが,混乱して上手くいきませんでした。大変助かりました。投稿の仕方も以後気をつけます。 -- 内藤? 2011-07-14 (木) 14:52:34
  • ちなみに,塩化物拡散予測の部分は,以下のように for ループ無しで書けます。 -- 河童の屁は,河童にあらず,屁である。? 2011-07-14 (木) 15:02:45
    C <- d/(2*sqrt(D*t(row(C)*31536000)))
    C <- t(C0*(1-erf(C)))
  • 上記のプログラムの後処理で各年(列)の0,1,2,3,4,5の個数を数えて,これをデータ保存したいのですがどうすればよいでしょうか? -- 内藤? 2011-07-15 (金) 18:06:12
  • 最も簡単には apply(CORR, 2, table) とする。ただし,やってみればわかるように,あなたがこの結果に満足するとは思えないので,以下のようにする。 -- 河童の屁は,河童にあらず,屁である。? 2011-07-15 (金) 18:58:12
    result <- t(apply(CORR, 2, function(x) {
    	a <- table(x)
    	b <- numeric(6)
    	b[as.integer(names(a))+1] <- a
    	return(b)
    }))
  • ありがとうございます。お察しのとおり,意味がわからないのでちょっと考えて見ます。 -- 内藤? 2011-07-15 (金) 19:28:37
  • 理解できました。上記のapply(CORR,1,に変更したら上手くいきました。 -- 内藤? 2011-07-15 (金) 20:25:50
  • > 各年(列)の0,1,2,3,4,5の個数を数えて
    とあったのをみて,年が行か列かどっちだったか確認せずに,(だって,わざわざ(列)って書いてあるんだもんね,いちいち前に戻って確認する気にならない)プログラムを書いたんですわ。 -- 河童の屁は,河童にあらず,屁である。? 2011-07-15 (金) 21:32:28
  • Rで面グラフは描けるのでしょうか?色々検索したのですが,見つかりません。 -- 内藤? 2011-07-15 (金) 22:37:19
  • > Rで面グラフは描けるのでしょうか?
    プログラミング言語だからなんだってできますよ。プログラムさえ書けば。
    > 色々検索したのですが,見つかりません。
    あるかどうかわからないものを探すよりプログラムを書く方が早いでしょう。
    上で作った result を図示したいということでしょうかね。骨格部分は以下の通り簡単至極なものなのです。後は,あなたが必要とする仕様に対応するためにお化粧すればよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2011-07-15 (金) 23:12:31
    result2 <- t(apply(result, 1, cumsum)) # 面グラフを描くために数値を積み上げ
    result2 <- cbind(rep(0, nrow(result2)), result2) # 基準線(0)を追加
    plot(c(1, nrow(result2)), range(result2), type="n") # plot 枠
    for (i in 2:ncol(result2)) { 隣り合う2列が構成する多角形を塗りつぶす
    	polygon(c(1:nrow(result2), nrow(result2):1), c(result2[, i-1], rev(result2[, i])), col=i)
    }
    area.png
  • 参考にします。助かります。 -- 内藤? 2011-07-16 (土) 22:53:28
  • 最終的には以下のようにしました。 -- 内藤? 2011-07-18 (月) 11:22:10
    result2 <- t(apply(result, 1, cumsum))
    result2 <- cbind(rep(0, nrow(result2)), result2) 
    color   <- gray(seq(1.0, 0.5, length=7))
    plot(c(1, nrow(result2)), range(result2),
         xlab="経過年数(年)",
         ylab="各劣化状態の面積割合(%)", type="n") 
    for (i in 2:ncol(result2)) { 
      polygon(c(1:nrow(result2), nrow(result2):1),
              c(result2[, i-1],
              rev(result2[, i])), col=color[i])
    }   
    legend(2, 40, c("潜伏期", "進展期", "加速期",
                    "劣化期", "耐力比1.0以下"),
           col=1, fill=color, cex=0.7)
    順序を耐力比1.0以上,劣化期,加速期,進展期,潜伏期という順に書く場合はどうすればいいでしょうか?
  • 上記は解決しました。 -- 内藤? 2011-07-18 (月) 13:46:00

latticeパッケージにおけるxyplotの重ね描きの方法

Ryohei? (2011-07-12 (火) 22:12:18)

以下のxxというデータセットをID別にTIME2対VAR1とTIME2対VAR2の折れ線グラフを重ね描きしたいと考えております。

#1に示した図をアウトプットのイメージとして、#2の2種類のグラフを1枚で重ね描きをして変数VAR1とVAR2に対する時間(TIME2)の推移を同時に表現したいと考えております。xyplotではどのようにプログラムを書けばよいのでしょうか?
今回は便宜上2行2列のグラフでしたが、実際には4行4列、5行5列といったグラフを描こうと考えております。
xyplotの特長である、軸ラベルが両端・最上下段のみに表示されすっきりする、IDごとのグラフエリアが大きくなって見やすくなるといった点を活かしたいと思っております。
どうぞよろしくお願いいたします。

#1
N <- 4 ; TIME <- seq(6)
TIME2 <- rep(TIME, N)
ID <- rep(seq(N), each=length(TIME))
VAR1 <- rep(seq(3), length(TIME)/3*N)
VAR2 <- round(runif(N*length(TIME), min=1, max=9))
(xx <-  data.frame(ID, TIME2, VAR1, VAR2))
layout(matrix(1:4, byrow=TRUE, ncol=2))
old <- par(mar=c(2, 2.7, 1.3, 1), mgp=c(1.6, 0.7, 0))
for (i in 1:N) {
	plot(xx[xx[,"ID"]==i, "TIME2"], xx[xx[, "ID"]==i,
            "VAR1"], xlim=c(0, 7), ylim=c(0, 10),
	     xlab="", ylab="", main=sprintf("ID%02d", i),
            col="red", type="b")
	points(xx[xx[, "ID"]==i, "TIME2"],
              xx[xx[, "ID"]==i, "VAR2"],
	xlim=c(0, 7), ylim=c(0, 10), col="blue", type="b")
	}
par(old)
layout(1)
#2
#library(lattice)
#xyplot(VAR1 ~ TIME2 | ID, data=xx, ylim=c(0, 10),
        type="b", col="red")
#xyplot(VAR2 ~ TIME2 | ID, data=xx, ylim=c(0, 10),
        type="b", col="blue")
  • xyplot のオンラインヘルプを読めばよい。とはいえ,あんな長いのは読みたくない。という場合には,example(xyplot) で,似たようなものがないかをみてみるというのも一手。似たものがあったら,そのプログラムをちょっと見てまねてみる。今回は
    xyplot(VAR1+VAR2 ~ TIME2 | ID, data=xx, ylim=c(0, 10), type="b", col=c("red", "blue"))
    でよいのじゃない? -- 河童の屁は,河童にあらず,屁である。? 2011-07-13 (水) 08:22:46
  • 御指導ありがとうございます。example(xyplot)等も探してみたのですが、類似したものを見つけることができず質問させていただきました。これで目的の図が描けると思います。回答を頂きありがとうございました。 -- Ryohei? 2011-07-16 (土) 18:00:07
  • > 類似したものを見つけることができず
    iris データセットで散布図を重ね描きしたものがあったでしょう。あれがまさに,「類似したもの」です。 -- 河童の屁は,河童にあらず,屁である。? 2011-07-16 (土) 19:11:12

package:rattleがインストールできない

sakura? (2011-07-09 (土) 07:57:43)

PCのシステムは、
Microsoft Windows XP
Professional
Version 2002
Service Pack 3
です。
R version 2.130(2011-04-013)で、package:rattleをロードしてdeta mining を学ぼうとしているのですが、パスが通らず?次のエラーが出てしまいます。
どう対処したら良いのか、分かりません。ご教示頂ければ、幸いです。お願いします。

Learn more about GTK+ at http://www.gtk.org
If the package still does not load, please ensure
that GTK+ is installed
and that it is on your PATH environment variable
IN ANY CASE, RESTART R BEFORE TRYING TO LOAD THE
PACKAGE AGAIN
 以下にエラー as.GType(type) : Cannot convert
              RGtkBuilder to GType
 追加情報:   警告メッセージ: 
In unzip(path, exdir = .windows_gtk_path) :
   zip ファイルから抽出中に書き込みエラーが生じました
  • > パスが通らず?
    ではなくて,「zip ファイルから抽出中に書き込みエラー」ということは,書き込み権限がないつまり,管理者権限でインストールしなくてはならないということでは? -- 河童の屁は,河童にあらず,屁である。? 2011-07-09 (土) 09:22:41
  • 管理者権限の使い方が悪いのか、上手くいきません。Rのバージョンアップの時再挑戦しようと思います。ありがとうございます。 -- sakura? 2011-07-09 (土) 18:34:10

Rexcel:RthroughExcelWorksheets?が無い

Ackin? (2011-07-01 (金) 14:02:41)

Office2007、WindowsXPの職場PCにRAndFriendsSetup2130V3.1-15-1.exeをインストールしてRexcelを学び始めました。
インストール時は管理者権限で行いましたが、使用時に権限はありません。C:\Program Files\RExcelにインストール出来たようです。
職場PCはマイドキュメントをサーバにあるP:としてあり、getwd()すると"P:/"となります。

【症状】
ExcelメニューからRexcel>RthroughExcelWorksheets?としたいのですが見当たりません。
書籍「ExcelでR自由自在」P.34図3.1によるとDemo WorksheetsとAbout Rexcelの間にあるようです。
C: P: を検索しましたがBookFilesTOC.xlsmは見当たりません。

どこからかBookFilesTOC.xlsmを探してきて、パスを通さなければ使えないでしょうか?

  • 通常は C:\Program Files{ (x86)}\RExcel\R.and.Excel にインストールされるはずなのですが,あとで追加するにはRで
    library(RthroughExcelWorkbooksInstaller)
    installRthroughExcel()  
    を実行します.この場合もCドライブへのアクセス権が必要になりますけど. -- ishida 2011-07-02 (土) 17:33:44
  • コメントありがとうございます。管理者権限で実行してみたところ check the box next to "Trust access to the VBA Project object model".Then close Excel.In R issue the "installRthroughExcell?()" command again.となったので、”VBA プロジェクト オブジェクト モデルへのアクセスを信頼する”をチェックして再実行。「'QuitR.xlsm'が見つかりません」のエラーが出ました。これ以上は断念して、全部削除して、RAndFriendsSetup2130V3.1-15-1.exeにて再インスト−ルしてみましたが、また「'QuitR.xlsm'が見つかりません」のエラー。それでもRexcelは起動するし、今度はRthroughExcelWorksheets?も開けるので、一応よしなのでしょうか?初回インスト時に"Trust access to the VBA Project object model"のチェックが無かったのが原因でしょうか? -- Ackin? 2011-07-04 (月) 11:00:11

scatterplot3dの軸調整について

ランゲルハンス? (2011-06-22 (水) 14:29:19)

いつも掲示板を参考にしております。
三次元散布図を描きたいと思います。
下記のプログラムでは、x、y、z軸の目盛は違っても長さが同じで立方体の中に各点が散布されます。
それぞれの軸を実際の長さの比(10:20:5 =2:4:1)にした直方体の中に点を散布する方法をご教示いただけないでしょうか?
見た目の錯覚を防ぎたいと思います。
よろしくお願いいたします。

library(scatterplot3d)
x <- runif(100, 0, 10)
y <- runif(100, 0, 20)
z <- runif(100, 0, 5)
scatterplot3d(x, y, z, pch=20)
  • グラフィックウインドウの横幅(高さ)とxlim, ylim, zlim を適切にすることによって,可能でしょうけど,添付図のごとく,その効果はあまりないのでは? -- 河童の屁は,河童にあらず,屁である。? 2011-06-22 (水) 15:25:03
    3dplot.png
  • 河童さま、ありがとうございました。参考にさせていただきます。 -- ランゲルハンス? 2011-06-23 (木) 07:51:18

ヒストグラムの横軸に度数、縦軸に階級を取る方法

buta? (2011-06-21 (火) 13:07:20)

ヒストグラムの横軸に度数、縦軸に階級を取るにはどのようにすればよいでしょうか。よろしくお願いします。

  • どこかにそのような関数がすでにあるのかもしれませんが,以下のように stats の hist を使って作図し,90 度回転して利用するというごまかしもありかも。
    仕様を決めて,rect などを使ってシコシコ描くプログラムを書くもよし。 -- 河童の屁は,河童にあらず,屁である。? 2011-06-21 (火) 15:16:46
    old <- par(mar=c(3, 7, 1, 2), las=3, xpd=TRUE, crt=90)
    a <- hist(rnorm(1000), xlab="", main="")
    mtext("Rotated Histogram", side=2, line=5, cex=1.5)
    text(max(a$breaks)+15*strheight("H", units="figure"),
         -strwidth("H", units="figure")*10, "Value", pos=1)
    par(old)
    rotated.png
  • ちょっと書いて見ました。 -- 河童の屁は,河童にあらず,屁である。? 2011-06-21 (火) 16:18:37
    hist2 <- function(x, breaks = "Sturges",
                      xlab="Counts", ylab="Value",
                      main="Horizontal Histogram")
    {
    	a <- hist(x, breaks=breaks, plot=FALSE)
    	class <- length(a$counts)
    	plot(range(a$count), range(a$breaks),
                type="n", xlab=xlab,
                ylab=ylab, main=main)
    	for (i in 1:class) {
    		rect(0, a$breaks[i], a$counts[i],
                        a$breaks[i+1])
    	}
    }
  • 「河童の屁は,河童にあらず,屁である。」さんありがとうございました。確かに90度傾けて使うのもありですよね!! -- buta? 2011-06-21 (火) 19:10:02
  • rectも参考にさせて頂きました!!!! -- buta? 2011-06-21 (火) 19:11:24

pasteでベクトル内の文字列を短いコマンドで連結する方法

poro? (2011-06-18 (土) 04:00:33)

str <- ""
for (i in c("a", "b", "c")) {
    str <- paste(str, i, sep="")
}

としていますが、ベクトルをpasteコマンドにそのまま渡して文字を連結してくれないかと期待するのですができないものでしょうか?

  • オンラインヘルプは宝の山です。オンラインヘルプを熟読玩味しましょう。
    つまりのところ,paste(c("a", "b"," c"), collapse="") とすれば,あなたの求める答えが得られるのでは? -- 河童の屁は,河童にあらず,屁である。? 2011-06-18 (土) 08:44:48
  • ヘルプも本wikiも熟読できなかったようです。ご回答ありがとうございました。 -- 2011-06-18 (土) 18:23:17

breaksが小数となるヒストグラムの密度表示が正しくない

石ころ太郎? (2011-06-15 (水) 19:19:09)

お世話になります。

hist(c(0.1*1:10), probability=TRUE)

を実行したときにdensityが0.1となるべきところが、1.0となってしまいます。いろいろ確認したところ、breaksの閾値が小数となるときにあらわれる現象と見受けられます。
解決法はございますでしょうか?

  • 何か勘違いをされているのでしょう。probability=TRUE にしたとき,長方形の面積(確率)の合計が 1 になるのですよ。もし,例示のときあなたがいうように density=0.1 になるべきというなら,面積が 0.1 になってしまうでしょ?
    probability=TRUE というのが,縦軸が % の 1/100 になると思っているのなら,それは間違いです。以下のような例を吟味するとよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2011-06-15 (水) 21:33:36
    > x # データ
     [1] 0.1 0.2 0.2 0.3 0.3 0.3 0.4 0.4 0.4 0.4
         0.5 0.5 0.5 0.5 0.5 0.6 0.6
    [18] 0.6 0.6 0.6 0.7 0.7 0.7 0.7 0.8 0.8 0.8
         0.9 0.9 1.0
    > a <- hist(x,probability=TRUE) # 元のデータのヒストグラム
    > a$breaks # 階級幅は 0.2
    [1] 0.0 0.2 0.4 0.6 0.8 1.0
    > a$density # 各階級の density
    [1] 0.500000 1.166667 1.666667 1.166667 0.500000
    > sum(diff(a$breaks)[1]*a$density) # 確率の合計
    [1] 1
    > b <- hist(x*10,probability=TRUE) # 元のデータを 10 倍すると
    > b$breaks # 階級幅は 2(元のデータを使った場合の 10倍)
    [1]  0  2  4  6  8 10
    > b$density # 各階級の density(元のデータを使った場合の 1/10)
    [1] 0.0500000 0.1166667 0.1666667 0.1166667 0.0500000
    > sum(diff(b$breaks)[1]*b$density)
    [1] 1 # 確率の合計はやはり 1
    hist-density.png
  • 早速の返事ありがとうございます。面積を計算するときに横幅はbinの幅がそのまま使われるのですね。1になるものだと思っていました。勘違いでした。 -- 石ころ太郎? 2011-06-15 (水) 21:46:14

四分位数にバグ?

三十路? (2011-06-14 (火) 21:23:44)

c(1,2,3,4,5,100,1001,1002,1003,1004,1005)
をsummaryで見ると、

  Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.0     3.5   100.0   466.4  1002.0  1005.0 

という結果が表示されるのですが、この3rd Qu.は間違ってますよね。
c(1,2,3,4,5,10,101,102,103,104,105)
ならば正しく、

  Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.00    3.50   10.00   49.09  102.50  105.00 

が返されるのですが。

  • 表示の際の有効数字の問題でバグではありません。 summary(r, digits=5) で。バグだと思う前にヘルプを熟読しましょう。 -- 2011-06-14 (火) 21:36:26
  • 回答どうもありがとうございます。 -- 2011-06-15 (水) 14:53:09

RColorBrewer?が使えません

HS? (2011-06-14 (火) 18:15:53)

R (2.13.0, x86_64-pc-mingw32/x64) 上で RColorBrewer? (1.0-2) を使いたいのですが,

> library(RColorBrewer)
エラー:  パッケージ 'RColorBrewer' は R 2.10.0 以前に造らました。新しくインストールして下さい 

となってしまいます.64bit環境のためなのでしょうか?
解決方法等ご存知でしたらご教示ください.

  • 素直に「RColorBrewer?を新しくインストール」するとどうなりますか。また、RColorBrewer?をアンインストールしてからインストールするとどうなりますか。R 2.10.0以前にインストールしたRColorBrewer?をそのままR 2.13.0にアップグレードして使おうとしているように見えます。他の可能性として、RColorBrewer?のインストール先が複数にわたっており、古いものを優先して読もうとしているとか。 -- 2011-06-14 (火) 19:02:47
  • 回答ありがとうございます。アンインストールと再インストールは2回ほどおこないましたが、状況は変わりません。また、1.0-2以前のRColorBrewer?はインストールしたことはありません。そもそも64bit版の導入にともなってパッケージは全て新しく入れなおしたのですが、RColorBrewer?だけが使えない状況です。 -- HS? 2011-06-14 (火) 21:41:34
  • そうですか。複数箇所にRColorBrewer?を入れていないのなら、RColorBrewer?をソースから入れる(コンパイルする)方法しか分かりません。緊急避難的対処でよいなら、RColorBrewer?パッケージのソースに含まれているColorBrewer?.Rをsource()で読み込むとか。 -- 2011-06-15 (水) 17:05:12

lme()で平方和を出力する方法

TK? (2011-06-14 (火) 12:45:30)

線形混合モデルを使った時に、複数の固定効果の相対的な重要性を検討するために、分散分析表を出力しようとしています。分散分析表は、自由度、平方和(Sum of Square)、平均平方(Mean Square)、F値、P値からなっていることが多いので、このような標準的な分散分析表を執筆中の論文に含めたいと考えています。標準的な表を載せる方が読者も理解しやすく、査読者からも受け入れられやすいと考えるからです。
しかし、lme()を使ってもlmer()を使っても、このような出力ができません。Rで呼び出せるOrthodontのデータを例にすると、以下のような作業です。
使用環境は、Windows XP、R2.13.0、nlme_3.1-100、lme4_0.999375-39 です。

library(nlme)
res.lme <- lme(distance ~ age + Sex,
               random= ~ 1|Subject, data=Orthodont)
anova(res.lme)

library(lme4)
res.lmer <- lmer(distance ~ age + Sex + (1|Subject),
                 data=Orthodont)
anova(res.lmer)

lme()の場合、分子自由度、分母自由度、F値、P値が出力されますが、平方和と平均平方が出力されません。
lmer()の場合、分子自由度、平方和、平方平均、F値が出力されますが、P値が出力されません。lmer()がなぜP値を出力しないかは、https://stat.ethz.ch/pipermail/r-help/2006-May/094765.htmlにDouglas Batesさんの解説があるのを見つけました。混合モデルにおける分母自由度とP値の計算は複雑な問題なので、lmer()では出力しないということのようです。ということはlme()が出力するP値も何らかの問題があるものなのでしょうが、lme()のモデルの平方和が分かれば、分散分析表を完成させられるので、今回の論文ではlme()に基づこうと考えました。
lmer()が返す平方和を用いようかと考えたのですが、lme()とlmer()とでは変数によってF値が微妙に異なっていますので、平方和も異なっていそうです。どうしたらいいのでしょうか。

  • たとえば,anova.lme の中を見てみると,Fval[i] <- sum(c0i^2)/nDF[i] のようなところがありますから,sum(c0i^2) などを出力するように print 関数を挿入してやればよいかと。その他,必要なものも,プログラム中で計算されているもの(あるいはそれらから簡単に計算できるもの)なら出力可能でしょう。 -- 河童の屁は,河童にあらず,屁である。? 2011-06-14 (火) 13:21:49
  • anova(res.lme) で出力されるのは,「分散分析表」ではないでしょう?各変数の係数の有意性じゃないですか? -- 河童の屁は,河童にあらず,屁である。? 2011-06-14 (火) 13:46:02
  • 早速のお返事、感謝します。 anova(res.lme)は分散分析表ではないのではないかという点について、
    Orthodont$X1<-as.factor(rep(letters[1:3],36))
    res.lme2 <- lme(distance ~ age + X1,
                    random= ~ 1|Subject, data=Orthodont)  
    summary(res.lme2)  
    anova(res.lme2) 
    summary(res.lme2)を見るとX1の係数は2つあり、それぞれの有意性が示されているのに対し、anova(res.lme2)ではX1について一つの有意性が示されているので、分散分析表のようにその変数による分散を示しているのではないでしょうか。 また、anova.lme()の中身を書き換えてsum(c0i^2) を出力することをためしてみました。そうするとsum(c0i^2)の値は、anova(res.lmer)の平方和の値と比べると、ageでは0.4879倍、SEXでは0.4882倍となっていました。一方でF値はほとんど同じですので、sum(c0i^2)は平方和ではないのではないでしょうか。ご指摘のようにFval[i] <- sum(c0i^2)/nDF[i]というようにF値が計算されていますが、F値は(その変数の平方平均)/(残差平方平均)と計算するとすると、この式が意味が理解できません。 -- KT? 2011-06-14 (火) 14:56:42

一般プロクラステス分析

タカ? (2011-06-13 (月) 17:27:24)

いつもお世話になっております。
GPA(一般プロクラステス分析)について質問です。

   Acid Strange Hard Acid1 Strange2 Hard2
C1  2.0       2  2.0     2        1   2.0
C2  4.0       2  1.0     4        3   4.0
C3  7.0       1  2.5    11        1   7.0
C4  4.5       2  1.5     1        2   2.8
C5  5.0       3  4.0     5        6   4.0

以上のデータ(test)に対して、

library(FactoMineR)
res.GPA <- GPA(test, group=c(3, 3))

としたのですが、「以下にエラー if (a >= 0) prob <- pgamma(rvstd - (-2/a), shape = (4/a^2), scale = (a/2), : TRUE/FALSE が必要なところが欠損値です」とエラーが表示されてしまいます。 御存じの方いらっしゃいましたら、ご教授の程よろしくお願いいたします。
使用環境は、WindowsXP、R 2.13.0です。

  • このような場合,エラーがでたらまず,traceback 関数により,関数がどのように呼ばれて,最終的にどの関数でエラーが起きたかを明らかにしましょう。
    > traceback()
    2: coeffRV(Xi, Xj)
    1: GPA(test, group = c(3, 3))
    coeffRV という関数で最終的にエラーが起きたことがわかります。
    次に,原因となった関数のコピーを作り(たとえば,coeffRV2 と名前を変え,それを呼ぶ関数も GPA2 などとします。GPA2 から coeffRV を呼ぶところは coeffRV2 を呼ぶように変更しないといけません。最初の関数の呼び出しも,GPA ではなく,GPA2 を呼ばなければならないのは言うまでもないが)。coeffRV2 の怪しそうなところ(今の場合,エラーは coeffRV が pgamma を呼ぶところですから,その前で),変数の値を出力するなどして,最終的にエラーがどこで起こるかをまずつきとめ,エラーの原因を確定します。つまり,どの変数の値がおかしいからエラーが起きるのかを突き止める。そこから前の方向へたどって,エラーとなる変数がどのように計算されるか,その計算過程でおかしな計算結果になる場所・原因を突き止めるのです。
    まあ,結論をまとめると,GPA が呼ぶ coeffRV という関数の中で,pgamma 関数を引用するところがありますが,その引数として使われる a が NaN なんですね。その a は asym 関数で計算されるが,その計算過程で,cumulant3 が NaN,その cumulant3 の計算に使われる esperancet3 が NaN,その計算は,total/(n * (n - 1) * (n - 2) * (n - 3) * (n - 4) * (n - 5)) で,あなたの計算例においては n は(データ数なんでしょうね)が 5 なんですよ。だから,0による割り算が起こり,計算結果が NaN になる。
    まあ,テストデータなのかも知れないせいで,データ数が少ないというのがエラーの根本原因ですね。
    例えば6行目として類似するデータ C6 3.0, 1, 3.5, 5, 6, 3.0) なんかを加えてやっただけで,ちゃんと計算されますね。 -- 河童の屁は,河童にあらず,屁である。? 2011-06-13 (月) 18:19:41
  • 早速のご回答ありがとうございます。エラーの解析法までご教授いただき、本当に助かります。
    ご指摘された原因についてなのですが、私も最初はデータ不足が原因かと思っていたのですが、逆にC5の行をまるまる削除して、GPAを実行してもうまく動いてくれるみたいです。 また、C5の行の値を以下のように変更したら、なぜかうまく動きました。
       Acid Strange Hard Acid1 Strange2 Hard2
    C1  2.0       2  2.0     2        1   2.0
    C2  4.0       2  1.0     4        3   4.0
    C3  7.0       1  2.5    11        1   7.0
    C4  4.5       2  1.5     1        2   2.8
    C5  5.0       4  6.0     4        5   4.0
    データの中身自体に何か原因があるのでしょうか?繰り返しの質問になってしまいますが、よろしくお願いいたします。-- タカ? 2011-06-14 (火) 09:47:44
  • > 逆にC5の行をまるまる削除して、GPAを実行してもうまく動いてくれるみたいです。
    そのときは a が -Inf になりますが,計算上はエラーにならない。if 文で使うとき,Inf(-Inf) と NaN では扱いが違う。
    > a <- NaN
    > if (a >= 0) 1
     以下にエラー if (a >= 0) 1 : 
          TRUE/FALSE が必要なところが欠損値です 
    > a <- -Inf
    > if (a >= 0) 1
    > if (a < 0) 2
    [1] 2
    しかし,pgamma が返す値は NaN になっている。エラーメッセージ出ないときにも結果が間違っている(不適切な)ことはある。
    > C5の行の値を以下のように変更したら、なぜかうまく動きました。
    動きませんけどね?
    > test
       Acid Strange Hard Acid1 Strange2 Hard2
    C1  2.0       2  2.0     2        1   2.0
    C2  4.0       2  1.0     4        3   4.0
    C3  7.0       1  2.5    11        1   7.0
    C4  4.5       2  1.5     1        2   2.8
    C5  5.0       4  6.0     4        5   4.0
    > res.GPA <- GPA(test, group=c(3, 3))
     以下にエラー
      if (a >= 0) prob <- pgamma(rvstd - (-2/a),
                  shape = (4/a^2), scale = (a/2),  : 
       TRUE/FALSE が必要なところが欠損値です 
    なんで動いたんでしょ。変ですね。 -- 河童の屁は,河童にあらず,屁である。? 2011-06-14 (火) 11:18:40
  • 検討ありがとうございます。 変ですね。こちらだとうまく動いてくれるのですが、、
    > test
        Acid Strange Hard Acid1 Strange2 Hard2
    C1  2.0       2  2.0     2        1   2.0
    C2  4.0       2  1.0     4        3   4.0
    C3  7.0       1  2.5    11        1   7.0
    C4  4.5       2  1.5     1        2   2.8
    C5  5.0       4  6.0     4        5   4.0
    > (res.GPA <- GPA(test, group=c(3, 3)))
    **Results of the Generalized Procrustes Analysis (GPA)**
    There are individuals, characterized by variables
    *Results are available in the following objects :
      name           description                                                   
    1 "$RV"          "RV Coefficients between partial
                     configurations"              
    2 "$RVs"         "standardized RV Coefficients
                     between partial configurations" 
    3 "$simi"        "procrustes similarity indexes
                     between partial configurations"
    4 "$scaling"     "isotropic scaling factors"                                   
    5 "$dep"         "PCA of initial configuration "                               
    6 "$consensus"   "coordinates of the consensus
                     configuration"                  
    7 "$Xfin"        "coordinates of partial
                     configurations"                       
    8 "$PANOVA"      "list of Procrustes Analysis of
                     Variance tables"              
    9 "$correlation" "Correlations by sets"                                        
    
    何が起きているのかさっぱりですね。バグなんですかね。 -- タカ? 2011-06-14 (火) 11:42:54

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

M_Saito? (2011-06-11 (土) 16:12:29)

初めて投稿します。この投稿欄にあるhiro?氏と同じような状況ですが、libraryからneuralのパッケージが削除されているようです。そこでhiro?氏の記事を参考にインストールを試みましたが駄目です。当方はOS WindowsXp?, R2.12.2です。ダウンロードしたneuralアーカイブは.nueral1.4.2.1.tar.gzですので解凍後ファイルの中身を確かめ再度そのファイルをzipに変換してインストールを試みました。しかし次のようなメッセージが出てしまい、完了しません。

> utils:::menuInstallLocal()
 以下にエラー gzfile(file, "r") :  コネクションを開くことができません 
 追加情報:   警告メッセージ: 
In gzfile(file, "r") :
  圧縮されたファイル 'neural/DESCRIPTION'
  を開くことができません,
  理由は 'No such file or directory' です 
> install.packages("C/neural.zip",repose=NULL)
ファイル名から 'repos = NULL' を推測
 以下にエラー zip.unpack(pkg, tmpDir) : 
   zip ファイル 'C/neural.zip' が見付かりません 
> install.packages("C/neural.zip",contriburl=NULL)
 以下にエラー zip.unpack(pkg, tmpDir) : 
   zip ファイル 'C/neural.zip' が見付かりません 

ファイルは作業デレクトリに置いてあります。どこが間違っているのか、又その解決策をご教授願いたいのです。下らない質問で済みません、宜しく御願い致します。

  • 同じ環境で確認してあげることができないのですが,
    zip ファイル 'C/neural.zip' が見付かりません
    と言われているのは,そこにそのようなファイルがないと言うことでしょう。
    C/neural.zip というのは,C ドライブのルートにある neural.zip ですか?すくなくともそうならば,C:/neural.zip とか書かねばならないのでは?また,あなたは,「ファイルは作業デレクトリに置いてあります」と書いているので,ルートディレクトリにあるという指定は間違いでしょう(ルートディレクトリを作業ディレクトリにしているのですか?) -- 河童の屁は,河童にあらず,屁である。? 2011-06-11 (土) 20:57:11
  • 早速のご検討有難うございました。作業デレクトリは新しく作成しましたC\R_bookのことでここに置いたtxtファイルは正常にRは読んでおります。再度C:/で行いましたが駄目でした。以下のようになりす。> install.packages("C:/neural.zip",repose=NULL)やはり展開そして圧縮は無理でしょうか? -- M_Saito? 2011-06-11 (土) 21:48:47
  • ご面倒をお掛けしております。諦めきれずに各種試行した結果以下のようにして追計算が出来ました。新規に専用の作業デレクトリを作り、そこに全ての展開したファイルを置きました。そこから必要な4個の関数スプリクトをコンソールから読み込み、コマンドを実行しました。その結果正常に計算が完了しました。このような使用法は馬鹿げたものかもしれません。やはり展開したファイルをzipに再度圧縮する際に何か問題があるのかと想像します。圧縮したzipを再展開してもファイルは正常です。Windowsでの圧縮ソフトに何かRに悪さをするものが付いているのかもしれません。回り道でしょうが、出来ました。色々お騒がせ致し済みませんでした、有難うございました。 -- M_Saito? 2011-06-12 (日) 12:14:04
  • > やはり展開したファイルをzipに再度圧縮する際に何か問題があるのかと想像します
    なぜ再度圧縮なんかする必要があるのでしょうか -- よくわかりませんが? 2011-06-12 (日) 21:55:35
  • コンパイルして,Windowsのバイナリにしていないのでは? -- 2011-06-13 (月) 12:37:02

ロジスティック回帰の曲線のグラフを描きたい

うー? (2011-06-02 (木) 17:03:52)

ロジスティック回帰をしています。
量xと反応の割合pについて、glm関数でロジスティック回帰式を出しました。
xとpについてプロットを行い、この図に回帰曲線を加えたいと思います。

単回帰であればabline関数とlm関数を用いてコマンド一つで回帰直線を描くことができますが、ロジスティック回帰についてはそれが見当たりません。

いくつか本やウェブページを調べたのですが、独立変数を非常に細かくとってpredictとpointsで作図するとか、glmで求めた予測値についてlines関数で補間するなど、ちょっと回りくどい感じがします。

curve関数で書いてしまおうかとも思ったのですが、高水準作図関数なので実データとの作図の順番が逆になってしまいます。

何かいい方法はないでしょうか? 自分で関数を書く以外ないでしょうか?

  • 裏で何がどのようにやられていようと,一つの関数を呼ぶだけで描画したいとでも?以下のような関数を定義しておいて,plot(glmオブジェクト) とやれば,グラフは描かれます。 -- 河童の屁は,河童にあらず,屁である。? 2011-06-03 (金) 14:18:45
    plot.glm <- function(a)
    {
    	x <- a$data$x
    	y <- a$data$y
    	plot(x, y)
    	points(x, a$fitted.values, col="red")
    	d <- data.frame(x=seq(x[1], x[length(x)],
                           length=500))
    	lines(d$x, predict(a, d, type="response"),
                 col="red")
    }
    # 使用例
    d <- data.frame(x=1:10, y=c(0,0,0,1,0,1,1,1,1,1))
    a <- glm(y~x, data=d, family=binomial)
    plot(a)
    # 当然ながら,logit 以外にも対応
    plot(glm(y~x, data=d,
         family=binomial(link="probit")))
    plot(glm(y~x, data=d, family=gaussian))
  • ありがとうございます。実は人に聞かれ、私もですが相手はさらにRを使い慣れていないので何か簡単な方法をと探していました。教えていただいた関数を伝えます。 -- うー? 2011-06-03 (金) 18:36:38

テーブル出力時の列名のズレ

ぺーぺー? (2011-06-01 (水) 21:35:13)

相関行列をテキストファイルに出力したいのですが、どうしても列名(1行目のデータ)が1列左へズレてしまいます。

例として、以下のコードで再現可能です。

a<-iris[,1:4]
b<-cor(a)
write.table(b,"C:/b.txt",append=F,
            quote=F,col.names=T,row.names=T)


コンソール上でbを出力すると、1行1列目は空白としてきちんと表現されますが、テキストファイルに出力すると、1行1列目に、本来1行2列目の"Sepal.Length"がズレこんできます。

現状、テキストファイルの頭にスペースを追加して読み込んで対応しているのですが、気持ちが悪いのでコード上の問題があるならば解決したいです。

宜しくお願い致します。

  • col.names=NAで。?write.table参照。 -- 2011-06-02 (木) 00:20:18
  • ありがとうございます。おかげさまで解決致しました。もっとヘルプを丁寧に確認致します。 -- ぺーぺー? 2011-06-02 (木) 10:17:33

pairs()で対数軸にする方法

はと? (2011-05-29 (日) 16:21:03)

R2.13.0を利用しております。
pairs()で対数軸を利用する方法について質問があります。
plot()では、plot(data-frame,log="xy")で対数軸に出来るので、pairs(data-frame,log="xy")としたところ、一応対数軸になったものの、「"log"はグラフィックスパラメータではありません」とメッセージが出るとともに、図内のラベル(データフレームのheader)が表示されなくなってしまいます。
dataのlogをとることも考えましたが、相関係数は元のdataで計算したいのです。
よろしくお願い致します。

  • > dataのlogをとることも考えましたが、相関係数は元のdataで計算したいのです。
    相関係数の計算に使ったのとは異なる散布図を提示するのはどうかと思います。まあ,百歩譲るとして,pairs は log を取ったデータで描いて,cor は元のデータで計算すればよいだけだとは思いますけど。
    pairs(log(iris[1:4])); cor(iris[1:4]) -- 河童の屁は,河童にあらず,屁である。? 2011-05-29 (日) 17:06:29
  • 早速ありがとうございます。~申し訳ありません、説明不足でした。~ご指摘の通り、元データから計算した相関係数とlog変換したデータから描いた散布図を示したくなくて、pairs()を見つけるまでは、元データのみを使い、対数軸にしたplot()上にcor()で得た値を追加する形で一つ一つ描いていました(参考にした論文が元のデータを用いて対数軸にプロットしているようで、それに倣ったのですが、対数軸にプロットするのもおかしな話なのかもしれません。。。)~もう一度データの取り扱いから検討してみます。ありがとうございました。 -- はと? 2011-05-30 (月) 02:37:25

subset関数でワイルドカードは使えますか

たろ? (2011-05-23 (月) 17:46:02)

初心者です。データフレームの中の変数 variable (数字と文字列の混ざった値です)が 20, 29, 2A, 2B の値のデータを選び出したいのですが、すべてのケースを列挙するのではなく、

subset(data, data["variable"] == "2*")

のような書き方で一遍に取り出すことは可能でしょうか。

  • subset(data, regexpr("^2", data$variable) != -1) などテキトーに。 -- 2011-05-23 (月) 18:01:16
  • 早速、お教え頂きありがとうございます。本当に助かりました。 -- たろ? 2011-05-23 (月) 18:20:07
  • 「初心者です」なんて前置きは,何のために必要なんですか?初心者ならば少々の不作法は許される?初心者ならば少しは丁寧に教えてもらえる?
    いくら「初心者です」でも,subset(data, grepl("^2", data$variable)) との違い(あるいは違わない)など,関連する部分については自分で確かめる。 -- 河童の屁は,河童にあらず,屁である。? 2011-05-23 (月) 20:58:26
  • 回答する側としては、どの程度くわしく答えればよいかの(多少の)目安になるので、「初心者です」「Rはじめて*ヶ月」等の書き出しがまったく無駄とは思わないのですが。質問する側がどういう意図で書いておられるかはべつとして。まぁ、あくまで主観ですし、今回のような簡単な質問では、どのみちあまり有用ではないのかもしれませんけれども。 -- 2011-05-24 (火) 12:09:57

対応のあるデータのグラフ作成

ようやくRが楽しくなってきたとこ? (2011-05-19 (木) 18:49:52)

http://software.ssri.co.jp/statweb2/column/column0708.html に示されている、トレーニング前と後の違いを見るような、対応のあるデータを一覧できるグラフを作成したいのですが、Rではどうやればよいか教えていただければ幸いです。

  • グラフィックス参考実例集:平行座標プロットが参考になるでしょう。
    と,思ったけど,あんなんじゃだめだろうね。
    ということで,簡単な概略プログラムを示しておきましょうか。 -- 河童の屁は,河童にあらず,屁である。? 2011-05-19 (木) 19:05:25
    set.seed(123456)
    x <- data.frame(before=rnorm(10),
                    after=rnorm(10, mean=0.5))
    plot(c(1, 2), range(x), type="n", xlab="",
         xaxt="n", ylab="value",
         xlim=c(0.8, 2.2))
    junc <- sapply(1:nrow(x),
      function(i) segments(1, x[i, 1], 2, x[i, 2], col=i))
    axis(1, at=1:2, labels=colnames(x))
    text(2, x$after, 1:nrow(x), col=1:nrow(x),
         pos=4, xpd=TRUE)
    paired-data.png
  • 早いお返事ありがとうございます!! すごく助かりました。 神経科学系の論文で使用する予定です。 -- 質問者? 2011-05-19 (木) 20:45:28
  • matplot(rbind(rep(1,10),rep(2,10)),rbind(x$before,x$after),type="b",xaxt="n",xlab=""); axis(1,1:2,c("before","after"))でもできます。 -- 2011-05-20 (金) 16:23:33
  • なるほど。matplot(t(x),type="b",xaxt="n",xlab=""); axis(1,1:2,c("before","after")) で十分ですね。 -- 河童の屁は,河童にあらず,屁である。? 2011-05-20 (金) 17:12:10

nnetに教師用データを追加する方法

R始めて1ヶ月? (2011-05-07 (土) 12:28:53)

ニューラルネットワークのパッケージnnetについて質問です。
すでにデータAを学習したネットワークに対して、さらに別のデータBを学習させるにはどうすれば良いのでしょうか?先にAとBを結合して読ませるには時間がかかるために困っております。
別のパッケージならできるという情報もお待ちしております。

eval(parse(text ="文字列"))のエラー

質問者? (2011-05-06 (金) 11:07:52)

お世話になります。
fv1からfv25という変数にそれぞれread.csv()で数値データ(30KB~90KBなどまちまち)を代入しました。
これらのデータを順番に同じ処理をしたく以下のようなコードを書きました。

for (i in 1:25) {
	eval(parse(text = paste("fv <- fv", i)))
                      # 変数fvにi番目のfvを代入
	#処理
}

コードを実行すると

以下にエラー parse(text = paste("fv <- fv", i)) : 
   <text>:1:10:  予想外の 数値定数 です  
 1: fv <- fv 1 
             ^

というエラーが出てきてしまいます。
この原因が分かる方がいましたら、どうかご教授願います。

環境:
R version 2.12.1 (2010-12-16)
Platform: x86_64-pc-mingw32/x64 (64-bit)
  • fvと1の間にスペースがあったら駄目でしょ。sep=''をつける。 -- 2011-05-06 (金) 12:09:53
  • >回答者様 無事解決しました。感謝します。 -- 質問者? 2011-05-06 (金) 12:25:11
  • 異なる変数に代入されたデータに対して同じ処理をしたいという場合に,eval(parse( は適切でしょうか?そもそも,「fv1からfv25という変数にそれぞれread.csv()で数値データを代入」という処理をどのようにプログラムしたのでしょうか?それもまた,eval(parse( を使った?25種の数値データだからそれでも良いでしょうけど,2000万種もあったら,その方法は明らかに不適切でしょう。2000万種のデータが代入された変数が,同時に存在する必要性がないならなおさら。
    繰り返し処理をするのは,以下のように行うべきでしょう。
    # データが個々のファイルに用意されており,ファイル名が連番を含む規則的なものであるとき
    # 入力すべきファイル名を生成する
    file.name <- sprintf("file%03d.dat", 1:200)
       # file001.dat 〜 file200.dat まで
    for (fn in file.name) {
      cat(sprintf("file: %s\n"))
         # どのファイルを処理した結果かを明記しておく
      data <- read.csv(fn)
         # いつも同じデータフレームに読み込む
      # data というデータフレームについて処理
    }
    eval(parse( を使わなくては書けないというのはそんなに多くない。 -- 河童の屁は,河童にあらず,屁である。? 2011-05-06 (金) 16:46:43

3次元空間の図形の色付け

初心者KT? (2011-05-04 (水) 09:19:54)

三次元の座標を持つ点AからEが存在します
下記の様な三角形が三つあります。
各三角形は連続して隣接しています。
下記の三角形の表と裏を別の色で塗ることは可能でしょうか。
またZの値によって、gradationがかかる様な塗り方も可能でしょうか。
実際には、100個以上の三角形の組み合わせによる構造物を扱う予定です。
三角形1
Point X (mm) Y (mm) Z (mm)
A -14.54 8.39 60.82
B -12.36 10.37 61.72
C -9.4 7.88 61.2

三角形2
A -14.54 8.39 60.82
D -15.77 5.74 60.3
E -10.51 6.07 61.2

三角形3
A -14.54 8.39 60.82
E -10.51 6.07 61.2
C -9.4 7.88 61.2

  • 三次元の物体を二次元平面に射影するわけですね。見えているのが面の表か裏かは射影の条件によるので,どちらが見えているか判断して塗り分ければよいのでしょう。隠線(隠面)消去とかまあ,かなり面倒だし,そのようなパッケージがあればよいのですけどね。
    CAD ソフトなんかはそのような用途専門のものだし,簡単にできるのかも知れない。 -- 河童の屁は,河童にあらず,屁である。? 2011-05-05 (木) 16:04:58
  • 私が知る限り、ポリゴンの内部をグラデーションで塗り分ける機能は現在のRにないです。細かい3Dグリッドを作成して擬似的なグラデーションを作成しているのが実情です。ですので、3点の値だけではなく、空間補間などを行い3Dグリッドを作成し、それぞれのグリッドのZ座標値に対応する色を決めていってやればできなくはないでしょう。しかし、作図だけならRよりも、PSTrickspst-solides3dパッケージなどを使った方が楽かもしれません。 -- 私も医学系? 2011-05-05 (木) 19:45:34
  • 了解しました。この方法では、かなりの困難ですね。自分も、平面上に多数の点を設定し、そのZ座標値に応じて色を付けた方が楽なのかと、考えていたところでした。ポリゴン内部のグラデーションで塗り分ける機能は現在のRにないと解りましたので、方針決定に大変役立ちました。有難うございます。 -- 初心者? 2011-05-06 (金) 09:48:45
  • > 平面上に多数の点を設定し、そのZ座標値に応じて色を付けた方が楽
    Rでやるならその方針でZ座標に応じた色を塗ることができます。ただし、等間隔のグリッド点にしたほうが面倒がないです。3DグリッドでZ座標値で彩色した例を示します。 -- 私も医学系? 2011-05-06 (金) 11:57:09
    z <- volcano       
    x <- 10*(1:nrow(z))
    y <- 10*(1:ncol(z))
    brks <- quantile(z, seq(0,1, len = 21))
    zi <- z[-nrow(z),-ncol(z)]
    cols <- terrain.colors(20)[cut(zi,brks,
            include.lowest = TRUE)]
    persp(x, y, 2*z, theta = 120, phi = 15,
          col = cols, scale = FALSE, 
          ltheta = -120, border = NA, box = FALSE) 
    3d-grid01.png
    ポリゴンやグリッドの中をグラデーションで塗ることはできませんが、このように1つ1つのグリッドを単色で彩色することによって、擬似的なグラデーションを実現することができます。もっと細かいグリッドを用意すればさらに見栄えはよくなるでしょう。

パッケージが更新できない

質問者? (2011-05-03 (火) 21:29:33)

パッケージを更新しようとすると以下のような警告出ます。

警告:  パッケージ 'urca' の前のインストールを取り除くことが出来ませんでした  
パッケージ 'zoo' は無事に開封され、MD5 サムもチェックされました 
ダウンロードされたパッケージは、以下にあります 
C:\Users\***\AppData\Local\Temp\RtmpVFYyw4\downloaded_packages 
install.packages(update[instlib == l, "Package"], l,
contriburl = contriburl,  中で警告がありました: 
 'lib = "C:/PROGRA~1/R/R-212~1.1/library"' は
 書き込み可能ではありません  
以下にエラー install.packages(update[instlib == l, "Package"], 
l, contriburl = contriburl,  : 
パッケージをインストール出来ませんでした


解決策はありますでしょうか。ちなみに作業状態ですが、Rを終了する時にワークスペースは保存しないを選んで終了し、Rを再起動後すぐにパッケージの更新を実行しました。

  • この現象はWinVista?,7のみで起きます。Rを起動する時に「管理者権限」で起動してください。(この質問は、前にも何度もありましたよ。質問する前に、過去のQ&Aを調べましょう) -- 2011-05-04 (水) 09:21:59
  • ありがとうございました。 -- 質問者? 2011-05-04 (水) 09:44:13

パッケージのバージョン

質問者? (2011-05-03 (火) 13:43:25)

あるパッケージをインストールした後、そのバージョンの確認が必要になったのですが、確認方法はありますでしょうか。

  • これではいかがでしょうか。installed.packagesのExamplesにありました。 -- 2011-05-03 (火) 16:18:20
    str(ip <- installed.packages(priority = "high"))
    ip[, c(1,3:5)]
    plic <- installed.packages(priority = "high", fields="License")
    ## what licenses are there:
    table( plic[,"License"] )
  • library(help="base") -- 2011-05-05 (木) 14:32:42
  • 要するに,library(help=パッケージ名) でしょう?パッケージ名はダブルクオートでくくらなくてもかません。 -- 河童の屁は,河童にあらず,屁である。? 2011-05-05 (木) 16:03:36
    > library(help=zoo) により表示されるウインドウの一部
    Package:            zoo
    Version:            1.6-5
    
    > library(help=MASS) により表示されるウインドウの一部
    Package:            MASS
    Priority:           recommended
    Version:            7.3-13
  • ありがとうございました。 -- 質問者? 2011-05-07 (土) 02:27:19

ESSで日本語を表示する方法?

Toy? (2011-05-02 (月) 15:14:07)

お世話になります。
初歩的な質問で恐縮です。
ESSで日本語を表示する方法について教えてください。
まず.emacsに、次のように記述しました。

;;essのロード
(load "c:/Meadow/site-lisp/ess/Lisp/ess-site.el")

そしてess-site.elの299行目を、次のように書き換えました。

(setq-default inferior-R-program-name "c:/r/bin/i386/Rterm")

その上でMeadowを起動し、Alt+x rと入力するとRは起動します。
しかし、起動した後の初期画面には日本語は表示されず、作成されたプロットでも日本語は文字化けしてしまいます。
どのように設定すれば、日本語が正しく表示されるのか、御教示いただければ幸いです。
当方の環境は、以下のとおりです。

Editor:Meadow 3.01-dev
OS:Windows XP
R:Version 2-13-0
  • 自己解決しました。このWikiのESSのページの記述を参考にして、既に記述してあった.emacsの
    (set-language-environment "Japanese")
    の次に、以下のコードを付け加えることで、グラフ表示の際の日本語の文字化けが解消しました。
    (set-default-coding-systems 'shift_jis)
    (set-terminal-coding-system 'shift_jis)
    (set-keyboard-coding-system 'shift_jis)
    (set-buffer-file-coding-system 'shift_jis)
    (require 'ess-site)
    (setq ess-pre-run-hook
     '((lambda () (setq S-directory default-directory)
                  (setq default-process-coding-system 
                  '(shift_jis .  shift_jis))
      )))
    なお、既に記述してあった、次のコードは削除しました。
    ;;essのロード
    (load "c:/Meadow/site-lisp/ess/Lisp/ess-site.el")
    ただし、依然として初期画面は日本語表示ではありませんし、エラーメッセージも日本語ではありません。 これはESSの仕様なのでしょうか? -- Toy? 2011-05-06 (金) 17:11:27
  • EditorをMeadowからEmacs23.3に乗り換えたら、上記の日本語表示の問題は解決しました。長く使用していたのですが、もうMeadowは古いということなのでしょうか。新しいバージョンの開発も進んでいないみたいだし・・・ -- Toy? 2011-05-17 (火) 09:03:54

Rコマンダーでクラスター分析以降の選択ができない

R初心者? (2011-05-02 (月) 11:14:32)

R、統計ともに超のつく初心者です。
RおよびRコマンダーを用いて、クラスター分析を行い、樹形図を描きたいと思っております。
Rコマンダーのインストールはできたのですが、クラスター分析を選択した後、次の選択欄が全てグレイ表示になってしまい選択できません。
Rコマンダー入門によりますと、「現在の状況において利用できないものはグレイで表示され,選択できないようになっている.」との記載があり、現在、それらの項目が使用できない状況にあることはわかるのですが、他に何が足りないのかがわかりません。
クラスター解析をする際にインストールが必要なパッケージ等があるのでしょうか。
使用OSはWindowsXP, Rのバージョンは2.13.0,データはテキスト形式で読み込みは可能でした。
どうかご教授お願いいたします。

  • データセットの問題だったようで、自己解決いたしました。申し訳ございませんでした。 -- R初心者? 2011-05-02 (月) 11:23:38
  • その手法に適したデータセットを読み込んでいないと、手法がグレイ表示され、選択できません。データセットの窓の右が<アクティブデータセットなし>と表示されているとだめということです。 -- 2011-05-04 (水) 09:10:40

数量化?�爐里笋衒�擇咼┘蕁爾砲弔い

cyako? (2011-05-01 (日) 18:44:20)

R初心者ですが、心理学論文を書くのにコレスポンデンス分析、もしくは数量化?�爐鰺僂い燭い塙佑┐討い泙后? そこで、解説サイトや本を参考にしつつ、下記�のスクリプトで実行しました。
(windows7、Rのバージョンは2.13.0、データはexcelで作成したカテゴリーデータです。)

&#65533;1つ目に使用したスクリプト
> df <- read.table("clipboard", header=TRUE)
> df
> library(MASS)
> corresp(df, nf=2)

このスクリプトで1つ目のデータはなんとか結果?を出すことができました。
しかし、clipboardの内容(別のカテゴリーデータ)を変えて、同じスクリプトで実行してみても下記�のようなエラーが出て結果が出ません。

&#65533;2つ目のエラー
> df <- read.table("clipboard", header=TRUE)
> df
> library(MASS)
> corresp(df, nf=2)
以下にエラー corresp.matrix(as.matrix(x), ...) :
empty row or column in table←これが表示がされます

このようなエラーに対してどのように対処すればいいのでしょうか?
もしくは、そもそもスクリプトが間違っているのでしょうか?
初歩的な質問で大変申し訳ないのですが、ご指導いただきたく存じます。

  • 素直にエラーメッセージを解釈しましょう。
    文字通り,引数で与えた x の行または列の中に,無反応の行または列があるということでしょう。以下に,どのような場合にこのエラーが生じるかの例を示しておきます。
    > library(MASS)
    > (x <- matrix(c(1,0,0, 0,0,0, 0,0,1, 1,0,1), 4))
        # 第2列が全部 0 です
         [,1] [,2] [,3]
    [1,]    1    0    1
    [2,]    0    0    1
    [3,]    0    0    0
    [4,]    0    0    1
    > corresp(x)
     以下にエラー corresp.matrix(x) :
       empty row or column in table
    > (x <- matrix(c(1,0,0, 0,1,0, 0,0,0, 1,0,1), 4))
        # 第3行が全部 0 です
         [,1] [,2] [,3]
    [1,]    1    1    0
    [2,]    0    0    1
    [3,]    0    0    0
    [4,]    0    0    1
    > corresp(x)
     以下にエラー corresp.matrix(x) : 
     empty row or column in table
    このほか,分かりにくいですけど見た目は全部 0 であるような行や列が内にもかかわらず同じようなエラーが起きることもありますが,原因は結局はダミー変数に展開したときに同じ状況が生じるというのが原因です。まあ,サンプルサイズが小さいときには起こりがちということもあるでしょう。十分なデータを蓄積後に分析をすることをお勧めします。
    基本的には,(1) 全ての対象が同じ値を取るような変数は分析に使用しない(被検者の違いを認識できない無能な変数。使用しても意味がないし,問題が生じることもある)。(2) 全ての変数に同じ値を取るような対象者は分析に使用しない(変数の違いを認識できない馬鹿被検者。使用しても意味がないし,問題が生じることがある)。という,データ解析における基本原理に従えば良いだけのことなんですけどねえ。 -- 河童の屁は,河童にあらず,屁である。? 2011-05-01 (日) 20:39:05
  • >河童の屁は,河童にあらず,屁である。様 丁寧な説明及び解説をありがとうございました!データを見直したところ、ご指摘の通り全て同じ値をとっているものがありました。お恥ずかしい限りです。早速該当データを削除して再度実行してみます。 -- chako? 2011-05-01 (日) 21:18:03

ショートカットキーの変更

hiro? (2011-05-01 (日) 11:46:01)

Mac OS X 上で R 2.13.0 を使用しています。以前は標準エディタ上で ctrl+H で直前の1文字を消去できていたように思うのですが、このバージョンではヘルプが表示されてしまいます。ctrl+H の機能をもとへ戻す方法があれば教えてください。

  • delete キーを使うだけでよいのでは? -- 河童の屁は,河童にあらず,屁である。? 2011-05-01 (日) 20:45:04
  • 全く同じ悩みを抱えてるけど今のところ変更する方法はないと思います。 -- 2011-05-02 (月) 00:55:49
  • ありがとうございます.タイプミスすると脊髄反射的にCtrl+Hを打ってしまうので困っています.Rのバージョンダウンも視野に入れて検討します. -- hiro? 2011-05-02 (月) 16:31:46
  • https://svn.r-project.org/R-packages/trunk/Mac-GUI/NEWS の、 Last update: 2011-02-10 [HJBB]
    *	Added menu item 'Show Help for current
           Function' CTRL+H
    	to context menu of RConsole and each Script
           Editor. It
    	parses backwards from the current cursor's
           position to
    	to find the current function and opens the
           help page.
    	If the user did select a text chunk CTRL+H
           will try
    	to come up with help page of the selected
           text.
    	If nothing was found it sets the focus to
           the Help 
    	Search Field.

    この機能ですね。 右クリックしたときに出てくるコンテキストメニューの項目で、カーソル位置にある関数を読み取り、そのヘルプを表示してくれる新機能です。このコンテキストメニューのショートカットキーをInterface Builderあたりで簡単に変更できるとよさそうですが... -- 岡田 2011-05-20 (金) 14:43:20

数量化I類における再計算について

R初心者? (2011-04-30 (土) 18:30:19)

仮にRでDBからデータフレームに対して数量化I類を行って、stepを噛ましてAIC最小のモデルを選ぶとします。また、summaryで各カテゴリ変数に対しての有意な結果が分かっているとします。
この時点で、「有意じゃない」カテゴリ内の変数に関して除去しつつ、lmで再計算を行うにはどのようにすれば良いのでしょうか。オリジナルのデータ、あるいはデータフレームの内容を変更するしか手立てが無いのでしょうか。

  • 「カテゴリ内の変数を除去する」ということは、subset() とかでデータフレームの行数自体を変化させるということのように思えますから、lmにかけるデータフレームは必然的に変化するように思います。もう少し具体的な情報があったほうが答えやすいかもしれません。 -- 2011-04-30 (土) 23:42:35
  • ええと、例えばその情報がinteceptに含まれちゃうような感じにしちゃって構わない、と言う事です。つまり有意な差が無いわけなので。 -- R初心者? 2011-05-01 (日) 01:28:00
  • たぶん、A,B,Cの3カテゴリがある変数xを投入したとき、lmだとfactorは自動的にダミー変数化されて、xAをリファレンスとしてxB, xCの2つのダミー変数がつくられますが、そのときxBが有意でなかったので、xCだけのモデルにしたい、ということでしょうか。そうするとダミー変数を自分で作ることになると思います。d$xC <- d$x=="C" とかで良いと思いますが。DBからだと、接続方法とデータの規模によっては少し面倒かもしれませんね。 -- 2011-05-01 (日) 02:49:49
  • あ、その通りです。「工学のためのデータサイエンス入門」とか見ながらやってたんですが、例えばそう言うxBが有意じゃなかった場合、じゃあどう言う風に回帰式をつくり直すのか、とか指南は無かったんで・・・。そうですか。DB経由だとそうですね。データ規模が膨大なんで、R上のデータフレーム内で上手い具合回避出来ないのかな、とか思ったんですが。代入してみますか。 -- R初心者? 2011-05-01 (日) 03:25:10

3次元配列を1次元の添え字順に二次元配列として表示する

質問者? (2011-04-30 (土) 09:54:22)

Aployに次のような三次元配列を定義します。

	Apoly <- array(c(1,-0.5,0.3,  0,0.2,0.1,
                      0,-0.2,0.7,  1,0.5,-0.3),
                      c(3,2,2))

Aployを1次元の添え字ごとに2次元配列として表示するために次のようなコマンドを打ち込みました。

	Apoly[1,,]
	Apoly[2,,]
	Apoly[3,,]

結果は次の通りです。

> Apoly[1,,]
     [,1] [,2]
[1,]    1    0
[2,]    0    1
> Apoly[2,,]
     [,1] [,2]
[1,] -0.5 -0.2
[2,]  0.2  0.5
> Apoly[3,,]
     [,1] [,2]
[1,]  0.3  0.7
[2,]  0.1 -0.3

これらを一つのコマンドで実行する方法はないでしょうか。例えばApoly[1:3,,]を試しましたが、Apolyの表示方法と同じの3次元の添え字順に2次元配列として表示され、うまくいきません。

> Apoly[1:3,,]
, , 1

     [,1] [,2]
[1,]  1.0  0.0
[2,] -0.5  0.2
[3,]  0.3  0.1

, , 2

     [,1] [,2]
[1,]  0.0  1.0
[2,] -0.2  0.5
[3,]  0.7 -0.3
  • 1つのコマンドでやる方法は知りませんが、こういう出力が必要なのでしょうか。
    > lapply(1:3, function(x) Apoly[x,,])
    [[1]]
         [,1] [,2]
    [1,]    1    0
    [2,]    0    1 
    
    [[2]]
         [,1] [,2]
    [1,] -0.5 -0.2
    [2,]  0.2  0.5
    
    [[3]]
         [,1] [,2]
    [1,]  0.3  0.7
    [2,]  0.1 -0.3
  • 「表示するだけ」ならば以下のように。junk に付値されるものは無益なもの。 -- 河童の屁は,河童にあらず,屁である。? 2011-04-30 (土) 12:51:43
    > junk <- apply(Apoly, 1, print)
         [,1] [,2]
    [1,]    1    0
    [2,]    0    1
         [,1] [,2]
    [1,] -0.5 -0.2
    [2,]  0.2  0.5
         [,1] [,2]
    [1,]  0.3  0.7
    [2,]  0.1 -0.3
  • 例えば -- 2011-04-30 (土) 14:38:31
    > aperm(Apoly,c(2,3,1))
    , , 1
    
        [,1] [,2]
    [1,]    1    0
    [2,]    0    1
    
    , , 2
    
         [,1] [,2]
    [1,] -0.5 -0.2
    [2,]  0.2  0.5
    
    , , 3 
    
         [,1] [,2]
    [1,]  0.3  0.7
    [2,]  0.1 -0.3
  • みなさん、ありがとうございました。色々な方法があるのですね。 -- 質問者? 2011-04-30 (土) 19:14:48

数量化I類での基準変数の指定の仕方

R初心者? (2011-04-30 (土) 05:53:05)

DBにRに接続しながらlm関数で数量化I類を試しています。
Rで数量化I類を行うと、キチンと回帰結果を返してくれるのですが、一方、基準となるカテゴリカルデータをこちらから指定したいのですが、その方法が分からないのです。
Interceptや、基準となるカテゴリー内のデータ名はlm関数の引数に与える事が可能なのでしょうか。

  • あなたがお好きなように,factor 関数の levels 引数で指定するんですよ。 -- 河童の屁は,河童にあらず,屁である。? 2011-04-30 (土) 07:17:35
    > x <- c("foo", "bar", "baz", "bar")
    > (a1 <- factor(x))
    [1] foo bar baz bar
    Levels: bar baz foo
    > as.integer(a1)
    [1] 3 1 2 1
    > (a2 <- factor(x,
      levels=c("bar", "baz", "foo")))
    [1] foo bar baz bar
    Levels: bar baz foo
    > as.integer(a2)
    [1] 3 1 2 1
    > (a3 <- factor(x,
      levels=c("foo", "baz", "bar")))
    [1] foo bar baz bar
    Levels: foo baz bar
    > as.integer(a3)
    [1] 1 3 2 3
  • なるほど。ありがとうございます。 -- R初心者? 2011-04-30 (土) 18:27:19

Rcmdrのエラー

miyucka? (2011-04-30 (土) 00:25:29)

こんばんわ.いつもお世話になっています
環境はMac OSX 10.4.11です.
Rcmdrを使いたくて
library(Rcmdr)
と入力すると

Error in structure(.External("dotTclObjv",
objv, PACKAGE = "tcltk"), class = "tclObj") : 
[tcl] invalid command name "font".
Error :  .onAttach は 'attachNamespace' で
失敗しました 
エラー:  'Rcmdr' に対するパッケージ
もしくは名前空間のロードが失敗しました

となってしまいます.

パッケージのアップデートをCRANのバイナリもソースも両方やってみました
(違いは理解してませんがとりあえず...)
BioConductorもやってみましたが変化無しです.
おかしなことをしたのかと思ってもとからもっていたRを消して
もう一度インストールして
library(Rcmdr)と入力しても

要求されたパッケージ tcltk をロード中です 
Tcl/Tkインターフェースのロード中  終了済 
要求されたパッケージ car をロード中です 
要求されたパッケージ MASS をロード中です 
要求されたパッケージ nnet をロード中です 
要求されたパッケージ survival をロード中です 
要求されたパッケージ splines をロード中です

という記述はでるものの,結果は変わりません

他のQ&Aのページでは勝手に治ったという結果でバグだったのか?
という記述で終ってました.
これはどこをどうしたらいいのでしょうか???
ご指導頂ければ嬉しいです.よろしくお願い致します.

  • 追記失礼します.Error in structure(.External("dotTclObjv?", objv, PACKAGE = "tcltk"), class = "tclObj") : [tcl] invalid command name "font".という文を頼りにtcltkのパッケージをインストールしてみようかなと思ったのですが,tcltk2しかなくてtcltkは存在してないことと何か関係あるのでしょうか?引き続きご指導お待ちしています. -- miyucka? 2011-05-01 (日) 13:34:28
  • Mac OS X 10.6.7 で,R version 2.13.0 ですが,何の問題もなく使えますが。最新バージョン(OS も)で試してみてください。 -- 河童の屁は,河童にあらず,屁である。? 2011-05-01 (日) 15:24:47
  • 河童さん いつもありがとうございます.やはりOSが問題なんですね,,.OSが低くて最新のRのバージョンが使えないのも問題かもしれないです...お返事ありがとうございました大変助かりました. -- miyuka? 2011-05-01 (日) 22:27:45

効果的なグラフ作成について

初心者? (2011-04-27 (水) 13:21:40)

立体的なグラフの表現方法について
初心者KT? (2011-01-31 (月) 22:24:19)

R初心者です。

自分は数学系、物理系、工学系の専門教育は受けたことがなく、医学系の仕事をしています。しかし今回幾つかの解析や、グラフによる表記を行う必要性に迫られています。

30個の点が、xyzを与えられています。
1. 30個の点が、“最も平均的に通る平面”(平面Aとする)を設定しました
(以前のこのコーナーで質問に答えていただき、平面Aは、ax+by+cz+d=0 と表現した時、optim関数でa = 0.09792275, b = 0.37648968 c = -0.32677544, d = 1となりました)。

2. 平面Aの上に81個の点の様な構造物がドーム状にかぶさっています(曲面Bとします)。
� 30個の点と平面A
� 30個の点と平面A,および平面B
� �平面Aと平面B
のそれぞれの3種類の組み合わせを、3次元的にグラフで綺麗に表すには、どの様な方法があるでしょうか。
LatticeからCloundやwireframeなどを使おうとしましたが、なかなかうまくいきません。よろしくお願いします。
理想的には、平面Bは高さによって(Zの値によって)、色が変化するように表せたら最高です。平面Bに関する理想的な色の使い方参考例として、PDFで添付します。
30個の点
X Y Z
56.8458 56.3972 95.2184
58.1262 55.2657 96.9028
61.0080 53.8846 97.6925
63.7117 52.5191 98.1147
65.9630 51.1603 98.0884
68.0598 49.8240 97.4626
70.3595 48.6390 96.2383
73.0480 47.8221 94.6007
76.0860 47.6060 92.8562
79.2539 48.1658 91.3380
82.2386 49.5663 90.3180
84.7249 51.7420 89.9494
86.4678 54.5090 90.2453
87.3370 57.6021 91.0912
87.3282 60.7262 92.2840
86.5478 63.6101 93.5838
85.1780 66.0516 94.7681
83.4311 67.9458 95.6757
81.5042 69.2908 96.2331
79.5429 70.1705 96.4590
77.6191 70.7182 96.4472
75.7289 71.0677 96.3317
73.8088 71.3037 96.2427
71.7678 71.4224 96.2643
69.5302 71.3165 96.4051
67.0781 70.7936 96.5927
64.4841 69.6327 96.6992
61.9234 67.6774 96.5962
59.6531 64.9476 96.2303
57.9525 61.7413 95.6913
曲面Bの構成要素
X Y Z
66.5214 52.3693 100.1890
69.0172 55.2805 98.6580
71.1465 57.6134 98.0792
73.4542 60.2416 96.9707
74.2816 61.4516 95.2830
75.8534 63.4528 93.5104
78.1356 65.5883 94.6485
79.3441 66.4813 96.3968
81.8057 68.7355 97.8613
69.4359 50.9051 99.5420
71.1025 54.5844 99.2688
71.9337 56.6633 98.3382
72.8589 58.7782 97.9511
73.5783 60.6862 96.7916
74.3058 62.7413 95.2100
74.8671 64.3807 93.8145
76.4086 67.2760 95.2155
78.2037 70.3165 97.9255
72.8598 48.6686 97.5556
73.0553 53.8495 97.0382
73.1433 56.6261 96.5826
73.3167 59.6391 96.9136
73.3231 61.7117 95.9461
73.3418 63.9996 95.0022
73.3420 65.9646 94.0229
73.5266 67.9228 94.9986
73.9282 71.3346 97.5466
76.6417 48.3653 95.4308
75.5219 52.4555 96.4391
74.9038 54.7740 97.3086
74.0257 57.8910 97.6356
73.1674 60.8503 97.5045
72.5119 63.0188 96.9356
71.6926 65.7293 96.2245
71.1617 67.6709 96.7142
70.0804 71.6452 97.8153
81.0857 49.4645 93.7371
77.7238 54.0901 94.3492
75.9176 56.5834 95.7828
74.4364 58.6303 97.2458
73.4941 59.9329 98.2465
72.1696 61.7559 98.5740
71.0152 63.3431 98.6402
69.0276 66.0708 98.0351
66.2486 69.8901 97.9546
85.2473 52.2150 93.0255
81.2928 54.9562 92.2683
79.3713 56.2273 93.0238
76.9566 57.8602 93.3170
75.3852 58.7892 95.9743
72.8658 60.3924 98.1361
70.5020 62.0146 97.9852
67.0597 64.3694 97.9051
62.4689 67.4921 98.1250
88.0380 56.8771 94.4088
84.4938 57.8743 92.7572
81.0642 58.7234 92.3931
78.9147 59.1500 93.2910
75.6953 59.7277 95.2876
72.8867 60.1105 98.3210
68.8648 61.0533 98.4587
65.0531 61.9484 98.5723
59.3881 63.4470 96.9480
87.7385 61.3387 95.9346
84.2589 61.3849 93.4009
80.7455 61.1783 92.9229
78.1388 60.8384 94.1021
74.5410 60.2960 96.3323
70.9528 59.7412 98.6698
67.4871 59.4730 98.7284
63.3083 59.2362 98.0871
58.8063 58.9720 97.4714
85.0653 65.4926 97.8556
83.9668 65.5278 94.3416
80.8889 64.4879 91.7567
77.4482 62.5331 93.9201
75.0270 61.1638 95.4027
73.0548 59.9064 97.5156
70.2444 58.5210 97.9352
66.1804 56.5065 98.6132
62.4675 54.5575 99.9249

  • 平面Aと30点が離れているような rgl2.gif -- 私も医学系? 2011-04-27 (水) 15:18:18
  • 誠に申し訳ありませんでした。このa,b,cはそれぞれa = -0.001709210, b = 0.001085967, c = -0.009890907 でした。その時に図も作成していただいたのですが、今回可能であったらbmpで添付します。宜しくお願いします -- 初心者KT? 2011-04-27 (水) 23:20:07
  • あなたにとって、綺麗な3次元的グラフとはどのようなものか、それが分からないことには助言のしようがない。上のgifファイルで示したRGLでよいなら、misc3dパッケージを使えばよい。drawScene()ではなくdrawScene.rgl()をつかえば、RGLディバイス上に表示される。 -- 私も医学系? 2011-04-28 (木) 09:35:09
  • “私も医学系”様へ 自分にとっての綺麗なグラフとは、以下の条件を満たすものです。 1.全てのデータが、適切なサイズで画面の中に納まっている。2.平面BはZ軸方向の高さによってカラフルな色付けがしてあり、一目で表面の標高が解る. 3.可能ならば平面Aが透過性を持ち、planeの下部も透けて見える 4.30個の点は、適切な大きさの球形のプロットで示される 自分も30個の点の三次元的プロットは可能でしたが、平面の三次元グラフでの書き方が解りませんでした。“私も医学系”様が示していただいたグラフのprogramを教えて頂けると、大変ありがたいです。 -- 初心者? 2011-04-29 (金) 18:15:08
  • > グラフのprogram
    下記のコードです。a,b,cは新しいものに更新しましたので、こんどはぴったりと平面に合います -- 私も医学系? 2011-04-30 (土) 09:31:28
    library(misc3d)
    ## ptsは30点のデータフレームです
    ## range(pts[,1])
    ## range(pts[,2])
    a <- -0.001709210
    b <- 0.001085967
    c <- -0.009890907
    d <- 1
    v <- surfaceTriangles(seq(55,90,len=30),
         seq(45,75,len=30),
         function(x, y){-(a/c)*x-(b/c)*y-(d/c)},
         color2 = "green")
    p <- pointsTetrahedra(pts[,1],pts[,2],
         pts[,3],size = 0.1)
    ## drawScene.rgl(list(v, p))
    drawScene(list(v, p))
    misc3d-drawScene.png
    ついでにBの方の参考コードも示します。
    library(geometry)
    library(rgl)
    tetramesh(delaunayn(as.matrix(B)),B)
        # Bは曲面Bのデータフレーム
    geometry-tetramesh.png
  • 入力方法を教えて頂いて有難うございました。この方法で、同様の図が色々と書けました。これを基に、今手元にあるR グラフィックスなる本を参考にしながら、色味その他を変えて、試したいと思います。自分の理想の図が完成したら報告します。 -- 初心者KT? 2011-05-02 (月) 15:01:20

R2.12.2が64-bit版Windowsでないとアンインストールできないとは?

NT? (2011-04-23 (土) 16:50:39)

R2.12.2をアンインストールしようとしたら「このプログラムは64-bit版Windows上のみでアンインストール可能です。」という表示がでてきます。
使用OSはWindowsXP Proffesional Ver.2002 Servic Pack3です。
私としてはこれまでRがバージョンアップされる度に、古いバージョンと入れ替えてきており、問題は生じておりませんでした。

  • 再度インストールし直してから消してみるとか。それでもだめならProgram Files/Rフォルダから直接消しても問題ないと思いますが。 -- 2011-04-24 (日) 15:04:52
  • ありがとうございます。結局後者の方法で削除いたしました。 -- NT? 2011-04-28 (木) 21:13:38

PHP の decbin に相当する関数あるでしょうか?

tadashi? (2011-04-21 (木) 13:24:10)

PHP には、10進法を2進法に変換するdecbin とい関数があります。Rでは同様の関数はあるでしょうか? つくるのは簡単で、方法もわかり、つくってもいますので、作り方を知りたいわけではないです。このライブララリを読むと、こんな関数があるよというのがごく当たり前にあるのでしたら、ぜひ教えてください。

  • RSiteSearch?()で検索すると、beliefパッケージのdecBin()がヒットするな。 -- 2011-04-21 (木) 15:25:00
  • あと、HapEstXXRパッケージのdec2bin()とか、wleパッケージのbinary()とか。いろんなパッケージに同じようなコマンドが含まれているってことは、つまり、必要に応じてみなさん適当に作っているのだと思います。 -- 2011-04-21 (木) 15:31:58

glmのpredic(…, se.fit)で出力される$se.fitについて

まつよ? (2011-04-20 (水) 12:36:01)

下のようなデータフレーム"data"がを用いて、glm関数による回帰分析を行った後に、predict関数のse.fit=Tを指定したときに出力される$se.fitについて教えてください。

> data
   x  y
1   1  2
2   2  3
3   3  5
4   4  9
5   5  4
6   6  4
7   7 10
8   8 12
9   9 15
10 10 18
11 11 19
12 12 19
13 13 20
14 14 22
15 15 25
16 16 29
17 17 30
18 18 35
19 19 36
20 20 35

> m=glm(y~x, data,
  family=gaussian(link=identity))
> predict(m, newdata=data.frame(x=x),
  se.fit=T)

$fit
        1          2          3          4          5          6 
-0.3428571  1.5458647  3.4345865  5.3233083  7.2120301  9.1007519 
        7          8          9         10         11         12 
10.9894737 12.8781955 14.7669173 16.6556391 18.5443609 20.4330827
       13         14         15         16         17         18 
22.3218045 24.2105263 26.0992481 27.9879699 29.8766917 31.7654135 
       19         20 
33.6541353 35.5428571 
$se.fit
       1         2         3         4         5         6 
0.9877626 0.9129465 0.8408734 0.7723116 0.7082816 0.6501237 
       7         8         9        10        11        12 
0.5995491 0.5586215 0.5295821 0.5144480 0.5144480 0.5295821 
      13        14        15        16        17        18 
0.5586215 0.5995491 0.6501237 0.7082816 0.7723116 0.8408734 
      19        20 
0.9129465 0.9877626 
$residual.scale
[1] 2.292081

おそら$se.fitの値は標準誤差(SE)なのだと思いますが、この値から標準誤差(SD)の値を求めることは可能なのでしょうか?例えば、rnorm()などの関数を使ってデータを再現し、ブートストラップ法でデータの信頼区間を求めるにはSEよりもSDがわかった方が便利な気がするのですが。

Googleで検索して少し調べてみるとSE=SD/sqrt(N)の関係があるそうですが、ここのときのNの値には何を使えばいいのでしょうか?N=nrow(data)でいいのでしょうか?

ちなみにsessionInfo()で出力される使用環境は以下の通りです。

> sessionInfo() 
R version 2.12.1 (2010-12-16)
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  
[7] base     

loaded via a namespace (and not attached):
[1] MASS_7.3-9
  • あなたの言っている SD とSE での SE と,ここでの SE は別のものですよ。つまり,SE 標準誤差とは,標本統計量の標準偏差と同じものですが,定義としてそのようなものは「標準誤差」と呼ぶのです。
    あなたの言っているのは,データの分布を表す標準偏差で,そのような標本における標本平均の標準偏差(つまりは標準誤差)は,サンプルサイズを N としたときには,SE=SD/sqrt(N) になるということです。
    se.fit は,リニアプレディクタの個々の予測値の標準誤差でしょう。
    添付図において,直線が回帰直線,その外にある2本の曲線が予測値の95%信頼区間です。この信頼区間は「予測値±qt(0.975, df)*se.fit」で計算されるのですよ。
    結局の所,「何の標準誤差か,それが何を表すか」をちゃんと理解しないといけないということです。 -- 河童の屁は,河童にあらず,屁である。? 2011-04-27 (水) 16:12:28

se-fit.png

Coxとforest plot

michi? (2011-04-18 (月) 19:03:14)

R 2.12.2を使用しています(mac).
&ref(sorafenib SHARP trial NEJM.pdf)のfigure 3のような,Cox proportional hazard modelの結果をforest plotにする方法(パッケージ)をご存知でしょうか?

  • すみません.添付ができませんでした. -- michi? 2011-04-18 (月) 19:07:09
  • > すみません.添付ができませんでした
    なんて何の情報もないことを書く前に,
    >投稿する前にまず [heart] 投稿文書の書式 [heart] を読んでください
    あまりいい加減な質問ばかり続くと,いつまでもおとなしくしているのが馬鹿馬鹿しくなるな。 -- 河童の屁は,河童にあらず,屁である。? 2011-04-18 (月) 19:10:06
  • #ref(http://www.nejm.org/doi/pdf/10.1056/NEJMoa0708857) -- michi? 2011-04-18 (月) 19:12:19
  • すみません.投稿になれていないもので,つぎはぎになってしまい失礼な文章になってしまいました.添付してみたのですがやり方はあっているでしょうか? -- michi? 2011-04-18 (月) 19:16:45
  • うまくいかず失礼しました.本当に初歩的なことで恐縮ですがPDFファイルを添付するにはどうすればよいでしょうか. -- michi? 2011-04-18 (月) 19:34:18
  • > すみまんせん
    なんて言って言っている前に
    >投稿する前にまず [heart] 投稿文書の書式 [heart] を読んでください
    #ref なんていらないし,
    The requested article is not currently available on this site. となるけど?
    自分の投稿のリンクをクリックしてみることもしないのかな?
    リンク URL の最後に #ref の対応する閉じ括弧がついてしまうからなのだと言うこともわかろうに。
    それに,forest plot と言う名前がわかっているのだから,まずインターネットで検索したらいかが?
    http://rss.acs.unt.edu/Rdoc/library/rmeta/html/metaplot.html とか
    http://rss.acs.unt.edu/Rdoc/library/rmeta/html/forestplot.html とか(他にもあるだろう) -- 河童の屁は,河童にあらず,屁である。? 2011-04-18 (月) 19:23:56
  • > PDFファイルを添付するにはどうすればよいでしょうか
    これで,3 回目!わからない?
    >投稿する前にまず [heart] 投稿文書の書式 [heart] を読んでください -- 河童の屁は,河童にあらず,屁である。? 2011-04-18 (月) 19:35:14
  • いろいろ検索してわからず,こちらで質問してみるとと聞き投稿したのですが,うまくいかなくてすみません.なにか異常に気分を害されたようで,失礼しました.他をあたります. -- michi? 2011-04-18 (月) 19:45:58
  • > 他をあたります
    どうぞ,お好きに。だけど,答えもちゃんと書いてあるでしょう。あなた,コメントちゃんと読んでないね。
    ほんと,あんた,人を怒らせるのが,上手ですね。天才。
    他へ行ったときも,そこのしきたりに従って質問するように忠告しておきます。あなたの質問態度に寛容な人ばかりじゃないということを意識しておく方が,今後のネット生活で役に立つでしょう。まあ,「余計なお世話!」でしょうが。 -- 河童の屁は,河童にあらず,屁である。? 2011-04-18 (月) 21:07:38

お礼

kazusata? (2011-04-18 (月) 18:39:14)

ご回答ありがとうございます。
close.screen( ) をこまめに入れてみます。

  • お礼は,記事を別にするのではない。元記事へコメントするんです。この掲示板をみて,あなたのようなお礼の仕方をしている人はいないでしょう?
    注意事項をまるで読んでいないのが見え見え。
    自分で直すまで放っておきます。
    >投稿する前にまず [heart] 投稿文書の書式 [heart] を読んでください
    >新規に質問をする前に、頁トップの注意を先ずよく読んでください。 -- 河童の屁は,河童にあらず,屁である。? 2011-04-18 (月) 18:44:04

screen(n, new=FALSE)が効かない。

kazusata? (2011-04-17 (日) 21:52:27)

windows7で、R ver.2.12.0を便利に使わせて頂いています。
以下の使用で、思いどおりに行かず、ヘルプをお願い致します。
jpegデバイスに複数のグラフを書く中で、screen(n, new=FALSE)で、自由にscreenを移動したいのですが、以下の手順で、前に描いたグラフパーツが消えてしまい、new=FALSEが効かないのですが、何か他に設定が必要なのでしょうか?

jpeg(file.name, quality = 50)
split.screen(c(8,4) )
screen(1)
plot(x,y,type="n")
screen(2)
......
screen(1, new = FALSE)
liens(x,y) 
........
dev.off()

これで、jpegを見ると、座標軸が消えている。

  • ご自身の入力と"スペルミスなく"入力されて、デモデータで良いので再現できるスクリプトを記入しないと誰も答えようがありませんよ。 -- akira? 2011-04-18 (月) 00:00:40
  • バグか仕様かしらないけれど,screen( ) で別のスクリーンを有効にする前にその時点で有効なスクリーンを close.screen( ) で閉じないとおかしくなるようですね。最後にまとめて close.screen(all=TRUE) をしても駄目なようです。
    あるいは,example(split.screen) にあるように,screen( ) の後で必要な plot( )を行う。これは面倒と言うよりは,種類の違うグラフを重ねるような場合に必要なんだろうな。
    ちなみに,線画を jpeg で出力するのはお勧めできない。また,8×4 枚の図を一枚にまとめるのも,無謀?。
    なお,投稿の仕方については akira さんと同意見。投稿欄の上に二行の注意書きがありますよね。読みました? -- 河童の屁は,河童にあらず,屁である。? 2011-04-18 (月) 11:06:14
    pdf("test.pdf",  width=10, height=5)
    split.screen(c(1, 2))
    x <- 1:10
    y <- x^2
    screen(1)
    plot(x,y,type="n")
    screen(2)
    plot(x,y,type="n")
    screen(1, new=FALSE)
    lines(x,y) 
    close.screen(1) # これを入れると期待どおり
    screen(2, new=FALSE)
    points(x, y)
    close.screen(all=TRUE)
    dev.off()
    split-screen.png

Kaplan-Meierのグラフについて

hana? (2011-04-13 (水) 17:21:10)

Mac OS X 10.6.7でR ver. 2.12.2を使用しています初心者です.
Kaplan-Meierの生存曲線はこちらの既出の方法で描けたのですが,たとえば再発率の解析などでy軸の0から曲線を描くにはどうすれば良いでしょうか(生存曲線の上下反転のような)?
またnumber at riskをグラフに盛り込むにはどうすればよいでしょうか?
よろしくご教示ください.

  • 単純に上下反転でよいのでしょうか?
    survival パッケージの survfit を使って,その結果を利用して以下のようにすればいかが?つまり,「1-生存率」をプロットするの。
    number at risk は,text 関数を使って描くとよいと思うけど,event が多いと重なりますよね。そんなときどうします? -- 河童の屁は,河童にあらず,屁である。? 2011-04-13 (水) 17:52:58
    require(km.ci)
    data(rectum.dat)
    require(survival)
    fit <- survfit(Surv(time, status) ~ 1,
                   data=rectum.dat)
    plot(fit$time, 1-fit$surv, type="s")
    text(fit$time, 1-fit$surv, fit$n.risk,
         pos=3, xpd=TRUE)
  • ありがとうごございます.早速実行してみましたが,エラーとして「有限な'xlim'の値が必要です」とでます.またnumber at riskでは「'x'と'y'の長さが異なります」とでます.対処法をご教示いただけると幸いです.よろしくお願いします. -- hana? 2011-04-14 (木) 13:47:47
  • > エラーとして「有限な'xlim'の値が必要です」とでます.またnumber at riskでは「'x'と'y'の長さが異なります」とでます
    あなたの使っているデータに問題があるのでしょうけど。
    xlim でそういうエラーがでると言うことは,データがないか不足している(1個しかないとか)のではないですか。
    長さが異なるということなのだから,指定間違いでしょう。x と y に該当するオブジェクトの長さと内容をチェックすべきでしょう。
    type は,type="s" でしたね。 -- 河童の屁は,河童にあらず,屁である。? 2011-04-14 (木) 13:56:26
  • 解決しました.お手数おかけしました. -- hana? 2011-04-14 (木) 18:33:40

R.12.2.2のインストール後、install.packages( )ができなくなった

sizu? (2011-04-08 (金) 14:16:51)

よろしくお願いします。
R.12.2.2のインストール後、install.packages( )で、下記に貼り付けたエラーメッセージが出て失敗するようになり困っています。

utils:::menuInstallPkgs?()でも同じで、「以下にエラーメッセージを・・・」の後と同じメッセージがでます。

OSはWindowsXP (SP3) 、インストール方法は、full installを選択しました。
ミラーサイトは、Tsukuba, hyogo どちらも試しました。
また、私のPCでは、下記メッセージの「圧縮されたファイル・・・」以下に記載されている、「Rimp70CFbVb?]の下には「downloaded_packages」というフォルダが入っており中身は空で、メッセージに書かれてあるよう名前のフォルダは見あたりません。

R2.12.1までは、普通に動いていました。バージョンアップしてからも、前に作成したワークスペース(.rdata)から起動した場合に限って、普通に動いていたこともありました。
現在では、R2.12.1、R2.12.2 いずれをインストールしなおしても、できませんし、以前保存したワークスペースから起動しても同じです。
インストール方法等については、Google などでいろいろ検索し、試行錯誤をしましたが、解決できず困っております。よろしくお願いします。

以下にエラーメッセージを貼り付けます。

> install.packages("Rcmdr")
 パッケージを ‘C:\Documents and Settings\
                Administrator\Local
                Settings\Application Data\
                R-core/R/win-library/2.12
   中にインストールします 
 (‘lib’ が指定されていないので) 
 以下にエラー gzfile(file, mode) :
 コネクションを開くことができません 
 追加情報:   警告メッセージ: 
In gzfile(file, mode) :
  圧縮されたファイル 'C:\DOCUME~1\ADMINI~1\LOCALS~1\
                       Temp\RtmpNubfVC/libloc_C
%3a%5cDocuments%20and%20Settings%5cAdministrator
%5cLocal%20Settings%5cApplication%20Data%5cR-core%2fR%2fwin-
library%2f2.12Version,Priority,Depends,Imports,
LinkingTo,Suggests,Enhances,OS_type,License,Archs,Built.rds'
を開くことができません, 
理由は 'No such file or directory' です
  • 詳しくは理解できませんでしたが、R2.12.2のヘルプから、パッケージのバージョンアップが出来てない場合がありそうでした。また、「R2.12 パッケージ」で検索したところ、バージョン依存のlibraryフォルダの変更が問題となりそうな記載があったので、取り急ぎ、R12.2のアンインストール、とってあったR11.1のインストールで、とりあえず使えるようになりました。お騒がせしました。 -- sizu? 2011-04-09 (土) 01:12:13
  • 個別のPC依存の問題のように思えますから、一度バックアップをとってから、C:\Documents and Settings\Administrator\Local Settings\Application Data\R-core ディレクトリ, およびC:\Documents and Settings\Administrator\Local Settings\Temp\Rtmp* を削除し、Rを再インストールすると直る可能性はあります -- 2011-04-09 (土) 01:13:53
  • それと....細かいですが、バージョン番号はなるべく正しく記載されたほうがよいかと。2.12.1 までで正式な番号であり、省略する場合でも2.12 とはしますが、12.1 とするのは一般的ではなさそうです -- 2011-04-09 (土) 01:16:34
  • ありがとうございました。バージョン表記について、不正確で申し訳ありませんでした。 -- sizu? 2011-04-09 (土) 12:53:59
  • アドバイスしていただいたとおり、Rに関連しそうなフォルダを全部削除し、何度かR2.12.2をインストールしなおしたところ、普通に使えるようになりました。ありがとうございました。 -- sizu? 2011-04-09 (土) 12:56:23

クリップボードの読み込みについて

miyuka? (2011-04-07 (木) 22:14:08)

R初心者です.おねがいします.
環境はMac OS X 10.4.11.R version 2.10.1 です.
クリップボードからデータを読み込みたいのですが

x <- read.delim("clipboard")
以下にエラー file(file, "rt") :  コネクションを開くことができません :
追加情報:   警告メッセージ: 
In file(file, "rt") :
クリップボードを開くことができないか,中身がありません 

となります.

ファイルのアクセス権の問題かと思いアクセス権をユーティリティから修復したのですがうまくいきません.
ディレクトリはファイルのあるところ,デスクトップ,ホームで試しましたが全て同じ結果です.
何がおかしいか教えて頂ければ幸いです.

このグラフの呼び名

K? (2011-04-01 (金) 03:58:55)

こちらの論文(PDF)の図4のようなグラフはなんと呼ぶのでしょうか? また、このグラフをRで作成するパッケージはありますでしょうか?
名前だけでも分かれば検索できるようになると思うので、どうぞよろしくお願いします。

  • バブルチャートかな -- 2011-04-01 (金) 23:02:43
  • なるほど!R Graphical Manualで「bubble」を検索すると、結構いろいろありますね。ありがとうございました! -- K? 2011-04-02 (土) 16:12:53
  • ここに回答がありますよhttp://blog.goo.ne.jp/r-de-r/c/43c436b21a2b9eeef85b5bc07abb207c -- okapig? 2011-04-02 (土) 18:49:39
  • お教えいただきありがとうございます。リンク先の記述については、耳が痛いところもありますが、とてもありがたいですね。感謝です。 -- K? 2011-04-05 (火) 21:59:12

CSV fileのimport について

初心者KT? (2011-03-31 (木) 12:02:24)

初心者的質問です。
 CSV fileからデータをimportすると、時々データ行列の一番下に XXX levels: X, X, X, X, と表示が出ます(Xは数字)。このXXX levels・・・の表示を伴ったデータ行列になってしまった場合は、足し算や引き算などの行列の単純な計算を行う時に”因子に対しては無意味です“との表示が出て、計算が出来なくなってしまいます。
 またこの様な時は通常のplotも不可能となります。
 また行列の値を[ ] を用いて取り出しても、やはり値の下に、XXXlevels・・・の表示があります。
 CSV fileから、一部分のみコピーして、他のExcel fileにペーストしてからCSV形式に保存し、それをRにimportすると、XXX levelsの表示が消えて、行列計算が可能となる場合もあれば、そのままLevels・・・・表示が出て、単純な行列計算が不可能な場合もあります。
このXXX levelsの表示は何でしょうか?
また消す方法はあるのでしょうか?
宜しくお願いします。

下記にその表示をコピーします。

> AllL[2,3]
[1] 87.5242
47 Levels:  84.7952 86.1777 86.4596 86.4788
  86.5069 86.6655 ... Z
> AllL[3,3]
[1] 88.8609
47 Levels:  84.7952 86.1777 86.4596 86.4788
  86.5069 86.6655 ... Z
> AllL[2,3]- AllL[3,3]
[1] NA
 警告メッセージ: 
In Ops.factor(AllL[2, 3], AllL[3, 3]) :
 -  因子に対しては無意味です
  • その変数のデータ中に,数値を表す文字列以外があるとき,数値と数値以外の文字列を共に表現することのできる factor 型(因子)にされてしまうからです。数値でないので,数値演算はできません。
    ですから,あなたがすべきことは「消す方法はあるのでしょうか?」ではなくて,数値でないものが何なのかを特定すること。たとえばそれが欠損値を表すものとしてあなたが入力しているものならば, NA という文字列を使わなければならないですね(あるいは,na.strings 引数で指定する)。ほかに間違いやすいのは 0 と o, 1 と l などの取り違えなども原因。
    Levels の表示を見ると,少なくとも Z という 1 文字がはいっているのは確か。 -- 河童の屁は,河童にあらず,屁である。? 2011-03-31 (木) 13:08:12
  • いつもとても早い返事ありがとうございます。 -- 初心者? 2011-03-31 (木) 21:08:59
  • お礼はしないよりはした方が良いのだけど,「ありがとうさぎ」とだけいうよりは,実際はどのような状況だったのかということと,その対処法を報告すると,コメントの価値が上がると思いますよ。 -- 河童の屁は,河童にあらず,屁である。? 2011-03-31 (木) 21:12:38
  • 了解しました。途中の行にAmount of Landmarks, Landmark Nr. など様な、様々な文字が入っておりました。上記を含んだデータをRに取り込み、その後Rプログラムで数字だけを拾ってから計算を行おうとしたのですが、それでも常にLevels:・・・が付いてまわりました。しかしExcel上で純粋に数字だけにした後にCSV fileへ変換して、それをRにかけると、特に問題なく処理できます。なので教えてもらった通りなのかと解釈しました。初心者KT -- 初心者? 2011-04-01 (金) 19:20:28

latticeのマルチプロットでパネルごとに注釈を付ける方法

Toy? (2011-03-29 (火) 16:08:34)

お世話になります。
latticeのマルチプロットで、gridにより各パネルごとに注釈を付けたいと考えております。
しかし、注釈をベクトルで値を変えながら付けていきたいのですが、上手くいきません。
どなたか、解決策を御存知の方、御教授いただければ幸いです。

library(lattice)
library(grid)
levels <- levels(as.factor(ethanol$C))
xyplot(NOx ~ E|C, data=ethanol,
	panel = function(x, y) {
	panel.xyplot(x, y)
	panel.loess(x, y)
       # 各パネルごとにCの水準を示したい。
	grid.text(label=paste("C=", levels, sep=""), 
	   x=unit(0.05, "npc"), y=unit(0.95, "npc"),
          just="left")})
  • 自己解決しました。以下のコードで描画できました。
    library(lattice)
    library(grid)
    levels <- levels(as.factor(ethanol$C))
    p <- xyplot(NOx ~ E|C, data=ethanol,
            panel = function(x, y) {
            panel.xyplot(x, y)
            panel.loess(x, y)})
    print(p)
    update(p, 
     index.cond = list(rep(1, length(levels))))
    panel.locs <- trellis.currentLayout()
     
    i <- 1
    
    for (row in 1:nrow(panel.locs))
            for (column in 1:ncol(panel.locs))
                  if (panel.locs[row, column] > 0)
      {
            trellis.focus("panel", row = row,
                           column = column,
                           highlight = FALSE)
            grid.text(label=paste("C=",
                      levels[i], sep=""),
                      x=unit(0.05, "npc"),
                      y=unit(0.95, "npc"),
                      just="left")
            trellis.unfocus()
            i <- i + 1
    }
    お騒がせしました。-- Toy? 2011-03-30 (水) 15:08:47
  • 注釈はついたけど,図が全部同じ?
    update は,update(p, index.cond = list(1:length(levels))) ですよね。 -new{2011-04-18 (月) 19:45:58};
  • - 河童の屁は,河童にあらず,屁である。? 2011-03-30 (水) 16:43:50
  • 失礼しました。おっしゃるとおりです。ただし、update文は削除しても問題ないようですね。 -- Toy? 2011-03-30 (水) 16:49:47

一般化加法モデル関数gamでの平滑化について

hevel? (2011-03-28 (月) 16:35:42)

gamを使って一般化加法モデル解析をしています。
gamの中で平滑化スプライン関数sを使って、“s(x, df=4, spar=0)”のように等価自由度を変更設定できると言うことなのですが、設定できません。
つまり、“df=某”という式を入れると、「ExtractVars? 中のモデル式が不正です 」と言うメッセージが出ます。
バグでしょうか?それとも何か別のパッケージを入れておかなければならないのでしょうか?

  • そのエラーは,「モデル式が不正」ということなので,df= を指定することによるエラーではないでしょう。例えば,妥当な使い方かどうかはともかくとして,s(iris[,1], df=3,spar=0) などとやると,エラーはでませんよね?
    エラーを再現できるように,あなたがやったこと(入力したプログラム)を正確に示してください。そうでないと,どこを間違えているのか指摘できません。 -- 河童の屁は,河童にあらず,屁である。? 2011-03-28 (月) 16:55:00
  • 早速のご意見ありがとうございます。例えば、http://www1.doshisha.ac.jp/~mjin/R/16.pdfのように、airqualityのデータを使います。
    > library(mgcv)
    > data(airquality)
    > airq.gam <- gam(Ozone~s(Solar.R)+s(Wind)+s(Temp),
                      data=airquality)
    として計算するとエラーは出ないのですが、
    > airq.gam2 <- gam(Ozone~s(Solar.R, df=10)+
          s(Wind, df=10)+s(Temp, df=10), data=airquality)
    とするとエラーが出ます。等価自由度を変更して解析できないか試そうとしたのですが、こういうやり方はそもそも間違っているのでしょうか? -- hevel? 2011-03-28 (月) 22:31:28
  • mgcvパッケージにおいて平滑化の程度を指定する方法はバージョンによって異なります。http://cran.r-project.org/web/packages/mgcv/mgcv.pdf の28ページによると、1.7-5では、sp=c(10, 50, 20)などと指定するようです。df=は書いてありません。 -- 竹澤? 2011-03-29 (火) 09:00:31
  • gam(Ozone~s(Solar.R, df=10)+s(Wind, df=10)+s(Temp, df=10), data=airquality)は、gamパッケージのgam関数(あるいはs関数)のスタイルです。 -- 2011-03-29 (火) 09:30:47
  • >竹澤様 早速のお返事ありがとうございます。私の使っているmgcvのバージョンは1.6-2ですが、たぶん同じなのでしょう。spを使うとエラーが出ませんでした。 ただ、dfとspの意味が違うようですが、どう違うのでしょうか。実は、平滑化処理の前にdfの最適化を行って、その値を使ってgamを行おうと考えていました。dfとspの意味が違うと、spの最適かも必要なのかもしれませんが、spはgam関数に特有のパラメーターではないでしょうか? -- hevel? 2011-03-29 (火) 12:09:00
  • >もう1人の方様 早速のお返事ありがとうございます。 すみませんが、“gamパッケージのgam関数(あるいはs関数)のスタイルです”という説明がよくわかりませんでした。gam関数で平滑化スプラインをしたいので、これでいいかと思っていましたが、竹澤様のコメントのとおり、最近のバージョンのgamにはdfがないようです。もし、s関数を使って、dfが定義できるのでしたら、どこがおかしいか教えていただけないでしょうか? -- hevel? 2011-03-29 (火) 12:11:55
  • gamパッケージにもgam関数があります(http://cran.r-project.org/web/packages/gam/gam.pdf のp.6参照)ので、dfとして指定したいなら次のようにします。
    > library(gam)
    > data(airquality)
    > airq.gam2 <- gam(Ozone~s(Solar.R, df=10)+
           s(Wind, df=10)+s(Temp, df=10), data=airquality)
  • > library(mgcv)
    > data(airquality)
    > airq.gam <- gam(Ozone~s(Solar.R)+s(Wind)+s(Temp),  
      sp=c(1,3,7),data=airquality)
    > print(airq.gam)
    を実行すると
     Estimated degrees of freedom:
    1.5182 1.4512 1.1420  total = 5.111303 
    などが出てきます。これが、sp=c(1,3,7)に対応する等価自由度です。 spはsmoothing parameter(平滑化パラメータ)です。 竹澤? 2011-03-29 (火) 14:16:07
  • >竹澤様 ご指導いただいたように、gamパッケージのgam関数を使うとうまくいきました。不勉強でした。
     後の説明ですが、sp=c(1,3,7)に対応する自由度の説明もありがとうございました。自由度を任意に設定することはできないのでしょうか。説明変数が複数では難しいと思いますが、説明変数がひとつなら可能なのでしょうか。よろしければご指導ください。 -- hevel? 2011-03-29 (火) 18:09:18
  • パッケージmgcvが等価自由度ではなく平滑化パラメータを指定する形式になっているのは、等価自由度にはいくつかの定義があるので平滑化パラメータの方が明確だという理由かも知れません。それに、平滑化パラメータの値ではなく、等価自由度の値を直接的に指定しなければならないという事情がどの様なものなのか分かりません。 -- 竹澤? 2011-03-30 (水) 08:56:09
  • コメントありがとうございました。勉強しなおします。 -- hevel? 2011-03-30 (水) 09:34:16

Silhouette plotの個別データラベル表示

ken? (2011-03-18 (金) 21:41:05)

はじめまして。
お世話になります。
私はpackage(cluster)内の関数pamを用い、クラスター分析を行っています。
たとえば、

> plot(pam(data, 3), ask=TRUE)

で、Silhouette plotやClusplotを作成した場合、グラフ上に個々のデータラベル(個体番号)を表示させるにはどうしたらよいのでしょうか。
上の例で、Silhouette plotやClusplot上で3クラスターに分けることができても、どの個体がどのクラスターに属しているのかが分からず困っています。
大変初歩的な質問で恐縮ですが,御教示いただければ幸いです.

  • このような場合に共通する対処法を覚えておきましょう。plot のような総称関数の場合,実際には何という名前の関数が使われるかを確認しましょう。
    例えば,library(cluster) で cluster パッケージを使おうとしたら,library(help=cluster) でパッケージの中に "plot.何とか" というのがあれば,その説明をちょっと読んでみましょう。
    実際に使われる関数がなんなのかは,まず,目的とする関数が返すオブジェクトのクラスを見ましょう。今の場合なら pam 関数が何を返すかを,class(pam(data, 3)) として,調べてみましょう。
    結果として,"pam", "partition" の二つが表示されます。
    次に,methods(plot) として,"plot.何とか" にどんなものがあるか調べます(まあ,慣れてくると調べなくても分かることもありますが)。
    今の場合,その中に,plot.pam か plot.partition があるか探します。実際に,plot.partition があることが分かると思います。すなわち,plot(pam( )) は,plot.partition(pam( )) が使われることが分かります(コンソールから直接 plot.partition(pam( )) としても,実行できない場合もあります)。
    実は,plot.partition は,library(help=cluster)) で表示されたリストにあったものですね。そうすれば,次にすべきは,? plot.partition で,オンラインヘルプを調べることです。
    そして,関連しそうな引数とその説明を読みます(関数名は plot と書かれているが気にしない)。今の場合だと,labels という引数が関係しそうだなあと当たりを付けましょう。しかし,そこには直接の説明はないのですが,がっかりする必要はない。説明中に clusplot.default へのリンクがあります。それをクリックすると,labels は 0〜5 の値を取り,それぞれどのようにラベルが付けられるか書いてあります。
    あなたが,どのようなラベル付けをしたいか私には分かりませんが,labels=2 みたいにすれば,以下のようなラベルが付きますね。
    iris データセットを使って,plot(pam(iris[,1:4],3),ask=TRUE,labels=2) による結果です。
    また,「どの個体がどのクラスターに属しているのかが分からず困っています」というような場合には,pam が返すオブジェクトに何が含まれるかをオンラインヘルプで確認しましょう。オンラインヘルプの "Values" の項に示されています。今の場合は,pam.object へのリンクがあります。それを見ると clustering というのが,個々の個体の判別結果であることが分かるでしょう(慣れてくれば,str(pam( )) でどのような名前のオブジェクトが返されるかを見るだけで分かるかも知れませんけど)。
    これによって,例えば iris データセットの分析例ならば,a <- pam(iris[,1:4], 3) として,cbind(iris[,5], a$clustering) で一覧表示したり,table(iris[,5], a$clustering) で判別結果を表示したりできますよ。-- 河童の屁は,河童にあらず,屁である。? 2011-03-19 (土) 15:43:06
    example-clusplot.png
    > a <- pam(iris[,1:4],3)
    > cbind(iris[,5], a$clustering)
        [,1] [,2]
    [1,]    1    1
    [2,]    1    1
    [3,]    1    1
           :
    [149,]    3    3
    [150,]    3    2
    
    > table(iris[,5], a$clustering)
                
                  1  2  3
      setosa     50  0  0
      versicolor  0 48  2
      virginica   0 14 36
  • 丁寧な解説ありがとうございます。大変助かりました。 -- ken? 2011-03-22 (火) 15:51:52

GLMのモデル選択について

taipapa? (2011-03-14 (月) 17:40:04)

お世話になります.
長文になりますが,お許しください.
ある疾患104人の治療効果の判定をロジスティック回帰モデルで行っています.
応答変数はOutcome は良と悪の2値で,説明変数は,9つのカテゴリー変数(a to i),6つの連続変数(J to O)からなり,eventであるOutcomeが悪は25例でした.
まず,下記の用にフルモデルを作成しました.

> FullModel <- glm(Outcome ~ a+b+c+d+e+f+g+h+i+J+K+L+M+N+O, family=binomial, data=mydata)

モデル選択はstepで行ったのですが,得られたモデルは,以下の通りです.

summary(stepModel)
Call:
glm(formula = Outcome ~ a+b+c+d+ J + K,
  family = binomial, data = mydata)
Deviance Residuals: 
    Min        1Q    Median        3Q       Max  
-1.53608  -0.65721  -0.36439  -0.09402   2.83204  
Coefficients:
                      Estimate Std. Error z value Pr(>|z|)    
(Intercept)      -6.7502     1.8614  -3.626 0.000287 ***
a                      0.8752     0.6204   1.411 0.158350    
b                     -1.2636     0.5959  -2.120 0.033974 *  
c                      1.4079     0.8331   1.690 0.091028 .  
d                      0.8834     0.6045   1.461 0.143914    
T1                    3.6828     0.9318   3.952 7.74e-05 ***
T2                    -0.8963     0.4643  -1.930 0.053555 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’
  0.05 ‘.’ 0.1 ‘ ’ 1 
(Dispersion parameter for binomial family taken to be 1)
   Null deviance: 114.717  on 103  degrees of freedom
Residual deviance:  81.622  on  97  degrees of freedom
AIC: 95.622

しかし,イベントが25しかないのに,説明変数が6つもあり,良いモデルとは言えず,含まれる変数も臨床的に意味のなさそうなものが入っており,困りました.
そこで,遺伝的アルゴリズムを用いてAIC/BICがもっとも小さいモデルを探してくれるglmulti (http://cran.r-project.org/web/packages/glmulti/index.html)と言うパッケージを用いてみました.
やり方やオプションは,付属のマニュアルにしたがいました.基準はデフォルトのAICcです.

GeneticModel <- glmulti(Outcome ~ a+b+c+d+e+f+g+h+i+J+K+L+M+N+O, family=binomial, data=mydata,
method="g", report = FALSE, marginality = TRUE, deltaB = 0, deltaM = 0.01, conseq = 6,
sexrate = 0.15, imm = 0.2, level = 1)

これで得られたモデルは4つの説明変数を有し,かつ,臨床的にも納得のいくものでした.
さらに,このモデルは,anovaを用いた尤度比検定で上記のstepで得られたモデルより有意に優れていました.
glmのsummaryは以下のとおりです.

> summary(GeneticModel.glm)
Call:
glm(formula = Outcome ~ a+b+J+K,
  family = binomial, data = mydata)
Deviance Residuals: 
   Min       1Q   Median       3Q      Max  
-1.6986  -0.5952  -0.4402  -0.1794   2.3542  
Coefficients:
                      Estimate Std. Error z value Pr(>|z|)    
(Intercept)         -5.3365     1.5652  -3.410 0.000651 ***
a                   -1.1344     0.5692  -1.993 0.046268 *  
b                    1.1870     0.7798   1.522 0.127945    
J                    3.4808     0.8931   3.897 9.72e-05 ***
K                   -0.8159     0.4454  -1.832 0.066993 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’
  0.05 ‘.’ 0.1 ‘ ’ 1 
(Dispersion parameter for binomial family taken to be 1)
   Null deviance: 114.717  on 103  degrees of freedom
Residual deviance:  85.879  on  99  degrees of freedom
AIC: 95.879
Number of Fisher Scoring iterations: 5

さらに,このモデルは,anovaを用いた尤度比検定で上記のstepで得られたモデルより有意に優れていました.
これで決まりかと思ったのですが,説明- pam(iris[,1:4],3)

変数bのp値が0.05をかなり超えてます(0.128).~

またオッズ比を見ると,

exp(cbind(OR=coef(GeneticModel.glm),
   confint(GeneticModel.glm)))
Waiting for profiling to be done...
                    OR                2.5 %         97.5 %
(Intercept)    0.00481246   0.0001591826    0.08237885
a                   0.32160075   0.1006644837    0.96164214
b                   3.27732742   0.8119375358   18.53407469
J                  32.48671705   6.5308248197   224.16425104
K                   0.44222572   0.1700117573   0.98476474

やはり,説明変数bのオッズ比の95%信頼区間は0.81 to 18.5で1を跨いでいます.大部分は1より大ですが.

お聞きしたいのは,このようにinformation criteriaが低いという基準でモデルを選択したところ,一部の変数が有意でない場合どうしたら良いかということです.
基準がAICcなので,有意差検定は気にしないで,このモデルで解析を進めてよいものでしょうか?
primitiveな質問で恐縮ですが,ご教示いただければ幸いです.

  • 使える変数は,event 数 / 10 というような指針がありますから,あなたの例だと,2,3個の変数しか使えないことになります。
    なお,医学的にしっかりした結果を得るには,AIC 最小などという統計学的な基準に準拠するのではなく,今までの知見や先行研究の成果に準拠した変数選択を優先すべきでしょう。その結果,一部の変数が有意でなくても,それはそれで結果ですから。 -- 河童の屁は,河童にあらず,屁である。? 2011-03-14 (月) 19:24:22
  • 早速のアドバイス有り難うございます.確かに,event 数 / 10 という指針がありますが,資料によっては,イベント数/5−10としているものもありますので,4つなら許容範囲かなと思いました.変数選択は難しいですね.得られた4つの変数は,すべて先行研究からみて妥当なものです.イベント数の指針を厳しくとって3つに減らすなら,この有意でない変数bを削るべきなのかもしれませんが,モデルのROCのarea under curveやaccuracyが落ちるので,どうしたものかなぁと悩んでおります. -- taipapa? 2011-03-14 (月) 19:51:27
  • > イベント数/5−10としているものもあります
    よく分かりませんが,この基準をあなたの場合に適用すると (25/5-10)=-5 となり,あなたのデータは分析できないということになるんじゃないですか?そもそも,1変数あたり 10events などというのは,緩すぎると思っているので。 -- 河童の屁は,河童にあらず,屁である。?