【R言語】統計解析フリーソフトR 第4章【GNU R】

このエントリーをはてなブックマークに追加
940132人目の素数さん:2013/08/11(日) 11:43:47.48
なにもかいてなければwindows
これ常識だから。
941132人目の素数さん:2013/08/11(日) 11:59:40.82
>>940
マルチプラットフォームに対応するUNIX由来のRに、
そんな常識が通用するのか。ばかばかしい。
これはWindowsに移植した弊害だな。
942132人目の素数さん:2013/08/11(日) 12:03:33.72
Windowsに移植したからこそ広まったんだろ。
優秀な人材はwindowsを使っているから
開発測度が飛躍的にたかまってな。
943132人目の素数さん:2013/08/11(日) 12:09:33.25
>>942
普及に関しては、首肯する。
でも、開発速度は違うよ。
Rの開発Coreチームの人間と会ったり話したりしたことがないの?
Prof. Brian RipleyはDebianとSolarisだよ。
彼らがMinGWをメインで使っているとでも言うの?
944132人目の素数さん:2013/08/11(日) 12:24:03.00
マイクロソフトの社員とかいるだろ。
945132人目の素数さん:2013/08/11(日) 21:37:38.51
>>943
>Rの開発Coreチームの人間と会ったり話したりしたことがないの?

貴殿はどこでそんな人と会うのか。
946132人目の素数さん:2013/08/12(月) 00:26:42.67
>>945
絶対に会えるのはuseR!かな。
今年のuseR!はもう終わったけど、2014年はロサンゼルスだよ。
ttp://user2014.stat.ucla.edu/
947132人目の素数さん:2013/08/12(月) 09:22:28.53
どこで会うのか聞いているのに
どこで会えるかを答えるアホ
948132人目の素数さん:2013/08/12(月) 13:15:17.97
もしかして話しかけるという選択肢がない?
まあ、ソーシャルメディアでも同じだけど。
949132人目の素数さん:2013/08/13(火) 06:18:30.38
いかにも親しげな書き方しといて実際は相手に認知されてないというオチ
950132人目の素数さん:2013/08/13(火) 08:39:37.37
Rって一日目のデータフレームと2日目のデータフレームがあった場合
2つを1つにしないといけないんですか?
951132人目の素数さん:2013/08/13(火) 08:49:21.06
例えば
一日目
a b
1 4
2 5
3 6
2日目
a b
1 7
2 8
というでーたふれーむがあったら
a b1 b2
1 4 7 
2 5 8
3 6 NA
見たいなのをつくって、b1-b2を計算するんですか?
952132人目の素数さん:2013/08/13(火) 10:16:27.95
>>950
する必要ないです。そのまま使えばよいです。
「必要がない」というだけで、1つにしてもOKです。

表計算の感覚だと1つに統合する必要がありそうな気がしますが、
データの並びにだけ気をつければ、問題ありません。
953132人目の素数さん:2013/08/13(火) 11:52:09.33
>>952
ありがとうございます。
でもデータの順番がバラバラで
入っているaもバラバラの場合は
1つにした方が簡単ですよね。
954132人目の素数さん:2013/08/13(火) 12:50:46.55
>>953
Rでは、表形式にできないようなデータ構造を含む多種多様で複雑な構造が可能なので、
もう少し具体的なデータ構造についての説明がないと、
あなたの場合はどうなのか、何とも言えない。
ただ、1つにした方が簡単と感じるなら1つにすればどうだろう。
955132人目の素数さん:2013/08/13(火) 13:53:12.10
でもRって1つにしてやる関数は揃っているけど
2つにしてやる関数は作らないといけないっぽくないですか?
956954:2013/08/13(火) 13:56:31.44
>>950はもしかして>>951なのか?
それなら、データ構造は明らかで申し訳ない。
> (d1 <- data.frame(a = 1:3, b = 4:6))
a b
1 1 4
2 2 5
3 3 6
> (d2 <- data.frame(a = c(2,1,3), b = c(7:8, NA)))
a b
1 2 7
2 1 8
3 3 NA
だとすると、aごとにbの差分を計算するなら、
> d1$b - d2[order(d2$a), ]$b
[1] -4 -2 NA
とする。
957132人目の素数さん:2013/08/13(火) 14:02:49.85
>>956
ありがとうございます。
そんな感じです。
ただ違うのはaに1 2 3が存在するとは限らないということです。
たとえば初めの日には1がいたけど次の日には2が居なかったりします。
958132人目の素数さん:2013/08/13(火) 14:04:44.81
>>955
formulaを作成するときは、変数名と値をdataに入れると便利な場合はある(一括指定とか)。
でも、dataのしては必須ではない。
> lm(d1$b~d2$b)

