在具有已删除因子的数据帧上使用speedglm

时间:2013-10-30 23:58:53

标签: r glm

我正在尝试使用R的speedglm包来估计回归模型。通常,结果与使用基本R的glm函数相同,但是当我从data.frame中完全删除给定的因子级别时,speedglm会发出意外行为。例如,请参阅以下代码:

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已从dat2中删除。如果我使用dat1,结果将是相同的。在处理speedglm等数据时,有没有办法让glmdat2一样行事?

2 个答案:

答案 0 :(得分:2)

Droplevels我认为是关键。

str(droplevels(dat2))str(dat2) - 即使x1==1被删除,它仍会列在因子级别

因此speedglm(as.formula("y ~ x1"), droplevels(dat2))应该等于glm("y ~ x1", dat2, family="gaussian")

答案 1 :(得分:2)

具有因子自变量的glm的默认行为是使用 first 非空级别作为参考类别。似乎speedglm将 last 级别视为参考类别。要获得可比较的结果,您可以在调用glm:

时使用relevel
 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