为什么无论我如何将偏移量输入到模型中,预测都不会忽略我与 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
我在 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