Call:
lm(formula = d1$b ~ d2$b)

Coefficients:
(Intercept) d2$b
-3 1

これで、1日目のbと2日目のbの回帰モデルを検討できる。
別に1つにする必要はない。
959132人目の素数さん:2013/08/13(火) 14:12:41.98
>>957
それなら、1つにした方が分かりやすいね。
> (d1 <- data.frame(a = sample(1:10, 5), b = 1:5))
a b
1 1 1
2 2 2
3 9 3
4 4 4
5 7 5
> (d2 <- data.frame(a = sample(1:10, 5), b = 5:1))
a b
1 3 5
2 4 4
3 1 3
4 8 2
5 2 1
> merge(d1, d2, by = "a", all = TRUE)
a b.x b.y
1 1 1 3
2 2 2 1
3 3 NA 5
4 4 4 4
5 7 5 NA
6 8 NA 2
7 9 3 NA
960132人目の素数さん:2013/08/18(日) 11:21:12.12
>>940
その認識はスレによっては非常識でしかないから今すぐ治せ
961132人目の素数さん:2013/08/21(水) 17:24:11.75
抽象的な質問で申し訳ないのだけど、
再帰関数を書きたいのだけど、
再帰処理の終了判定条件なしで、
単純に再帰の回数を指定して処理を終了させるにはどうすればよいのだろう。

x' = f(x) みたいな関数があって、
f(f(f(f(f(f(x))))))という風に有限回数で入れ子にしたい。
962132人目の素数さん:2013/08/22(木) 02:47:07.27
>>960
「なにも書いてなければ(馬鹿な)windows(ユーザー)」というのはもやは常識だろ
963961:2013/08/22(木) 09:57:51.44
自己解決。

f <- function(x){
return(x + 1)
}

f.main <- function(x, i = 3){
for (j in 1:i){
x <- f(x)
}
return(x)
}
とすれば、forループ終了後に最終的なxの値はそのまま残ってくれるみたいだ。

> f.main(1, i = 100)
[1] 101

Recall()とか考えて迷宮に入っていた。
964132人目の素数さん:2013/08/22(木) 11:07:46.37
>>963
どうせならこうだな

f <- function(x) {x + 1}
g <- function(x) {x + 2}

f.main <- function(a, x, i){
for (j in 1:i){
x <- a(x)
}
return(x)
}

f.main(f, 1, 100)
f.main(g, 1, 100)
965132人目の素数さん:2013/08/23(金) 00:01:20.82
データフレームX(m×n)とベクトルv(1×n)があった時に、vと一致するXの行を抽出したいのですが、シンプルな方法ありませんか?
applyとsetequalで出来るかと思ったのですがうまくいきませんでした
forループ2つで行と列を見ていけば出来ることは出来たのですが、どうも非効率的な気がします
966132人目の素数さん:2013/08/23(金) 07:56:01.36
>>961

?Reduceより
Iterate <- function(f, n = 1) function(x) Reduce(function(g, ...) g(...), rep.int(list(f), n), x, right = TRUE)
h <- function(x) 1 + 1 / x
> Iterate(h, 40)(1) == (sqrt(5) + 1) / 2
[1] TRUE

関数言語っぽく
Compose <- function(f, g) function(x) f(g(x))
nest.fun <- function(f, n){
if (n == 0) function(x) identity(x)
else Compose(f, nest.fun(f, n - 1))
}
> nest.fun(h, 40)(1) == (sqrt(5) + 1) / 2
[1] TRUE

末尾再帰かつ高速化
nest.fun <- function(f, n, acc.fun = identity){
if (n == 0) return(acc.fun)
else if (n %% 2 == 0) nest.fun(Compose(f, f), n / 2, acc.fun)
else nest.fun(f, n - 1, Compose(f, acc.fun))
}
967132人目の素数さん:2013/08/23(金) 10:16:51.18
>>964,966
ありがとうございます。大変参考になりました。

>>966の9行目、
function(x) retrun(x) じゃなくて、function(x) identity(x)にするのは何か理由があるのでしょうか。
以前から、identity()の存在意義がよく分からないのです。

>>965
よく理解できていないけど、Xから抽出したものが、vと同一ならば、vそのものだよね?
だとすると、vのままでよいので、抽出する意味がない。
vと同一の行番号が知りたいとか、
vと同一の行がXに複数含まれていて、その全てを取り出したい、
または、vと一致する行がXに含まれているかどうかの有無をチェックしたいという意味でしょうか。

