为什么无论我如何将偏移量输入到模型中,预测都不会忽略我与 R 中泊松模型的偏移量?

Why is predict not ignoring my offset from a Poisson model in R no matter how I enter the offset into the model?

我在 R 中工作,但一直在 Stata 中验证我的结果,并且通过这样做观察到 R 中的 predict 没有忽略我对泊松模型的偏移量。让我解释一下:

我已经在 R 中安装了以下模型 - 以模拟超额死亡率而不是简单的死亡率(ExpDeaths 是根据一般人口和 logExpDeaths 在所示的 Stata 代码中给定每个受试者的年龄,性别和时期的预期死亡next 只是 ExpDeaths 的自然对数):

model <- glm(Event ~ relevel( as.factor(Period), ref=2) + relevel( as.factor(AgeCat), ref="50-59") + relevel( as.factor(Sex), ref="Female") relevel( as.factor(AlcCombo), ref="0") + relevel( as.factor(ScoreSurv), ref="0") + relevel( as.factor(DrugCombo), ref="0"), offset = (log(ExpDeaths)), data=data, family = poisson)

并使用以下方法在 Stata 中验证了结果:

poisson Event ib1.Period ib1.Age i.Sex ib1.AlcCombo ib0.ScoreSurv ib0.DrugCombo, 
   offset(logExpDeaths)

使用上面几行代码在R和Stata中的模型结果是完全一样的

但是,当我随后尝试从模型中获取每个主题的线性预测变量时:

在 R 中使用代码 predict(model, type="link") 我得到了我的前五个值: -3.812156 -2.472995 -2.499536 -2.299561 -2.217279

但是,当我在 Stata 中使用代码 predict lp, xb nooffset 时,我得到了前五个值: 0.6458265 0.8994361 0.8994361 0.8588267 1.338368

这些是我想在 R 中产生的值,但我意识到问题是 R 没有忽略偏移量,就像我在 Stata 中做的那样 predict lb, xb 即保持偏移量基于预期死亡数,我得到的值与我在 R 中得到的值相同: -3.812156 -2.472995 -2.499536 -2.299561 -2.217279

glm 的 R 文档(参见 https://www.math.ucla.edu/~anderson/rw1001/library/base/html/glm.html)指出“由 offset 指定的偏移量不会包含在 predict.glm 的预测中,而由公式中的偏移项指定的偏移量将是“即如果我像以前那样使用模型,则应忽略偏移量:

model <- glm(Event ~ relevel( as.factor(Period), ref=2) + relevel( as.factor(AgeCat), ref="50-59") + relevel( as.factor(Sex), ref="Female") + relevel( as.factor(AlcCombo), ref="0") + relevel( as.factor(ScoreSurv), ref="0") + relevel( as.factor(DrugCombo), ref="0"), offset = (log(ExpDeaths)), data=data, family = poisson)

与使用下面的相反,这意味着根据文档使用 predict 时不会忽略偏移量:

model <- glm(Event ~ relevel( as.factor(Period), ref=2) + relevel( as.factor(AgeCat), ref="50-59") + relevel( as.factor(Sex), ref="Female") + relevel( as.factor(AlcCombo), ref="0") + relevel( as.factor(ScoreSurv), ref="0") + relevel( as.factor(DrugCombo), ref="0") + offset(log(ExpDeaths)), data=data, family = poisson)

但是,我使用两者得到了完全相同的模型(我期望的)和线性预测变量(应该不同),这使我得出结论,在 R 中编写模型的两种方式都不会导致偏移使用 predict.

时被忽略

我知道我可以只使用 Stata 来获得所需的结果,但我真的很想知道如何使用 R 获得 Stata 结果只是为了我自己的理智,即如何使用 R 预测忽略偏移量。

当您调用 nooffset 时,您只是从线性预测变量中减去偏移量。

斯塔塔

use https://data.princeton.edu/wws509/datasets/ceb.dta,clear
gen y=round(mean*n,1)
gen os=log(n)
poisson y i.res, offset(os)
predict xb, xb
predict lp, xb nooffset
list in 1/6,clean


       i   dur     res            educ   mean    var    n    y         os         xb         lp  
  1.   1   0-4    Suva            None     .5   1.14    8    4   2.079442   3.284039   1.204598  
  2.   2   0-4    Suva   Lower primary   1.14    .73   21   24   3.044523    4.24912   1.204598  
  3.   3   0-4    Suva   Upper primary     .9    .67   42   38    3.73767   4.942267   1.204598  
  4.   4   0-4    Suva      Secondary+    .73    .48   51   37   3.931826   5.136423   1.204598  
  5.   5   0-4   Urban            None   1.17   1.06   12   14   2.484907   3.833794   1.348887  
  6.   6   0-4   Urban   Lower primary    .85   1.59   27   23   3.295837   4.644724   1.348887

R

在这里,请注意我可以复制 stata 调用 predict lp, xb nooffset,只需从 xb 中减去 os(参见 ceb$lp=ceb$xb-ceb$os

library(foreign)
ceb<- read.dta("http://data.princeton.edu/wws509/datasets/ceb.dta")
ceb$y  <- round(ceb$mean*ceb$n, 0)
ceb$os <- log(ceb$n)
m1 = glm(y~res, offset=os,data=ceb,family="poisson")
ceb$xb=predict(m1, type="link")
ceb$lp=ceb$xb-ceb$os 
head(ceb)

  i dur   res          educ mean  var  n  y       os       xb       lp
1 1 0-4  Suva          None 0.50 1.14  8  4 2.079442 3.284039 1.204598
2 2 0-4  Suva Lower primary 1.14 0.73 21 24 3.044522 4.249120 1.204598
3 3 0-4  Suva Upper primary 0.90 0.67 42 38 3.737670 4.942267 1.204598
4 4 0-4  Suva    Secondary+ 0.73 0.48 51 37 3.931826 5.136423 1.204598
5 5 0-4 Urban          None 1.17 1.06 12 14 2.484907 3.833794 1.348887
6 6 0-4 Urban Lower primary 0.85 1.59 27 23 3.295837 4.644724 1.348887