web-dev-qa-db-ja.com

Rglmモデルで統計的に有意な変数を選択する

Yなどの結果変数と、Yに影響を与える可能性のある100個のディメンションのリスト(X1 ... X100など)があります。

glmを実行し、モデルの概要を表示した後、統計的に有意な変数が表示されます。これらの変数を選択して別のモデルを実行し、パフォーマンスを比較できるようにしたいと思います。モデルの要約を解析して、重要なものだけを選択する方法はありますか?

13

関数「summary」を介して、glm結果のp値にアクセスできます。係数行列の最後の列は「Pr(> | t |)」と呼ばれ、モデルで使用される因子のp値を保持します。

次に例を示します。

#x is a 10 x 3 matrix
x = matrix(rnorm(3*10), ncol=3)
y = rnorm(10)
res = glm(y~x)
#ignore the intercept pval
summary(res)$coeff[-1,4] < 0.05
6
kith

@kithが道を開いたが、できることはまだまだある。実際、プロセス全体を自動化することができます。まず、いくつかのデータを作成しましょう。

_x1 <- rnorm(10)
x2 <- rnorm(10)
x3 <- rnorm(10)
y <- rnorm(10)
x4 <- y + 5 # this will make a Nice significant variable to test our code
(mydata <- as.data.frame(cbind(x1,x2,x3,x4,y)))
_

その場合、モデルは次のようになります。

_model <- glm(formula=y~x1+x2+x3+x4,data=mydata)
_

そして、係数のブールベクトルは実際に次の方法で抽出できます。

_toselect.x <- summary(model)$coeff[-1,4] < 0.05 # credit to kith
_

でもこれが全てじゃない!さらに、これを行うことができます:

_# select sig. variables
relevant.x <- names(toselect.x)[toselect.x == TRUE] 
# formula with only sig variables
sig.formula <- as.formula(paste("y ~",relevant.x))  
_

編集:後続のポスターが指摘しているように、すべての変数を含めるには、後者の行をsig.formula <- as.formula(paste("y ~",paste(relevant.x, collapse= "+")))にする必要があります。

そして、OPが当初望んでいたように、有意な変数のみを使用して回帰を実行します。

_sig.model <- glm(formula=sig.formula,data=mydata)
_

この場合、x4をy + 5として定義したため、推定値は1に等しくなり、完全な関係を意味します。

21
Maxim.K

Maxim.Kコマンドに問題がある人のために

sig.formula <- as.formula(paste("y ~",relevant.x))

これを使って

sig.formula <- as.formula(paste("y ~",paste(relevant.x, collapse= "+")))

最終的なコードは次のようになります

toselect.x <- summary(glmText)$coeff[-1,4] < 0.05 # credit to kith
# select sig. variables
relevant.x <- names(toselect.x)[toselect.x == TRUE] 
# formula with only sig variables
sig.formula <- as.formula(paste("y ~",paste(relevant.x, collapse= "+")))  

これにより、最初の変数のみを選択する際に直面しているバグが修正されます。

2
Sherl

sig.formula <-as.formula(paste( "y〜"、relevant.x))

related.xの最初の変数のみを貼り付け、他の変数は無視されます(たとえば、条件を> 0.5に反転してみてください)

1
user2347888