我正在尝试使用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
等数据时,有没有办法让glm
像dat2
一样行事?
答案 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