使用泊松模型计算发病率:与 Cox PH 模型的风险比的关系

机器算法验证 r 生存 cox模型 泊松回归 发病率比
2022-03-27 14:11:49

我想计算发病率以呈现风险比,以便呈现相对和绝对风险度量。我在其他研究中看到,可以使用泊松模型计算这种发病率,模型中的随访时间作为补偿。所以我在 R 中尝试如下:

library(survival)

# Get example data
data(colon)
colon$status <- ifelse(colon$etype==1,0,1) # set to 0/1 (needed for poisson later on)

# Fit cox model for rx (age + sex adjusted)
coxph(Surv(time,status)~rx+sex+age, data=colon)
# HR (rxLev): 0.92  
# HR (rxLev+5FU): 0.74

# Get incidence rates using poisson models with same terms and log(time) as offset
mod <- glm(status~offset(log(time))+rx+sex+age, data=colon, family=poisson)

# Get rates using predict-function
Obs <- predict(mod, data.frame(time=1, rx="Obs", age=mean(colon$age),
                                   sex=mean(colon$sex)),  type="response")
Lev <- predict(mod, data.frame(time=1, rx="Lev", age=mean(colon$age), 
                                   sex=mean(colon$sex)),  type="response")
Lev5FU <- predict(mod, data.frame(time=1, rx="Lev+5FU", age=mean(colon$age), 
                                      sex=mean(colon$sex)),  type="response")

# Calculate incidence rate ratio's:
Lev/Obs # 0.98
Lev5FU/Obs # 0.84

我希望发病率比率与 Cox PH 模型中具有相同术语的风险比率相似,但不知何故它们有所不同。我是否使用正确的方法来计算发病率?

任何帮助将不胜感激!

1个回答

据我所知,您的代码或计算没有任何问题。不过,您可以跳过几行代码,通过获取发生率比率exp(coef(mod)). 这两个模型做出不同的假设,这可能会导致不同的结果。

泊松回归假设风险不断。Cox 模型仅假设风险是成比例的。如果满足持续危险的假设,这个问题

Cox 回归是否具有潜在的泊松分布?

解释了 Cox 和 Poisson 回归之间的联系。

我们可以使用模拟来研究两种情况:恒定风险和非恒定(但成比例)风险。首先让我们模拟来自具有恒定危害的人群的数据。风险比的形式为

λ(t)=λ0exp(βx),

在哪里β是参数向量,x是协变量的向量,并且λ0是一些固定的正数。因此,满足泊松回归的恒定风险假设。现在我们通过使用分布函数这一事实(在许多书籍中找到,例如 Therneau 的 Modeling Survival Data,p.13)从这个模型中进行模拟,F, 的生存时间λ因为危险可以被发现

F(t)=1exp(0tλ(s) ds).

有了这个,我们还可以找到的倒数F,F1. 使用此功能,我们通过绘制一致的变量来模拟具有正确危险的生存时间(0,1)并使用F1. 我们开始做吧。

library(survival)
data(colon)
data <- with(colon, data.frame(sex = sex, rx = rx, age = age))
n <- dim(data)[1]
# defining linP, the linear predictor, beta*x in the above notation
linP <- with(colon, log(0.05) + c(0.05, 0.01)[as.factor(sex)] + c(0.01,0.05,0.1)[rx] + 0.1*age)

h <- exp(linP)

simFuncC <- function() {
  cens <- runif(n) # simulating censoring times
  toe <- -log(runif(n))/h # simulating times of events
  event <- ifelse(toe <= cens, 1, 0) # deciding if time of event or censoring is the smallest
  data$time <- pmin(toe, cens)
  data$event <- event
  mCox <- coxph(Surv(time, event) ~ sex + rx + age, data = data)
  mPois <- glm(event ~ sex + rx + age, data = data, offset = log(time))
  c(coef(mCox), coef(mPois))
}

sim <- t(replicate(1000, simFuncC()))
colMeans(sim)

对于 Cox 模型,参数估计的平均值是

        sex       rxLev   rxLev+5FU         age 
-0.03826301  0.04167353  0.09069553  0.10025534 

对于泊松模型

(Intercept)         sex       rxLev   rxLev+5FU         age 
-1.23651275 -0.03822161  0.03678366  0.08606452  0.09812454 

对于这两个模型,我们看到这接近于真实值,例如,记住男性和女性之间的差异为 -0.04,而这两个模型的估计值为 -0.038。我们现在可以对非常量风险函数做同样的事情

λ(t)=λ0texp(βx).

我们现在像以前一样模拟。

simFuncN <- function() {
  cens <- runif(n)
  toe <- sqrt(-log(runif(n))/h)
  event <- ifelse(toe <= cens, 1, 0)
  data$time <- pmin(toe, cens)
  data$event <- event
  mCox <- coxph(Surv(time, event) ~ sex + rx + age, data = data)
  mPois <- glm(event ~ sex + rx + age, data = data, offset = log(time))
  c(coef(mCox), coef(mPois))
}

sim <- t(replicate(1000, simFuncN()))
colMeans(sim)

对于 Cox 模型,我们现在得到

        sex       rxLev   rxLev+5FU         age 
-0.04220381  0.04497241  0.09163522  0.10029121  

对于泊松模型

(Intercept)         sex       rxLev   rxLev+5FU         age 
-0.12001361 -0.01937333  0.02028097  0.04318946  0.04908300

在这个模拟中,泊松模型的平均值显然比 Cox 模型的平均值更远离真实值。这并不奇怪,因为我们违反了持续危险的假设。

当危险恒定时,幸存者函数,S, 是形式

S(t)=exp(αt),

对于一些积极的α取决于具体的主题,因此S是凸的。如果我们使用 Kaplan-Meier 估计来估计S对于原始数据,我们看到以下内容。

在此处输入图像描述

这个函数看起来是凹的。这并不能证明任何事情,但它可能暗示该数据集不满足持续危害的假设,这反过来又可以解释两个模型之间的差异。

据我所知,关于数据的最后评论colon保存有关癌症复发时间和死亡时间的数据(对于每个值有两个观察值id)。在上面,我们一直在建模它,就像它只是一样的东西。这可能不是一个好主意。