如何在 R 中向 GLM 模型添加偏移量?

Wil*_* M. 1 r offset glm

我正在解决 Agresti 的分类数据分析练习 4.10。

他提供了桌子

     Aortic | Mitral

<55       4       1
       1259    2082

55+       7       9
       1417    1647
Run Code Online (Sandbox Code Playgroud)

行代表年龄组,列代表心脏瓣膜类型,每个单元格中的两个数字是死亡人数(顶部)和总时间长度(底部)。然后他建议模型 $$ \log(\mu_{ij}) = \alpha + 1 \times \log(t_{ij}) + \beta_1 a_i + \beta_2 \nu_j $$ 其中 $t_{ij}$是单元格$(i,j)的总时间长度,$$a_i$是“55+”的指示变量,$\nu_j$是“二尖瓣”的指示变量。

然后练习 4.10 要求找到 $\beta_1.$ 的 95% 轮廓似然置信区间。我明白这在数学上意味着什么,但我在R. 我正在使用R“ProfileLikelihood”库。

这是我的尝试:

heart_table <- data.frame(
  y = c(9,7,1,4),
  tot_time = c(1647,1417,2082,1259),
  age = c(1,1,0,0), #1 means 55+
  valve = c(1,0,1,0) #1 means mitral
)
heart_prof <- profilelike.glm(
  y ~ valve,
  data = heart_table,
  family = poisson(),
  offset.glm = log(tot_time),
  profile.theta = "age",
  lo.theta = -.5,
  hi.theta = 3.5
)
Run Code Online (Sandbox Code Playgroud)

它产生一个错误

Error: object 'tot_time' not found
Run Code Online (Sandbox Code Playgroud)

如果我引用log(tot_time)我会得到一个不同的错误,即

heart_prof <- profilelike.glm(
  y ~ valve,
  data = heart_table,
  family = poisson(),
  offset.glm = "log(tot_time)",
  profile.theta = "age",
  lo.theta = -.5,
  hi.theta = 3.5
)
Run Code Online (Sandbox Code Playgroud)

产生

Error in model.frame.default(formula = y ~ -1 + X + offset(pi * theta.off) +  : 
  invalid type (list) for variable 'offset(glm.off)'
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用公式

y ~ valve + offset.glm(log(tot_time))
Run Code Online (Sandbox Code Playgroud)

有错误

Error in offset.glm(log(tot_time)) : could not find function "offset.glm"
Run Code Online (Sandbox Code Playgroud)

和公式

y ~ valve + offset(log(tot_time))
Run Code Online (Sandbox Code Playgroud)

它不会产生错误(它运行)。然而,这感觉是错误的,因为 profilelike.glm 的文档指出“不应提供偏移量。而是使用 offset.glm”。

ProfileLikelihood 文档:https://cran.r-project.org/web/packages/ProfileLikelihood/ProfileLikelihood.pdf

gun*_*ica 5

我没有,也不知道那个包,但你不需要它。您可以在基数 R 中拟合泊松回归模型,并且可以通过调用 来基于分析可能性来获得置信区间confint。考虑:

\n
> heart_table <- data.frame(\n+   y = c(9,7,1,4),\n+   tot_time = c(1647,1417,2082,1259),\n+   age = c(1,1,0,0), #1 means 55+\n+   valve = c(1,0,1,0) #1 means mitral\n+ )\n> m = glm(y~valve+offset(log(tot_time)), data=heart_table, family="poisson")\n> summary(m)\n\nCall:\nglm(formula = y ~ valve + offset(log(tot_time)), family = "poisson", \n    data = heart_table)\n\nDeviance Residuals: \n      1        2        3        4  \n 1.9095   0.4718  -2.3931  -0.5383  \n\nCoefficients:\n            Estimate Std. Error z value Pr(>|z|)    \n(Intercept)  -5.4942     0.3015 -18.222   <2e-16 ***\nvalve        -0.4271     0.4369  -0.978    0.328    \n---\nSignif. codes:  0 \xe2\x80\x98***\xe2\x80\x99 0.001 \xe2\x80\x98**\xe2\x80\x99 0.01 \xe2\x80\x98*\xe2\x80\x99 0.05 \xe2\x80\x98.\xe2\x80\x99 0.1 \xe2\x80\x98 \xe2\x80\x99 1\n\n(Dispersion parameter for poisson family taken to be 1)\n\n    Null deviance: 10.8405  on 3  degrees of freedom\nResidual deviance:  9.8857  on 2  degrees of freedom\nAIC: 27.013\n\nNumber of Fisher Scoring iterations: 5\n\n> confint(m)\nWaiting for profiling to be done...\n                2.5 %     97.5 %\n(Intercept) -6.149598 -4.9562364\nvalve       -1.302631  0.4365193\n
Run Code Online (Sandbox Code Playgroud)\n