> X <- matrix(1:100, 10)
> v <- (1:10) * 10 - 4
としたとき、
> X[apply(X, 1, all.equal, v) == TRUE, ]
[1] 6 16 26 36 46 56 66 76 86 96
と抽出できるけど、これは
> v
[1] 6 16 26 36 46 56 66 76 86 96
と同一なわけで。
968132人目の素数さん:2013/08/23(金) 17:33:45.68
ロジスティック回帰について教えてください。
下記データ( r t )があります。

r <- c( 0.727 , 0.634 , 0.500 , 0.443 , 0.416 , 0.328 , 0.272 , 0.225 , 0.133 )
t <- 1:9

このとき、以下のようにロジスティック回帰を行うと、
glm( r ~ x , family=binomial )
>In eval(expr, envir, enclos) : 二項 glm で整数でない成功数がありました!
とエラーになります。

ここで質問です。
1.小数データを目的変数に、ロジスティック回帰はできないのですか?
できるのであれば、どうすればよいのでしょうか?

2.ふと疑問に思ったのですが、目的変数が0、1って、そのままでは、ロジット変換できないと思うのですが、
内部的にどのように計算されているのでしょうか?(微小数を加減算している?0+0.0000001と1-0.0000001 )
969132人目の素数さん:2013/08/23(金) 19:13:32.20
>>968
> エラーになります
エラーになりません。「警告」と「エラー」は違います。

> 小数データを目的変数に、ロジスティック回帰はできないのですか?
できますが、多分あなたが思っているものと違います。

glm()でロジスティック回帰をやるときには、
目的変数の設定仕方が3通りあります。
>>968を見ると、目的変数は、二値でも、説明変数カテゴリごとの計数(整数)でもないから、
説明変数カテゴリごとの割合(小数)だよね。
その場合は、分母に相当するweightsを指定しないと駄目だよ。

何を言っているのか、分からなければ、Rの解説書を読んだ方がよいよ。
Rで学ぶデータサイエンスシリーズ「一般線形モデル」なら、pp.53-56のあたり。

2. の質問は、目的変数をロジット変換するという思いこみによる誤解。
実測値(0,1)とモデル値exp(beta_1x_1+beta_0)/(1-exp(beta_1x_1+beta_0))を比較して、
当てはまりを見る話じゃないの?
970132人目の素数さん:2013/08/23(金) 21:57:17.78
>>954
レスありがとうございます。

確かに「警告」であって「エラー」ではないですね。
私が提示した例は、説明変数カテゴリごとの割合(小数)です。
その上で、明示的に分母に相当するweightsを指定しなくても
同じウエイトが設定されるのでは?と思いました。如何でしょう?
そうだとしたら、「警告」を出力しなくても良いのではと思いました。

2.
> 実測値(0,1)とモデル値exp(beta_1x_1+beta_0)/(1-exp(beta_1x_1+beta_0))を比較

なるほど。すっきりしました!
実測値(0,1)とモデル値が、完全に一致しない(限りなく近くはなるが・・・)ところに
私は何か引っかかっていたようです。
971966:2013/08/23(金) 23:17:44.07
>>967
>function(x) retrun(x) じゃなくて、function(x) identity(x)にするのは何か理由があるのでしょうか。
朝だったので単なる勘違いでした。
-if (n == 0) function(x) identity(x)
+if (n == 0) identify

個人的には恒等写像って意味を明確にしたいからidentityを使う感じでしょうか。
むろんfunction(x) x でも機能は同等ですが。
972965:2013/08/24(土) 00:32:37.50
すいません自己解決しました
言葉足らずで申し訳ありませんでしたが、最終的にやりたかったことは変数の組合せ別の集計でした
適当で申し訳ありませんが結局こうなりました

X <- as.data.frame(matrix(1:100, 10))
X <- rbind(X, X, X[1:5,], X[1:4,])
Y <- data.frame(unique(X), freq=NA)

for (i in 1:nrow(Y)) {
Y$freq[i] <- nrow(X[which(apply(X, 1, identical, as.matrix(Y)[i,1:(ncol(Y)-1)])),])
}
973132人目の素数さん:2013/08/24(土) 10:18:54.38
>>972
こんなんもあるよ。変数も指定できるみたい
library(plyr)
count(X)
count(X, c("V1", "V2"))
974132人目の素数さん:2013/08/24(土) 13:28:44.72
>>973
知りませんでした。そのまんま私のやりたいことができてびっくりです
ありがとうございます
975132人目の素数さん:2013/08/26(月) 14:22:25.29
>>968-970
ちょっとピントがずれている気がする…

