2016-11-17 4 views
1

2つのカテゴリ予測変数(a、b)とバイナリターゲット(y)変数を含むデータセットがあるとします。ファクタ参照セルコーディングによって導入された線形相関変数を無視する方法

> df <- data.frame(
> a = factor(c("cat1","cat2","cat3","cat1","cat2")), 
> b = factor(c("cat1","cat1","cat3","cat2","cat2")), 
> y = factor(c(T,F,T,F,T)) 
>) 

次の論理的な関係は、データ内に存在します。

if (a = cat3) then (b = cat3 and y = true) 
else if (a = b) then (y = true) else y = false 

は、私は私のデータセットのためのモデルを構築するためにglmを使用したいです。 glmは、カテゴリ変数aとbに参照セルコーディングを自動的に適用します。また、変数aliashere)が導入されないように、各因子変数に適切な数のコードを見つけることにも注意します。

しかし、上記のデータセットの場合と同様に、変数aに対して生成された1つの参照コードと変数bの1つの参照コードとの間に線形関係が存在することがあります。

は私のモデルの出力を参照してください。

> model <- glm(y ~ ., family=binomial(link='logit'), data=df) 
> summary(model) 
... 
Coefficients: (1 not defined because of singularities) 
      Estimate Std. Error z value Pr(>|z|) 
(Intercept) 1.965e-16 1.732e+00 0.000 1.000 
acat2  -2.396e-16 2.000e+00 0.000 1.000 
acat3  1.857e+01 6.523e+03 0.003 0.998 
bcat2  0.000e+00 2.000e+00 0.000 1.000 
bcat3    NA   NA  NA  NA # <- get rid of this? 

どのように私はこのケースを処理する必要がありますか? glmに生成された参照コードの一部を省略するように指示する方法はありますか? 実際の問題では私の"cat3"の値はNAに相当します。私は私のデータセットのまったく同じインスタンスでNAという2つの有意義な変数を持っています。

EDIT:

確認答えはコメントで指摘したようにしかし、この特定のケースでは特異点を無視することができ、問題を解決します。

+0

@ ZheyuanLi:質問をお寄せいただきありがとうございます。特異点がモデル(またはアルゴリズムの収束速度など)に悪影響を及ぼすかどうかはわかりませんでした。正しく理解すれば、これらの特異点を無視して、その予測モデルをそのまま使用できますか? – fab

答えて

0

問題のコメントは関連していますが、等価性に関して自分自身を満足させるために、そのようなエリミッションをしないように比較できるように、NAモデル行列の列を削除することはまだ有効です。特に

、あなたは1秒間に2回の実行で冗長モデル行列の列を削除glmを実行できます。

model <- glm(y ~ ., family=binomial(link='logit'), data=df) # as in question 

mm <- model.matrix(model)[, !is.na(coef(model)) ] 
df0 <- data.frame(y = df$y, mm[, -1]) 
update(model, data = df0) 

与える:

Call: glm(formula = y ~ ., family = binomial(link = "logit"), data = df0) 

Coefficients: 
(Intercept)  acat2  acat3  bcat2 
    1.965e-16 -2.396e-16 1.857e+01 0.000e+00 

Degrees of Freedom: 4 Total (i.e. Null); 1 Residual 
Null Deviance:  6.73 
Residual Deviance: 5.545  AIC: 13.55 

注意をあなたが使用しない場合ということ応答がyであることが分かっているという事実から、上記のdf0の代入を次のように置き換えて応答とその名前を抽出することができます。

df0 <- data.frame(model.response(model.frame(model)), mm[, -1]) 
names(df0)[1] <- as.character(attr(terms(model), "variables")[[2]]) 
+0

私はmodel.matrixを知らなかった。これはglm内部でも使用されていますか?私のdfに数値変数がいくつか含まれている場合(そのまま維持する)、model.matrixからそれらを除外しなければならないでしょうか? – fab

+0

私は、NA係数を持つモデル行列の列を除外したいと思うので、上記のコードはモデルフレームの列の型に関係なく実行する必要があります。 –

関連する問題