我想在新数据上预测拟合的泊松glm,因为它是使用offset=log(Exposure)拟合的,但我对predict.glm()中包含术语“offset”感到困惑。我不明白是否有必要包含它,如果我想包含它,我应该如何做到与拟合中使用的偏移量具有相同的影响?
为了消除我的疑虑,我从头开始创建了一个数据集,并决定比较三种可能的方法:
然而,在比较结果时,我惊讶地发现所有三种方法都得出相同的预测。结论:predict.glm() 中的偏移项被忽略?我仍然问这个,因为我是 R 的新手,我检查它的程序可能是错误的。
此外,即使可能已经发布了类似的问题,但答案很少且与此结果不一致。
set.seed(1)
exp<-c(1:100)/100
dummy<-rep(c(0,1), each=50)
y<-floor(rpois(100,dummy*exp*10)) #count data
DTtest<-as.data.frame(exp)
DTtest$D<-dummy
DTtest$y<-y
gtest<-glm(y~D, offset=log(exp), family=poisson(link="log"), data=DTtest, trace=TRUE)
DTtest1<-predict(gtest, newdata=DTtest, type="response", offset=log(exp)) #predict1
DTtest2<-predict(gtest, newdata=DTtest, type="response", offset=exp) #predict2
DTtest3<-predict(gtest, newdata=DTtest, type="response") #predict3
sum(DTtest1==DTtest2)
sum(DTtest2==DTtest3)
sum(DTtest1==DTtest3)
我得到的总和的结果是:100,100,100,这等于用于预测的数据的长度(我也使用DTtest作为新数据)。这意味着这 3 种方法之间的所有预测都具有相同的值。
我原以为这些值会因预测()中显式偏移量的不同影响而有所不同,但结果却不然。
是的,
offset
被忽略。
?predict.glm
的帮助包只说:
:进一步传入或传出其他方法的参数。...
这不是很有帮助。但是,如果我们查看
predict.glm
的代码,我们不会看到 ...
在任何地方使用(它将被传递给另一个函数)。 (如果您坚持基于代码的解决方案,我们可以这样搜索:
any(grepl("...", deparse(body(stats:::predict.glm)), fixed = TRUE))
## FALSE
如果您想使用其他偏移值进行预测,您可以设置一个具有不同
newdata
值的 exp
数据框。 (顺便说一句,使用 exp
作为变量名可能是一个坏主意,因为它与内置指数函数的名称相同......大多数时候你可以摆脱这个,但有时它会导致令人困惑的错误。)