裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

ダメ出し:データに NA が含まれるときには注意

2012年11月30日 | ブログラミング

Regression Analysis on R kosugitti

標準化偏回帰係数を求めるためにもとのデータを変数ごとに標準化したものを使って重回帰分析をするという手順を示している。

reg2 <- lm(kokugo ~ sansuu + eigo, data = sample)
summary(reg2)

            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  22.0649     6.7036    3.29   0.0014 **
sansuu       -0.0789     0.0872   -0.91   0.3675    
eigo          0.8036     0.0340   23.64   <2e-16 ***

sample.z <- scale(sample[4:10])
sample.z <- data.frame(sample.z)
reg3 <- lm(kokugo ~ sansuu + eigo, data = sample.z)
summary(reg3)

しかし,出てきた結果がおかしい。

             Estimate Std. Error t value Pr(>|t|)    
 (Intercept)  0.00409    0.03882    0.11     0.92    
 sansuu      -0.03618    0.03996   -0.91     0.37    
 eigo         0.92324    0.03905   23.64   <2e-16 ***

どこがおかしいか分からない人もいるとは思うが,変数を標準化して重回帰分析をすると,(Intercept) は 0 にならなければならないのだ。

なぜこうなったかという理由は,元のデータ sample に欠損値があるためである。
第 1 には,scale 関数は,変数ごとに NA を自動的に除いて,平均値=0,標準偏差=1 になるように標準化する。

> (d <- data.frame(x=c(1, 3, 4, NA, 7), y=c(3, NA, 7, 3, 2)))
   x  y
1  1  3
2  3 NA
3  4  7
4 NA  3
5  7  2
> (d2 <- data.frame(scale(d)))
     x          y
1 -1.1 -0.3382407
2 -0.3         NA
3  0.1  1.4657098
4   NA -0.3382407
5  1.3 -0.7892283
> apply(d2, 2, mean, na.rm=TRUE)
            x             y
-6.938894e-18  0.000000e+00
> apply(d2, 2, sd, na.rm=TRUE)
x y
1 1

第 2 には,lm 関数は分析に関与する変数(独立変数と従属変数)のどれかが NA のものは分析に使われない。
従って,lm(y ~ x, data=d2) には,2 行目と 4 行目のデータは使われない。
2 行目と 4 行目のデータを除いて d2 の平均値と標準偏差を見るとどうなるか。

> apply(d2[-c(2, 4),], 2, mean, na.rm=TRUE)
        x         y
0.1000000 0.1127469
> apply(d2[-c(2, 4),], 2, sd, na.rm=TRUE)
       x        y
1.200000 1.193201

分析に使われるデータは「標準化されたものではない」。

正しくやるためにはどうするか。
まず,実際に分析に使用する変数だけを含むデータフレームを作り,na.omit なりを使って欠損値を含まないデータフレームにする。その後,scale で標準化する。そのデータフレームを lm で分析する。

> (d3 <- data.frame(scale(na.omit(d2))))
              x          y
1 -1.000000e+00 -0.3779645
3  1.156482e-17  1.1338934
5  1.000000e+00 -0.7559289
> apply(d3, 2, mean, na.rm=TRUE)
            x             y
-7.016595e-17 -1.848565e-17
> apply(d3, 2, sd, na.rm=TRUE)
x y
1 1
> summary(lm(y ~ x, data=d3))

Call:
lm(formula = y ~ x, data = d3)

Residuals:
      1       3       5
-0.5669  1.1339 -0.5669

Coefficients:
              Estimate Std. Error t value Pr(>|t|)
(Intercept) -3.205e-17  8.018e-01   0.000    1.000
x           -1.890e-01  9.820e-01  -0.192    0.879

Residual standard error: 1.389 on 1 degrees of freedom
Multiple R-squared: 0.03571,    Adjusted R-squared: -0.9286
F-statistic: 0.03704 on 1 and 1 DF,  p-value: 0.879

さらには,普通は標準化偏回帰係数はこんな風にしては求めない(2 回も重回帰分析をする必要はない)。

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ダメ出し:なぜ oneway.test ... | トップ | ダメ出し: カイ二乗統計量の... »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事