Rから回帰分析のいろいろな情報を取得する方法

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関数、すごい便利です。

コメント

  1. Tatsu より:

    カテゴリーは数値ではないのにlmのvariableとして機能しています。もしよろしければなぜ数値でないものも使えるのか教えていただけませんか?参考文献もいただけると助かります。不躾ですみません。

    • amyu より:

      最近、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の勉強ができて面白いですよ。

タイトルとURLをコピーしました