Rを使って重回帰分析をして、summary関数で重回帰分析に関する情報が見れるとわかったものの、『係数だけ』『自由度調整済み決定係数だけ』がほしい。そう思って取得方法をいろいろ調べてみました。
例によって、使うのは下記のニコ動からのデータ。
nico
> nico <- read.table("http://am-yu.net/wp-content/uploads/2013/11/nico1.txt", sep="\t", header=T) > nico.lm <- lm(view~comment+mylist+category, data=nico) > summary(nico.lm) Call: lm(formula = view ~ comment + mylist + category, data = nico) Residuals: Min 1Q Median 3Q Max -3395324 -118156 -20216 55338 5883875 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 4.581e+05 1.986e+04 23.063 < 2e-16 *** comment 1.534e-01 8.494e-03 18.063 < 2e-16 *** mylist 2.805e+01 2.462e-01 113.929 < 2e-16 *** categoryVOCALOID -6.338e+05 3.058e+04 -20.723 < 2e-16 *** categoryアイドルマスター -3.175e+05 2.809e+04 -11.303 < 2e-16 *** categoryアニメ -1.364e+04 2.857e+04 -0.478 0.632996 categoryエンターテイメント 1.061e+05 2.834e+04 3.745 0.000181 *** categoryゲーム 4.131e+05 2.830e+04 14.599 < 2e-16 *** categoryスポーツ -1.350e+05 2.807e+04 -4.809 1.54e-06 *** categoryその他 -2.020e+05 2.808e+04 -7.194 6.81e-13 *** categoryニコニコインディーズ -4.620e+05 2.806e+04 -16.463 < 2e-16 *** categoryニコニコ技術部 -2.452e+05 2.806e+04 -8.737 < 2e-16 *** categoryニコニコ手芸部 -4.472e+05 2.807e+04 -15.932 < 2e-16 *** categoryニコニコ動画講座 -4.355e+05 2.806e+04 -15.518 < 2e-16 *** categoryラジオ -2.788e+05 2.806e+04 -9.935 < 2e-16 *** category演奏してみた -2.989e+05 2.831e+04 -10.558 < 2e-16 *** category音楽 -2.529e+05 2.908e+04 -8.697 < 2e-16 *** category科学 -1.385e+05 2.806e+04 -4.934 8.19e-07 *** category歌ってみた -1.531e+05 2.962e+04 -5.171 2.38e-07 *** category作ってみた -4.071e+05 2.806e+04 -14.507 < 2e-16 *** category自然 -2.943e+05 2.806e+04 -10.489 < 2e-16 *** category車載動画 -4.157e+05 2.807e+04 -14.811 < 2e-16 *** category政治 -2.570e+05 2.806e+04 -9.160 < 2e-16 *** category東方 7.409e+04 2.840e+04 2.609 0.009092 ** category動物 -5.518e+04 2.813e+04 -1.962 0.049805 * category日記 -2.584e+05 2.806e+04 -9.207 < 2e-16 *** category描いてみた -4.139e+05 2.819e+04 -14.682 < 2e-16 *** category踊ってみた -2.066e+05 2.817e+04 -7.337 2.38e-13 *** category旅行 -4.321e+05 2.807e+04 -15.394 < 2e-16 *** category料理 -2.252e+05 2.807e+04 -8.023 1.16e-15 *** category例のアレ -1.988e+05 2.807e+04 -7.082 1.53e-12 *** category歴史 -3.826e+05 2.806e+04 -13.633 < 2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 343700 on 8968 degrees of freedom Multiple R-squared: 0.7591, Adjusted R-squared: 0.7583 F-statistic: 911.6 on 31 and 8968 DF, p-value: < 2.2e-16
上記は、コメント数とマイリスト数とカテゴリーを説明変数にして、再生数を目的変数とした重回帰分析の結果。
係数
lmオブジェクトの後に『$coefficients』、もしくは『["coefficients"]』、coef(coefficients)関数を用いても取得できる。
> nico.lm$coefficients (Intercept) comment mylist 4.580645e+05 1.534206e-01 2.804766e+01 categoryVOCALOID categoryアイドルマスター categoryアニメ -6.337813e+05 -3.175355e+05 -1.364419e+04 categoryエンターテイメント categoryゲーム categoryスポーツ 1.061356e+05 4.130895e+05 -1.349950e+05 categoryその他 categoryニコニコインディーズ categoryニコニコ技術部 -2.020346e+05 -4.620240e+05 -2.452006e+05 categoryニコニコ手芸部 categoryニコニコ動画講座 categoryラジオ -4.472173e+05 -4.355133e+05 -2.787947e+05 category演奏してみた category音楽 category科学 -2.988620e+05 -2.529269e+05 -1.384681e+05 category歌ってみた category作ってみた category自然 -1.531409e+05 -4.071177e+05 -2.943265e+05 category車載動画 category政治 category東方 -4.157339e+05 -2.570409e+05 7.408876e+04 category動物 category日記 category描いてみた -5.517864e+04 -2.583702e+05 -4.138619e+05 category踊ってみた category旅行 category料理 -2.066399e+05 -4.321033e+05 -2.251718e+05 category例のアレ category歴史 -1.988043e+05 -3.825806e+05 > nico.lm["coefficients"] $coefficients (Intercept) comment mylist 4.580645e+05 1.534206e-01 2.804766e+01 categoryVOCALOID categoryアイドルマスター categoryアニメ -6.337813e+05 -3.175355e+05 -1.364419e+04 categoryエンターテイメント categoryゲーム categoryスポーツ 1.061356e+05 4.130895e+05 -1.349950e+05 categoryその他 categoryニコニコインディーズ categoryニコニコ技術部 -2.020346e+05 -4.620240e+05 -2.452006e+05 categoryニコニコ手芸部 categoryニコニコ動画講座 categoryラジオ -4.472173e+05 -4.355133e+05 -2.787947e+05 category演奏してみた category音楽 category科学 -2.988620e+05 -2.529269e+05 -1.384681e+05 category歌ってみた category作ってみた category自然 -1.531409e+05 -4.071177e+05 -2.943265e+05 category車載動画 category政治 category東方 -4.157339e+05 -2.570409e+05 7.408876e+04 category動物 category日記 category描いてみた -5.517864e+04 -2.583702e+05 -4.138619e+05 category踊ってみた category旅行 category料理 -2.066399e+05 -4.321033e+05 -2.251718e+05 category例のアレ category歴史 -1.988043e+05 -3.825806e+05 > coef(nico.lm) (Intercept) comment mylist 4.580645e+05 1.534206e-01 2.804766e+01 categoryVOCALOID categoryアイドルマスター categoryアニメ -6.337813e+05 -3.175355e+05 -1.364419e+04 categoryエンターテイメント categoryゲーム categoryスポーツ 1.061356e+05 4.130895e+05 -1.349950e+05 categoryその他 categoryニコニコインディーズ categoryニコニコ技術部 -2.020346e+05 -4.620240e+05 -2.452006e+05 categoryニコニコ手芸部 categoryニコニコ動画講座 categoryラジオ -4.472173e+05 -4.355133e+05 -2.787947e+05 category演奏してみた category音楽 category科学 -2.988620e+05 -2.529269e+05 -1.384681e+05 category歌ってみた category作ってみた category自然 -1.531409e+05 -4.071177e+05 -2.943265e+05 category車載動画 category政治 category東方 -4.157339e+05 -2.570409e+05 7.408876e+04 category動物 category日記 category描いてみた -5.517864e+04 -2.583702e+05 -4.138619e+05 category踊ってみた category旅行 category料理 -2.066399e+05 -4.321033e+05 -2.251718e+05 category例のアレ category歴史 -1.988043e+05 -3.825806e+05
一つ一つを取得したい場合は、後ろに『[""]』でくくって、中に変数名をいれる。
> nico.lm$coefficients["comment"] comment 0.1534206 > coefficients(nico.lm)["category歴史"] category歴史 -382580.6
残差
lmオブジェクトに$residualをつけるか、residuals(resid)関数を利用
> head(nico.lm$residuals) 1 2 3 4 5 6 5883875.2 977613.7 2102255.3 1075812.0 2667375.5 767793.9 > resid(nico.lm)[1] 1 5883875
lmオブジェクトを引数にしたsummary関数で表示されるような四分位数を取得したい場合は、上記の記述をsummary関数の引数とする。
> summary(nico.lm$residuals) Min. 1st Qu. Median Mean 3rd Qu. Max. -3395000 -118200 -20220 0 55340 5884000 > summary(nico.lm$residuals)["Min."] Min. -3395000
予測値
lmオブジェクトに$fitted.valuesをつけるか、predict関数の引数にlmオブジェクトをいれる
> head(nico.lm$fitted.values) 1 2 3 4 5 6 5394438.8 3010273.3 1665769.7 2638170.0 635890.5 2445645.1 > head(predict(nico.lm))[1] 1 5394439
切片を含む、説明変数の数
lmオブジェクトに『$rank』
> nico.lm$rank [1] 32
自由度(標本数から説明変数(切片含む)の数を引いたもの)
$df.residualをつける。
> nico.lm$df.residual [1] 8968
カテゴリー変数の値
$xlevelsをつける。
> nico.lm$xlevels $category [1] "R-18" "VOCALOID" "アイドルマスター" "アニメ" [5] "エンターテイメント" "ゲーム" "スポーツ" "その他" [9] "ニコニコインディーズ" "ニコニコ技術部" "ニコニコ手芸部" "ニコニコ動画講座" [13] "ラジオ" "演奏してみた" "音楽" "科学" [17] "歌ってみた" "作ってみた" "自然" "車載動画" [21] "政治" "東方" "動物" "日記" [25] "描いてみた" "踊ってみた" "旅行" "料理" [29] "例のアレ" "歴史" > nico.lm$xlevels$category[1] [1] "R-18"
これを、"category"という文字列(もしくは、その文字列をいれた変数)から取得したいのだけどやりかたが分からない。nico.lm["category"][1]では取得できないようだし。data.frame関数通したらできるようではあるのだけど。
> data.frame(nico.lm$xlevels["category"])[1,] [1] R-18 30 Levels: R-18 VOCALOID アイドルマスター アニメ エンターテイメント ゲーム スポーツ ... 歴史 > as.character(data.frame(nico.lm$xlevels["category"])[1,]) #nico.lm$xlevels$categoryと同じように文字列として返すように [1] "R-18"
まわりくどい。自分が知らないだけで、何かいいやり方があると思うのだけど。
モデル式
formula関数を使うか、$callをつける(結果は異なる)
> nico.lm$call lm(formula = view ~ comment + mylist + category, data = nico) > formula(nico.lm) view ~ comment + mylist + category
AIC(赤池情報量規準)
AIC関数の引数にいれる
> AIC(nico.lm) [1] 255028.7
解析に使用したデータのみのモデル
$modelをつける。
> head(nico.lm$model) view comment mylist category 1 11278314 6249436 138031 エンターテイメント 2 3987887 829307 82675 エンターテイメント 3 3768025 389382 37145 エンターテイメント 4 3713982 225500 72711 エンターテイメント 5 3303266 92691 2049 エンターテイメント 6 3213439 224000 65855 エンターテイメント
決定係数
lmオブジェクトを引数にしたsummary関数の後ろに$r.squared
> summary(nico.lm)$r.squared [1] 0.759098
自由度調整済み決定係数
lmオブジェクトを引数にしたsummary関数の後ろに$adj.r.squared
> summary(nico.lm)["adj.r.squared"] $adj.r.squared [1] 0.7582653
標準誤差
lmオブジェクトを引数にしたsummary関数の後ろに$coefficients[,"Std. Error"]
> summary(nico.lm)$coefficients[,"Std. Error"] (Intercept) comment mylist 1.986104e+04 8.493787e-03 2.461863e-01 categoryVOCALOID categoryアイドルマスター categoryアニメ 3.058317e+04 2.809355e+04 2.857243e+04 categoryエンターテイメント categoryゲーム categoryスポーツ 2.834005e+04 2.829519e+04 2.806882e+04 categoryその他 categoryニコニコインディーズ categoryニコニコ技術部 2.808468e+04 2.806417e+04 2.806438e+04 categoryニコニコ手芸部 categoryニコニコ動画講座 categoryラジオ 2.807075e+04 2.806461e+04 2.806203e+04 category演奏してみた category音楽 category科学 2.830566e+04 2.908149e+04 2.806221e+04 category歌ってみた category作ってみた category自然 2.961716e+04 2.806283e+04 2.806167e+04 category車載動画 category政治 category東方 2.806985e+04 2.806164e+04 2.839598e+04 category動物 category日記 category描いてみた 2.812505e+04 2.806198e+04 2.818819e+04 category踊ってみた category旅行 category料理 2.816564e+04 2.806990e+04 2.806650e+04 category例のアレ category歴史 2.807369e+04 2.806324e+04 > summary(nico.lm)$coefficients[,"Std. Error"]["comment"] comment 0.008493787
t値
lmオブジェクトを引数にしたsummary関数の後ろに$coefficients[,"t value"]
> summary(nico.lm)$coefficients[,"t value"] (Intercept) comment mylist 23.063467 18.062679 113.928595 categoryVOCALOID categoryアイドルマスター categoryアニメ -20.723203 -11.302792 -0.477530 categoryエンターテイメント categoryゲーム categoryスポーツ 3.745074 14.599285 -4.809431 categoryその他 categoryニコニコインディーズ categoryニコニコ技術部 -7.193764 -16.463126 -8.737078 categoryニコニコ手芸部 categoryニコニコ動画講座 categoryラジオ -15.931792 -15.518235 -9.934944 category演奏してみた category音楽 category科学 -10.558383 -8.697177 -4.934327 category歌ってみた category作ってみた category自然 -5.170683 -14.507365 -10.488560 category車載動画 category政治 category東方 -14.810691 -9.159870 2.609128 category動物 category日記 category描いてみた -1.961904 -9.207128 -14.682103 category踊ってみた category旅行 category料理 -7.336595 -15.393832 -8.022794 category例のアレ category歴史 -7.081519 -13.632801 > summary(nico.lm)$coefficients[,"t value"]["categoryアニメ"] categoryアニメ -0.47753
p値
lmオブジェクトを引数にしたsummary関数の後ろに$coefficients[,"t value"]
> summary(nico.lm)$coefficients[,"Pr(>|t|)"] (Intercept) comment mylist 2.191800e-114 1.157002e-71 0.000000e+00 categoryVOCALOID categoryアイドルマスター categoryアニメ 3.195280e-93 2.009004e-29 6.329964e-01 categoryエンターテイメント categoryゲーム categoryスポーツ 1.814698e-04 9.989462e-48 1.538258e-06 categoryその他 categoryニコニコインディーズ categoryニコニコ技術部 6.808945e-13 5.101892e-60 2.823412e-18 categoryニコニコ手芸部 categoryニコニコ動画講座 categoryラジオ 2.253504e-56 1.295343e-53 3.862130e-23 category演奏してみた category音楽 category科学 6.591317e-26 4.003897e-18 8.187452e-07 category歌ってみた category作ってみた category自然 2.382739e-07 3.713319e-47 1.370842e-25 category車載動画 category政治 category東方 4.733542e-49 6.344227e-20 9.092391e-03 category動物 category日記 category描いてみた 4.980456e-02 4.106686e-20 3.039963e-48 category踊ってみた category旅行 category料理 2.381544e-13 8.494697e-53 1.163698e-15 category例のアレ category歴史 1.533205e-12 6.675175e-42 > summary(nico.lm)$coefficients[,"Pr(>|t|)"]["(Intercept)"] (Intercept) 2.1918e-114
他にもいろいろあるようですが、自分が必要になりそうなもののみ列挙しました。なお、ここに書いてあるのはネットや書籍で調べたわけではなく、names関数を使って調べて行った結果、分かった方法です。
> names(nico.lm) [1] "coefficients" "residuals" "effects" "rank" "fitted.values" "assign" [7] "qr" "df.residual" "contrasts" "xlevels" "call" "terms" [13] "model" > names(summary(nico.lm)) [1] "call" "terms" "residuals" "coefficients" "aliased" "sigma" [7] "df" "r.squared" "adj.r.squared" "fstatistic" "cov.unscaled" > colnames(summary(nico.lm)$coefficients) [1] "Estimate" "Std. Error" "t value" "Pr(>|t|)"
names関数、すごい便利です。
コメント
カテゴリーは数値ではないのにlmのvariableとして機能しています。もしよろしければなぜ数値でないものも使えるのか教えていただけませんか?参考文献もいただけると助かります。不躾ですみません。
最近、Rから離れていましたので少し間違ってるかもしれませんが、
これはcategoryはカテゴリ変数(名前が同じなのでややこしいですが)と呼ばれる変数です(カテゴリカル変数とか名義変数ともいうそうです)。
カテゴリそれぞれの値があることにして、当てはまる場合は1、当てはまらない場合は0として算出しています。
例えば、categoryがVOCALOIDのデータについてはcategoryVOCALOIDという値を1として、それ以外の(例えば『categoryアイドルマスター』とか『category東方』とかの値)を0として算出しています。
なお、『R-18』のcategory(categoryR-18)がないのは不適切な内容だからというわけではなく、R-18の場合は全てのカテゴリ変数を0と考え、デフォルトではR-18の算出結果になるからです(たまたま、昇順で『R-18』が最初になったのでR-18がデフォルト扱いとなりました)。
多分、『R カテゴリ変数』とかでググるといろいろでてくると思います。
自分は、とある弁当屋の統計技師(データサイエンティスト) ―データ分析のはじめかた―という本で知りました。ライトノベル形式でRの勉強ができて面白いですよ。