如何使用 R 中的 coxme 模型从样条项中获得预测?

How can I get predictions from spline terms with a coxme model in R?

我读到报告样条项对结果影响的最佳方法是绘制预测概率图。我已经能够使用 survival 包中的 frailty coxph 模型来做到这一点,方法是创建一个带有虚拟个体的新数据集,其中唯一不同的变量是样条变量,然后绘制该数据集的预测。

我写的代码是这样的:

### Example
library(tidyverse); library(survival)

# Create dataset
dat <- tibble(time = sample(seq(21), 1000, replace = TRUE),
              status = sample(c(0,1), 1000, replace = TRUE), 
              var1 = sample(seq(100), 1000, replace = TRUE), 
              var2 = sample(seq(100), 1000, replace = TRUE), 
              group_id = seq(1, 1000, by = 1))

# Run model
fit <- coxph(Surv(time, status) ~ var1 + ns(var2, df = 3) + frailty(group_id), data = dat)

# Create dummy dataset
spline_values <- tibble(var1 = seq(1, 1000, by = 1))

newdata <- dat %>% 
           head(n = 1) %>% 
           select(time, status, var1, var2, group_id) %>%
           slice(rep(1:n(), each = nrow(spline_values))

newdata <- newdata %>% mutate(var1 = spline_values$var1)

pred <- predict(fit, newdata = newdata, se.fit = TRUE, type = "risk")

newdata <- newdata %>% add_column(rr = pred$fit, se.fit = pred$se.fit)

newdata <- newdata %>% mutate(
           low = exp(log(rr) - 1.96 * se.fit), 
           high = exp(log(rr) + 1.96 * se.fit))

ggplot(newdata, aes(var1)) +
  geom_line(aes(y = rr)) +
  geom_ribbon(aes(ymin = low, ymax = high), alpha = 0.1, linetype = 0)

然而,实际上,我的模型有两个级别的随机效应,只能使用 coxme 包进行建模。虽然有一个 predict.coxme 函数,但它不适用于新数据集:

library(coxme)

# Run coxme model
fit2 <- coxme(Surv(time, status) ~ var1 + ns(var2, df = 3) + (1 | group_id), data = dat)

pred <- predict(fit2, newdata = newdata, se.fit = TRUE, type = "risk")

这会导致以下错误: Error in predict.coxme(fit2, newdata, se.fit = TRUE, type = "risk") : newdata argument not yet supported

软件包作者已声明他想实现此功能,但不太可能很快实现。所以我以前的方法行不通,而且我似乎找不到任何支持这个的包。

我想知道是否有一种方法可以可视化 coxme 模型的样条效应。有没有人有什么想法或建议?

如果不是那么......好吧,添加水平不会显着改变等效 coxph 模型的系数,所以我很想使用 coxph 模型的预测来绘制可视化效果并报告更准确的系数伴随 table。这听起来是否可以接受table 还是我正在进入危险水域?

对于任何接触过这个的人来说,ehahelper 包提供了一个 predict_coxme 函数(以及其他一些用于处理 coxme 对象的有用工具)。不过,这绝对值得 reading the documentation,看看开发人员如何处理随机效应并计算风险比的分母。

devtools::install_github('junkka/ehahelper')

library(ehahelper); library(coxme); library(tidyverse)

# Create dataset
dat <- tibble(time = sample(seq(21), 1000, replace = TRUE),
              status = sample(c(0,1), 1000, replace = TRUE), 
              var1 = sample(seq(100), 1000, replace = TRUE), 
              var2 = sample(seq(100), 1000, replace = TRUE), 
              group_id = seq(1, 1000, by = 1))

# Run model
fit2 <- coxme(Surv(time, status) ~ var1 + ns(var2, df = 3) + (1 | group_id), data = dat)

# Create dummy dataset
spline_values <- tibble(var1 = seq(1, 1000, by = 1))

newdata <- dat %>% 
    head(n = 1) %>%
    select(time, status, var1, var2, group_id) %>% 
    slice(rep(1:n(), each = nrow(spline_values)))
          
newdata <- newdata %>% mutate(var1 = spline_values$var1)

# Ehahelper predict_coxme has difficulty with splines in a new dataset. 
# To get around this, append the new dataset to the old one, apply the predict_coxme function, then subset the predicted values of interest
dat <- bind_rows(dat, newdata)

pred <- ehahelper::predict_coxme(fit2, newdata = dat, se.fit = TRUE, type = "risk", strata_ref = FALSE)
          
dat <- dat %>% add_column(rr = pred$fit[,1], se.fit = pred$se.fit[,1])

# Subset values of interest
dat <- dat %>% tail(nrow(newdata))
          
dat <- dat %>% mutate(
    low = exp(log(rr) - 1.96 * se.fit), 
    high = exp(log(rr) + 1.96 * se.fit))
          
ggplot(dat, aes(var1)) +
  geom_line(aes(y = rr)) +
  geom_ribbon(aes(ymin = low, ymax = high), alpha = 0.1, linetype = 0)