使用泊松回归建模死亡率

机器算法验证 回归 多重回归 生存 泊松回归
2022-03-22 14:15:06

我正在研究克罗恩病患者死亡率的趋势(1998 年至 2011 年间)。在 1998 年至 2011 年期间,每位患者(病例)均已纳入研究。纳入时,每位患者均与年龄和性别相同的健康对照进行匹配。我正在分析死亡率的趋势。当直接这样做时,没有任何调整,我会得到随时间波动的死亡率,这可能是因为包含给定年份的个体与包含另一年的个体不可比较。因此,我的目标是调整死亡率。我预计两组(病例和对照)的死亡率会随着时间的推移而下降,病例和对照之间的差距将逐渐缩小。

我的想法是通过泊松回归进行调整。我的数据是个人层面的。我希望获得1998 年至 2011 年每年病例和对照的发病率(每 1000 人年)的估计值。生存时间将作为模型中的偏移量包括在内这里已经做了类似的事情

我已经附加了我的数据集中的前 200 行,其中包含 1500 个人。这是数据变量解释:

  • dead = 患者是否在随访期间死亡
  • surv = 生存天数
  • 年龄组 = 分类年龄组(4 组)
  • 性别 = 男/女
  • 诊断 = 0 表示健康对照,1 表示克罗恩病
  • 年龄 = 年龄
  • 纳入年份 = 纳入研究的年份

到目前为止我尝试了什么?我尝试使用 R 中的 glm() 函数拟合泊松模型,使用单个观察值(log(surv) 作为偏移量),但我要么收到错误,要么无法弄清楚如何使用拟合。我还将数据分组,然后在 glm() 中分析死亡人数;当我使用拟合来获得发病率时,我只能获得特定年龄/年龄组和性别的发病率(根据需要在 predict() 函数中指定)。

我真的很感激一些统计建议和编码示例,可以在附加的数据集上完成。

1个回答

在没有看到数据集(不可用)的情况下,它似乎大多是正确的。泊松回归的好处在于,当按照建议使用时,它们可以提供比率。可能值得记住的一件事是,可能存在过度分散,您应该切换到负二项式回归(请参阅 MASS 包)。

泊松回归不关心数据是否聚合,但实际上非聚合数据很脆弱,可能会导致一些意外错误。请注意,您不能surv == 0在任何情况下都拥有。当我测试的估计是相同的:

set.seed(1)
n <- 1500
data <- 
  data.frame(
    dead = sample(0:1, n, replace = TRUE, prob = c(.9, .1)),
    surv = ceiling(exp(runif(100))*365),
    gender = sample(c("Male", "Female"), n, replace = TRUE),
    diagnosis = sample(0:1, n, replace = TRUE),
    age = sample(60:80, n, replace = TRUE),
    inclusion_year = sample(1998:2011, n, replace = TRUE)
  )

library(dplyr)
model <- 
  data %>% 
  group_by(gender, 
           diagnosis,
           age,
           inclusion_year) %>% 
  summarise(Deaths = sum(dead),
            Person_time = sum(surv)) %>%
  glm(Deaths ~ gender + diagnosis + I(age - 70) + I(inclusion_year - 1998) + offset(log(Person_time/10^3/365.25)), 
      data = . , family = poisson)

alt_model <- glm(dead ~ gender + diagnosis + I(age - 70) + I(inclusion_year - 1998) + offset(log(surv/10^3/365.25)), 
    data = data , family = poisson)
sum(coef(alt_model) - coef(model))
# > 1.779132e-14
sum(abs(confint(alt_model) - confint(model)))
# > 6.013114e-11

当你得到一个速率时,将变量居中是很重要的,这样截距是可解释的,例如:

> exp(coef(model)["(Intercept)"])
(Intercept) 
    51.3771

可以解释为基本利率,然后协变量是利率比率。如果我们想要 10 年后的基准利率:

> exp(coef(model)["(Intercept)"] + coef(model)["I(inclusion_year - 1998)"]*10)
(Intercept) 
     47.427 

我目前已将包含年份建模为趋势变量,但您可能应该检查非线性,有时对时间点进行分类很有用。我在本文中使用了这种方法:

D. Gordon、P. Gillgren、S. Eloranta、H. Olsson、M. Gordon、J. Hansson 和 KE Smedby,“皮肤黑色素瘤发病率的时间趋势(按详细解剖位置和紫外线照射模式):回顾性人群基于研究,”黑色素瘤研究,第一卷。25,没有。4,第 348-356 页,2015 年 8 月。