トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

Multiple Regression Analysis

*disclaimer
42799

R

重回帰分析

 サンプルデータとスクリプト

  • サンプルデータ:NICER 1.0より学習者のエッセイデータ287個
  • Criterionによるスコア、延べ語数、異なり語数、文数、TTR、ギローインデックス、平均単語長、平均文長、MATTR を各エッセイの特徴量として抽出
  • ファイル名とともに結果をテキストファイルに保存するスクリプト

myIndices4.R(34)

  1. NICER1.0を解凍したフォルダーの中のNICER_NNSに作業ディレクトリーを移動
  2. スクリプトを実行
  3. 結果を保存するファイルを作業ディレクトリーの外にファイル名をつけて「保存(作成)」例:jpn4.txt
  4. Rの中に読み込む
> jpn4 <- read.table(choose.files())
> class(jpn4)
[1] "data.frame"
> head(jpn4)
          V1 V2  V3  V4 V5        V6       V7        V8       V9      V10
1 JPN501.txt  4 319 135 30 0.4231975 7.558549 0.5921317 4.304075 10.63333
2 JPN502.txt  4 356 161 29 0.4522472 8.532983 0.6649157 4.233146 12.27586
3 JPN503.txt  3 201 121 13 0.6019900 8.534682 0.7170149 4.746269 15.46154
4 JPN504.txt  4 260 140 27 0.5384615 8.682431 0.6877692 4.761538  9.62963
5 JPN505.txt  4 420 175 25 0.4166667 8.539126 0.6341905 3.995238 16.80000
6 JPN506.txt  3 261 124 20 0.4750958 7.675407 0.6390038 4.072797 13.05000

 前処理

  • 見出しをつける
> names(jpn4) <- c("file", "Score", "Token", "Type", "NoS", "TTR", "GI", "MATTR", "AWL", "ASL")
> head(jpn4)
        file Score Token Type NoS       TTR       GI     MATTR      AWL      ASL
1 JPN501.txt     4   319  135  30 0.4231975 7.558549 0.5921317 4.304075 10.63333
2 JPN502.txt     4   356  161  29 0.4522472 8.532983 0.6649157 4.233146 12.27586
3 JPN503.txt     3   201  121  13 0.6019900 8.534682 0.7170149 4.746269 15.46154
4 JPN504.txt     4   260  140  27 0.5384615 8.682431 0.6877692 4.761538  9.62963
5 JPN505.txt     4   420  175  25 0.4166667 8.539126 0.6341905 3.995238 16.80000
6 JPN506.txt     3   261  124  20 0.4750958 7.675407 0.6390038 4.072797 13.05000

  • データ数の確認
> nrow(jpn4)
[1] 287
  • 欠損値を調べる 欠損値があると計算できないことがあるので
> is.na(jpn4)
  • 欠損値がいくつかるか調べる
> sum(is.na(jpn4))
[1] 2
  • 欠損値を除いたデータにする
> jpn4.b <- na.omit(jpn4)
[1] 285
  • jpn4.bについて、各カラムを単位に操作する
> attach(jpn4.b)

こうしておけば、いちいち jpn4.b$Score としなくても Score だけでよい。

 重回帰分析 lm()

  • lm(従属変数 ~ 独立変数1 + 独立変数2 + 独立変数3 + ... )
> lm(Score ~ Token + Type + NoS + TTR + GI + MATTR + AWL + ASL)
  • データの中の一つを従属変数にして、残りはすべて独立変数として全部入れるときは、省略して書ける
lm(従属変数 ~ ., data=データ名)

Call:
lm(formula = Score ~ Token + Type + NoS + TTR + GI + MATTR + AWL + ASL)

Coefficients:
(Intercept)        Token         Type          NoS          TTR           GI        MATTR          AWL          ASL  
  -0.145765     0.004008    -0.021620     0.003506    -9.147468     1.004200    -1.306580     0.556470     0.021069  

  • 結果を詳しく見るには、一旦保存して、そのsummary()を見る。
> jukaiki <- lm(Score ~ Token + Type + NoS + TTR + GI + MATTR + AWL + ASL)
> summary(jukaiki)

Call:
lm(formula = Score ~ Token + Type + NoS + TTR + GI + MATTR + 
    AWL + ASL)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.9080 -0.2508  0.0035  0.2581  0.7614 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.145765   0.642548  -0.227 0.820705    
Token        0.004008   0.002144   1.870 0.062603 .  
Type        -0.021620   0.010421  -2.075 0.038953 *  
NoS          0.003506   0.014089   0.249 0.803665    
TTR         -9.147468   1.328107  -6.888 3.83e-11 ***
GI           1.004200   0.257697   3.897 0.000122 ***
MATTR       -1.306580   1.362782  -0.959 0.338519    
AWL          0.556470   0.064559   8.620 5.32e-16 ***
ASL          0.021069   0.025071   0.840 0.401424    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.334 on 276 degrees of freedom
Multiple R-squared:  0.8145,    Adjusted R-squared:  0.8091 
F-statistic: 151.5 on 8 and 276 DF,  p-value: < 2.2e-16

標準化

  • 変数の規模・単位が違うので、影響を等しく比べられるように「標準化(正規化)」する。

https://scrapbox.io/nishio/%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%A8%E6%A8%99%E6%BA%96%E5%8C%96
関数は scale()
ただし、データは数値でないといけないので、まず、一番左にあるファイル名のカラムを除く。

> jpn4.c <- jpn4.b[,-1]
  • 様子を見てみる
> pairs(jpn4.c)
  • 標準化する
