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已从 中删除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

Droplevels 我认为是关键。

str(droplevels(dat2))vs. str(dat2)- 即使x1==1被删除,它仍然在因子级别中列出

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

于 2013-10-31T01:00:20.697 回答