統計ER

R, EZR, SPSS, KH Coder を使ったデータ分析方法を紹介するブログ。ニッチな内容が多め

ステップワイズ変数選択で ある変数だけは残したい場合

ステップワイズ変数選択の際に ある変数だけは残っていてほしい場合の指定方法

>>もう統計で悩むのを終わりにしませんか?


↑1万人以上の医療従事者が購読中

ステップワイズ変数選択を EZR で実行する方法

ステップワイズ変数選択を EZR で実行するには、データを読み込んだ後、例えば重回帰のメニューからステップワイズを選択する

実行すると、ステップワイズ変数選択は、以下のように実施される

> res <- stepwise(RegModel.1, direction="backward/forward", criterion="AIC")

Direction:  backward/forward
Criterion:  AIC 

Start:  AIC=-147.32
LogCD34perBW ~ age + gender + Group + WBC.entry + Plt.entry + 
    ApheresisVolume

                  Df Sum of Sq    RSS     AIC
- Plt.entry        1   0.00864 7.3280 -149.24
- gender           1   0.03892 7.3583 -148.95
- age              1   0.12298 7.4423 -148.14
<none>                         7.3194 -147.32
- Group            1   0.25607 7.5754 -146.88
- ApheresisVolume  1   0.49402 7.8134 -144.69
- WBC.entry        1   0.80924 8.1286 -141.88

Step:  AIC=-149.24
LogCD34perBW ~ age + gender + Group + WBC.entry + ApheresisVolume

                  Df Sum of Sq    RSS     AIC
- gender           1   0.03840 7.3664 -150.87
- age              1   0.11755 7.4455 -150.11
<none>                         7.3280 -149.24
- Group            1   0.25043 7.5784 -148.85
+ Plt.entry        1   0.00864 7.3194 -147.32
- ApheresisVolume  1   0.48539 7.8134 -146.69
- WBC.entry        1   0.96837 8.2964 -142.43

Step:  AIC=-150.87
LogCD34perBW ~ age + Group + WBC.entry + ApheresisVolume

                  Df Sum of Sq    RSS     AIC
- age              1   0.12085 7.4872 -151.71
<none>                         7.3664 -150.87
- Group            1   0.23941 7.6058 -150.60
+ gender           1   0.03840 7.3280 -149.24
+ Plt.entry        1   0.00811 7.3583 -148.95
- ApheresisVolume  1   0.66779 8.0342 -146.71
- WBC.entry        1   0.99045 8.3568 -143.91

Step:  AIC=-151.71
LogCD34perBW ~ Group + WBC.entry + ApheresisVolume

                  Df Sum of Sq    RSS     AIC
- Group            1   0.19479 7.6820 -151.89
<none>                         7.4872 -151.71
+ age              1   0.12085 7.3664 -150.87
+ gender           1   0.04170 7.4455 -150.11
+ Plt.entry        1   0.00283 7.4844 -149.74
- ApheresisVolume  1   0.60062 8.0879 -148.23
- WBC.entry        1   1.08102 8.5683 -144.14

Step:  AIC=-151.89
LogCD34perBW ~ WBC.entry + ApheresisVolume

                  Df Sum of Sq    RSS     AIC
<none>                         7.6820 -151.89
+ Group            1   0.19479 7.4872 -151.71
+ age              1   0.07623 7.6058 -150.60
+ gender           1   0.03050 7.6515 -150.17
+ Plt.entry        1   0.00072 7.6813 -149.90
- ApheresisVolume  1   0.60501 8.2870 -148.51
- WBC.entry        1   0.99257 8.6746 -145.26

> summary(res)

Call:
lm(formula = LogCD34perBW ~ WBC.entry + ApheresisVolume, data = TempDF)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.76985 -0.22692  0.03478  0.20694  0.66902 

Coefficients:
                   Estimate  Std. Error t value Pr(>|t|)   
(Intercept)     -0.90751397  0.32874553  -2.761  0.00741 **
WBC.entry        0.00009510  0.00003208   2.964  0.00418 **
ApheresisVolume  0.05761960  0.02489841   2.314  0.02369 * 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.3361 on 68 degrees of freedom
Multiple R-squared:  0.1725, Adjusted R-squared:  0.1482 
F-statistic:  7.09 on 2 and 68 DF,  p-value: 0.001597

ステップワイズ変数選択で ある変数だけは残しておきたい場合

このとき、Groupは脱落してしまっているが、本当は Group はどうしても説明変数として残しておきたかったとする

その時はどうするかというと、step() という関数を使う

R スクリプト窓に以下のように書いて実行する

