3

speedglmRのパッケージを使用して回帰モデルを推定しようとしています。一般に、結果はベース R のglm関数を使用した場合と同じspeedglmですが、data.frame から特定の因子レベルを完全に削除すると、予期しない動作が発生します。たとえば、次のコードを参照してください。

dat1 <- data.frame(y=rnorm(100), x1=gl(5, 20)) 
dat2 <- subset(dat1, x1!=1)

glm("y ~ x1", dat2, family="gaussian")
Coefficients:
(Intercept)          x13          x14          x15  
    -0.2497       0.6268       0.3900       0.2811 

speedglm(as.formula("y ~ x1"), dat2)
Coefficients:
(Intercept)          x12          x13          x14          x15  
    0.03145     -0.28114      0.34563      0.10887           NA 

x1==1因子水準が から削除されているため、ここで 2 つの関数は異なる結果を返しますdat2。代わりに使用dat1した場合、結果は同じでした。のようなデータを処理するときのspeedglmように振る舞う方法はありますか?glmdat2

4

2 に答える 2

2

因子に依存しない変数を持つ glm の既定の動作は、最初の空でないレベルを参照カテゴリとして使用することです。speedglm は最後のレベルを参照カテゴリとして扱っているようです。同等の結果を得るにはrelevel、glm の呼び出しで使用できます。

 set.seed(2)
 dat1 <- data.frame(y=rnorm(100), x1=gl(5, 20)) 
 dat2 <- subset(dat1, x1!=1)
 glm(y ~ relevel(x1,"5"), dat2, family="gaussian")

 Coefficients:
   (Intercept)  relevel(x1, "5")2  relevel(x1, "5")3  relevel(x1, "5")4  
     -0.27163            0.27135            0.36688            0.09934  

speedglm(as.formula("y ~ x1"), dat2)
 Coefficients:
 (Intercept)          x12          x13          x14          x15  
     -0.27163      0.27135      0.36688      0.09934           NA  
于 2013-10-31T02:27:41.223 に答える
2

ドロップレベルが鍵だと思います。

str(droplevels(dat2))str(dat2)-x1==1削除されても、因子水準にはまだリストされています

だからspeedglm(as.formula("y ~ x1"), droplevels(dat2))等しいはずですglm("y ~ x1", dat2, family="gaussian")

于 2013-10-31T01:00:20.697 に答える