web-dev-qa-db-ja.com

各共変量を明示的に宣言せずにglmを使用してRで式を指定する

それぞれを完全に指定せずに、特定の変数をglm回帰に強制したいと思います。私の実際のデータセットには最大200個の変数があります。これまでのところ、オンライン検索でこのサンプルを見つけることができませんでした。

例(3つの変数のみ):

_n=200
set.seed(39) 
samp = data.frame(W1 = runif(n, min = 0, max = 1), W2=runif(n, min = 0, max = 5)) 
samp = transform(samp, # add A
A = rbinom(n, 1, 1/(1+exp(-(W1^2-4*W1+1))))) 
samp = transform(samp, # add Y
Y = rbinom(n, 1,1/(1+exp(-(A-sin(W1^2)+sin(W2^2)*A+10*log(W1)*A+15*log(W2)-1+rnorm(1,mean=0,sd=.25))))))
_

すべての主要な用語を含めたい場合、これには簡単なショートカットがあります。

_glm(Y~., family=binomial, data=samp)
_

しかし、すべての主要な用語(W1、W2、およびA)とW2 ^ 2を含めたいとしましょう。

_glm(Y~A+W1+W2+I(W2^2), family=binomial, data=samp)
_

これに対するショートカットはありますか?

[公開する前に自分自身を編集する:]これはうまくいきます! glm(formula = Y ~ . + I(W2^2), family = binomial, data = samp)

さて、これはどうですか?

1つの主項変数を省略し、2つの主項(A、W2)とW2 ^ 2およびW2 ^ 2:Aのみを含めたい:

_glm(Y~A+W2+A*I(W2^2), family=binomial, data=samp)
_

明らかに、いくつかの変数だけでショートカットは実際には必要ありませんが、私は高次元のデータを扱います。現在のデータセットには「たった」200個の変数がありますが、他のいくつかには数千から数千の変数があります。

21
S.R.

.を創造的に使用して、すべてまたはほとんどすべての変数を含む式を作成することは、優れたクリーンなアプローチです。便利なもう1つのオプションは、プログラムで数式を文字列として作成し、as.formulaを使用して数式に変換することです。

vars <- paste("Var",1:10,sep="")
fla <- paste("y ~", paste(vars, collapse="+"))
as.formula(fla)

もちろん、flaオブジェクトをもっと複雑にすることもできます。

21
Aniko

アニコはあなたの質問に答えました。少し拡張するには:

-:を使用して変数を除外することもできます。

glm(Y~.-W1+A*I(W2^2), family=binomial, data=samp)

変数の大きなグループの場合、変数をグループ化するためのフレームを作成することがよくあります。これにより、次のようなことができます。

vars <- data.frame(
    names = names(samp),
    main = c(T,F,T,F),
    quadratic =c(F,T,T,F),
    main2=c(T,T,F,F),
    stringsAsFactors=F
)


regform <- paste(
    "Y ~",
    paste(
      paste(vars[vars$main,1],collapse="+"),
      paste(vars[1,1],paste("*I(",vars[vars$quadratic,1],"^2)"),collapse="+"),
      sep="+"
    )
)
> regform
[1] "Y ~ W1+A+W1 *I( W2 ^2)+W1 *I( A ^2)"

> glm(as.formula(regform),data=samp,family=binomial)

あらゆる種類の条件(名前、構造など)を使用してデータフレームを埋めることで、大規模なデータセット内の変数のグループをすばやく選択できます。

16
Joris Meys