step(RegModel.1, scope=list(lower=~Group))

RegModel.1 は、EZR が自動で名付けた重回帰モデルオブジェクト

scope が、ステップワイズの適応範囲で、list() の中に、lower= で、チルダ ( ~ ) のあとに残したい変数名を書き入れる

このようにすると、下記のように Group を最後まで残せる

> step(RegModel.1, scope=list(lower=~Group))
Start:  AIC=-147.32
LogCD34perBW ~ age + gender + Group + WBC.entry + Plt.entry + 
    ApheresisVolume

                  Df Sum of Sq    RSS     AIC
- Plt.entry        1   0.00864 7.3280 -149.24
- gender           1   0.03892 7.3583 -148.95
- age              1   0.12298 7.4423 -148.14
<none>                         7.3194 -147.32
- ApheresisVolume  1   0.49402 7.8134 -144.69
- WBC.entry        1   0.80924 8.1286 -141.88

Step:  AIC=-149.24
LogCD34perBW ~ age + gender + Group + WBC.entry + ApheresisVolume

                  Df Sum of Sq    RSS     AIC
- gender           1   0.03840 7.3664 -150.87
- age              1   0.11755 7.4455 -150.11
<none>                         7.3280 -149.24
- ApheresisVolume  1   0.48539 7.8134 -146.69
- WBC.entry        1   0.96837 8.2964 -142.43

Step:  AIC=-150.87
LogCD34perBW ~ age + Group + WBC.entry + ApheresisVolume

                  Df Sum of Sq    RSS     AIC
- age              1   0.12085 7.4872 -151.71
<none>                         7.3664 -150.87
- ApheresisVolume  1   0.66779 8.0342 -146.71
- WBC.entry        1   0.99045 8.3568 -143.91

Step:  AIC=-151.71
LogCD34perBW ~ Group + WBC.entry + ApheresisVolume

                  Df Sum of Sq    RSS     AIC
<none>                         7.4872 -151.71
- ApheresisVolume  1   0.60062 8.0879 -148.23
- WBC.entry        1   1.08102 8.5683 -144.14

Call:
lm(formula = LogCD34perBW ~ Group + WBC.entry + ApheresisVolume, 
    data = TempDF)

Coefficients:
    (Intercept)            Group        WBC.entry  ApheresisVolume  
    -1.09045844       0.10552746       0.00009989       0.05741134  

>>もう統計で悩むのを終わりにしませんか?


↑1万人以上の医療従事者が購読中

ステップワイズ変数選択で複数の変数を残したい場合

ステップワイズ変数選択で複数の変数を残したい場合は、プラスでつないで指定する

例えば、lower = ~Group + age + gender などとする

実行結果は以下の通り

> step(RegModel.1, scope=list(lower=~Group+age+gender))
Start:  AIC=-147.32
LogCD34perBW ~ age + gender + Group + WBC.entry + Plt.entry + 
    ApheresisVolume

                  Df Sum of Sq    RSS     AIC
- Plt.entry        1   0.00864 7.3280 -149.24
<none>                         7.3194 -147.32
- ApheresisVolume  1   0.49402 7.8134 -144.69
- WBC.entry        1   0.80924 8.1286 -141.88

Step:  AIC=-149.24
LogCD34perBW ~ age + gender + Group + WBC.entry + ApheresisVolume

                  Df Sum of Sq    RSS     AIC
<none>                         7.3280 -149.24
- ApheresisVolume  1   0.48539 7.8134 -146.69
- WBC.entry        1   0.96837 8.2964 -142.43

Call:
lm(formula = LogCD34perBW ~ age + gender + Group + WBC.entry + 
    ApheresisVolume, data = GCSF_CD34)

Coefficients:
    (Intercept)              age      gender[T.M]            Group        WBC.entry  
    -0.96183059      -0.00308517       0.05025930       0.12130618       0.00009524  
ApheresisVolume  
     0.05569276

ステップワイズ変数選択ではなく、減少法や増加法で行いたい場合

step() 関数の引数に direction= というのがあるので、これを使う

減少法の場合は、direction="backward" とする

増加法の場合は、direction="forward" とする

まとめ

ステップワイズ変数選択のときに、ある変数だけはどうしても残したいという場合の指定の仕方を解説した

モデルオブジェクトを作成した後、step() の引数として、scope=list(lower=~) のチルダの右に残したい変数を書き入れて step() を実行する

複数の変数を残したい場合はプラス記号で付け足す

参考サイト

[R] for parameter 'keep' in 'step'

r - Force step() to keep a certain valuable - Stack Overflow

おすすめ書籍

EZR公式マニュアル