> jpn4.z <- scale(jpn4.c)
  • 型がmatrixになっているので、データフレームに変換
> jpn4.z <- as.data.frame(jpn4.z)
  • これをもとに、改めて、重回帰分析
> attach(jpn4.z)
> jukaiki.z <- lm(Score ~ Token + Type + NoS + TTR + GI + MATTR + AWL + ASL)
> summary(jukaiki.z) 

Call:
lm(formula = Score ~ Token + Type + NoS + TTR + GI + MATTR + 
    AWL + ASL)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.18748 -0.32797  0.00458  0.33760  0.99580 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3.587e-17  2.588e-02   0.000 1.000000    
Token        5.179e-01  2.770e-01   1.870 0.062603 .  
Type        -9.364e-01  4.514e-01  -2.075 0.038953 *  
NoS          3.299e-02  1.326e-01   0.249 0.803665    
TTR         -7.898e-01  1.147e-01  -6.888 3.83e-11 ***
GI           1.282e+00  3.290e-01   3.897 0.000122 ***
MATTR       -7.775e-02  8.110e-02  -0.959 0.338519    
AWL          2.423e-01  2.811e-02   8.620 5.32e-16 ***
ASL          7.988e-02  9.505e-02   0.840 0.401424    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4369 on 276 degrees of freedom
Multiple R-squared:  0.8145,    Adjusted R-squared:  0.8091 
F-statistic: 151.5 on 8 and 276 DF,  p-value: < 2.2e-16

VIF

  • ところが、独立変数間でお互いに相関が高いものがある。
    • 複数の相関が高いものを重ねて入れてしまうと、その影響が重複して評価されてしまう。
    • VIF(Variance Inflation factor)をチェック(10以上はダメ、ほとんど同じもの)
    • パッケージcarをインストールする
> library(car)
  • 関数 vif()の実行
> vif(jukaiki.z)
     Token       Type        NoS        TTR         GI      MATTR        AWL        ASL 
114.203516 303.150320  26.150429  19.565310 161.087442   9.787097   1.175870  13.443703 

10以上は外すべき。2以下が望ましい。

  • しかし、一つをはずすと、それに関連したものが変動して、値も変わるので、一概に10以上はすべてダメというわけではない。何を選ぶかは、判断による。で、やってみる。

変数選択

関数 step()

> jukaiki.z.result <- step(jukaiki.z)
> summary(jukaiki.z.result)

Call:
lm(formula = Score ~ Token + Type + TTR + GI + AWL + ASL)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.17036 -0.34503 -0.00159  0.34247  0.98419 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  7.508e-17  2.583e-02   0.000   1.0000    
Token        4.732e-01  2.183e-01   2.167   0.0311 *  
Type        -7.950e-01  4.082e-01  -1.948   0.0525 .  
TTR         -8.081e-01  1.057e-01  -7.648 3.36e-13 ***
GI           1.145e+00  2.709e-01   4.227 3.22e-05 ***
AWL          2.389e-01  2.768e-02   8.630 4.83e-16 ***
ASL          5.048e-02  2.918e-02   1.730   0.0848 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 0.4361 on 278 degrees of freedom
Multiple R-squared:  0.8138,    Adjusted R-squared:  0.8098 
F-statistic: 202.6 on 6 and 278 DF,  p-value: < 2.2e-16
  • Token + Type + TTR + GI + AWL + ASL が変数の候補として残った。
    • ただし、TypeとASLは重要度が低い
  • ここで、また、VIFを見てみる。
> vif(jukaiki.z.result)
     Token       Type        TTR         GI        AWL        ASL 
 71.198905 248.805646  16.675124 109.594573   1.144067   1.271753 

試行錯誤

  • TypeとASLを除いて、また、step()してみて、VIFを見てみる、、、という風に試行錯誤していく。
> jukaiki.z2 <- lm(Score ~ Token + TTR + GI + AWL)
> vif(jukaiki.z2)
    Token       TTR        GI       AWL 
12.765221 10.876050  8.233309  1.081001 
> jukaiki.z2.result <- step(jukaiki.z2)
> summary(jukaiki.z2.result)

Call:
lm(formula = Score ~ TTR + GI + AWL)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.24601 -0.34767  0.02472  0.32806  1.00389 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  1.446e-16  2.608e-02   0.000        1    
TTR         -7.848e-01  2.817e-02 -27.861   <2e-16 ***
GI           7.205e-01  2.752e-02  26.178   <2e-16 ***
AWL          2.539e-01  2.716e-02   9.346   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 0.4403 on 281 degrees of freedom
Multiple R-squared:  0.8082,    Adjusted R-squared:  0.8061 
F-statistic: 394.6 on 3 and 281 DF,  p-value: < 2.2e-16
  • TTRとGIとAWLが残る。
> jukaiki.z3 <- lm(Score ~ TTR + GI + AWL)
> vif(jukaiki.z3)
     TTR       GI      AWL 
1.162202 1.109615 1.080821 
  • これで、VIFも問題ない。
  • R2も0.8とかなり高い。(8割のデータがこのモデルで説明できる)

結論

エッセイのスコアはTTRとGIとAWLで、8割が説明できる。

興味深い点

  • TTRもGIも語彙の多様性を表す指標といわれているのに、、、
  • 相関を見てみる
> cor.test(TTR, GI)

        Pearson's product-moment correlation

data:  TTR and GI
t = 5.3729, df = 283, p-value = 1.62e-07
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.1949506 0.4060786
sample estimates:
      cor 
0.3042462 
  • 相関は弱い。