元データ解らないからなんとも言えないんだが、
>>969氏の回答がより正しいだろうことを前提に、あえて>>968氏の欲しい答えを返すと

glm( r ~ t , family = "gaussian"( link = "logit" ) )

となる (これは誤差構造に正規分布を仮定して、ロジスティック式のパラメータを推定している)
ちなみに>>969氏の方法だと誤差構造に二項分布を仮定して(以下同文)となる (おそらくこっちの方がより正しい)
976132人目の素数さん:2013/08/30(金) 22:05:29.30
裏Rjpwiki読んでてもしかして中の人ってG大のA先生なのではなどと思った
977132人目の素数さん:2013/08/30(金) 23:04:49.61
>>976
うーん、口調が違う気がするけど。
それより、河童さんが誰か気になる。
978132人目の素数さん:2013/09/07(土) 12:43:56.32
>>977
最近、河童さんと俺しかQ&A初心者コースに回答していない。
過疎化が進んでいるのかな。
979132人目の素数さん:2013/09/09(月) 00:44:44.31
>>841
kwsk
980132人目の素数さん:2013/09/23(月) 09:35:45.96
Rのホームディレクトリの場所は変更はできないんでしょうか?
作業ディレクトリではなく、ホームディレクトリです。
981980:2013/09/23(月) 09:54:08.60
すいませんなんか勘違いしてました
ホームディレクトリというのはたんにRのアプリが入ってる場所のことなのかな
982132人目の素数さん:2013/09/23(月) 17:01:03.55
>>980
> Rのホームディレクトリの場所は変更はできないんでしょうか?
もちろん、出来ます。
でも、突拍子もないところにインストールすると、
見つけてもらえない場合があるので、
標準的な場所以外は、念のために環境変数R_HOMEを設定しておく方が良いでしょう。
ただし、設定したことを忘れると、トラブルシューティングではまることがあるので注意。
983980:2013/09/23(月) 21:47:00.43
>>982
ありがとうございます
初心者……というかパソコン自体もあまり詳しくないのですが(Macをつかってます)、ホームディレクトリっていうのは、単にRをインストールした場所という意味なんでしょうか?
作業ディレクトリには、.RDataとか.Rhistoryとか.Rprofileとかが入っているのですが、ホームディレクトリというのはそういう、設定ファイル的なものを置く場所ではないのでしょうか。
なんか、置き場のようなものとしてホームディレクトリってのがあるんであれば、作業ディレクトリの近くに置いといたほうがいいのかな…とか思ったのですが
984132人目の素数さん:2013/09/24(火) 00:07:26.50
>>983
コンピュータの世界では一般的に、
例えば、○○というソフトウェアがあったとして、
○○のホームディレクトリというのは、
○○をインストールしたディレクトリと実用上は同等です。
これはRに限った話ではなくて、一般的な話です。

> 作業ディレクトリには、.RDataとか.Rhistoryとか.Rprofileとかが入っている
それらは、システム全体に有効にさせる場合を除いて、
ユーザのホームディレクトリ(つまりMacOSXの場合、/Users/ユーザ名)に置くファイルです。
作業ディレクトリに置いた場合にどうなるか実験したことはありませんが。
985984:2013/09/24(火) 00:11:07.87
すみません。うっかり一部嘘を書きました。
訂正します。
Rを終了するときに、作業内容と履歴を保存すれば、
.Rdataと.Rhistoryはそれぞれの作業ディレクトリに残ります。
986980:2013/09/24(火) 08:03:34.73
>>985
おっと、わたし、.Rprofileも作業ディレクトリにおいてました…たしかにいま解説サイトをいくつか見るとホームディレクトリだよ〜んと書いてありました
最初、グラフの日本語化のために解説サイトに公開されてる.Rprofileの例をいくつか試してダメだったんですが、作業ディレクトリに置いてたからかな…
でも今は日本語化に成功してるので、後で自分の環境がどうなってるか確認してみます
ありがとうございます
987132人目の素数さん:2013/09/24(火) 09:07:46.53
>>986
> たしかにいま解説サイトをいくつか見ると
正しいかどうか確証がないサイトの解説よりも、
helpを読もうよ。

help("Rprofile")

Rはどんどん進化しているので、Webサイトや書籍で解説しても、
すぐに内容が陳腐化します。
自分が使っているバージョンのRではどうなのか、
自分がインストールしているRに尋ねるのが最短だと思いますよ。
988980:2013/09/24(火) 12:40:21.75
>>987
なるほど…
989132人目の素数さん
0