You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

混合效应Cox回归及时间交互项的校正生存曲线绘制问询

混合效应Cox模型校正生存曲线绘制方案

Q1:coxme模型固定效应校正生存曲线绘制

对于带随机效应的coxme模型,survminer等工具确实不直接支持绘制固定效应校正曲线,但可以手动提取固定效应系数、基线风险,进而计算生存概率并绘图,具体实现如下:

代码示例

library(survival)
library(coxme)
library(ggplot2)

# 拟合coxme模型
kidney <- data.frame(kidney)
coxme_mod <- coxme(Surv(time, status) ~ age + sex + (1|disease), data = kidney)

# 提取固定效应系数
fixed_coef <- fixef(coxme_mod)

# 构造参考数据集:age取均值,sex覆盖所有水平(假设sex为0/1二分类)
ref_data <- expand.grid(
  age = mean(kidney$age, na.rm = TRUE),
  sex = c(0, 1),
  disease = unique(kidney$disease)[1] # 随机效应后续会排除,取值不影响结果
)

# 生成设计矩阵并计算线性预测值(排除随机效应)
X <- model.matrix(~ age + sex, data = ref_data)
lp <- as.vector(X %*% fixed_coef)

# 获取群体平均基线累积风险(coxme已自动积分掉随机效应)
base_haz <- basehaz(coxme_mod, centered = FALSE)
colnames(base_haz) <- c("time", "hazard")

# 计算各参考组的生存概率
surv_df <- lapply(seq_along(lp), function(i) {
  data.frame(
    time = base_haz$time,
    survival = exp(-exp(lp[i]) * base_haz$hazard),
    sex = factor(ref_data$sex[i], labels = c("Female", "Male"))
  )
})
surv_df <- do.call(rbind, surv_df)

# 绘制校正生存曲线
ggplot(surv_df, aes(x = time, y = survival, color = sex)) +
  geom_line(linewidth = 1) +
  labs(x = "时间", y = "生存概率", color = "性别") +
  theme_bw()

关键说明

  • fixef(coxme_mod)专门提取模型的固定效应系数,完全排除随机效应的干扰;
  • basehaz(coxme_mod)返回的是群体平均水平的基线累积风险,已经自动处理了随机效应的积分,适合用于绘制固定效应校正曲线;
  • 生存概率计算公式遵循Cox模型定义:S(t) = exp(-exp(线性预测值) × 基线累积风险(t))。

Q2:含时间交互项+frailty的coxph模型校正曲线绘制

带tt()时间交互项的模型,线性预测值随时间动态变化,同样可以手动计算生存概率并绘图,具体实现如下:

代码示例

library(survival)
library(ggplot2)

# 拟合带时间交互和frailty的coxph模型
kidney <- data.frame(kidney)
coxph_tt_mod <- coxph(
  Surv(time, status) ~ age + sex + tt(sex) + frailty(disease), 
  data = kidney,
  tt=function(x,t,...) x*t
)

# 提取模型系数
coefs <- coef(coxph_tt_mod)

# 构造参考数据集:age取均值,sex覆盖所有水平
ref_data <- expand.grid(
  age = mean(kidney$age, na.rm = TRUE),
  sex = c(0, 1)
)

# 获取基线累积风险(frailty设为0时的基线风险)
base_haz <- basehaz(coxph_tt_mod, centered = FALSE)
colnames(base_haz) <- c("time", "hazard")

# 计算各参考组的生存概率(线性预测值随时间变化)
surv_df <- lapply(1:nrow(ref_data), function(i) {
  age_val <- ref_data$age[i]
  sex_val <- ref_data$sex[i]
  # 每个时间点的线性预测值:包含sex与时间的交互项
  lp_t <- coefs["age"]*age_val + coefs["sex"]*sex_val + coefs["tt(sex)"]*sex_val*base_haz$time
  # 计算生存概率
  survival <- exp(-exp(lp_t) * base_haz$hazard)
  data.frame(
    time = base_haz$time,
    survival = survival,
    sex = factor(sex_val, labels = c("Female", "Male"))
  )
})
surv_df <- do.call(rbind, surv_df)

# 绘制生存曲线
ggplot(surv_df, aes(x = time, y = survival, color = sex)) +
  geom_line(linewidth = 1) +
  labs(x = "时间", y = "生存概率", color = "性别") +
  theme_bw()

关键说明

  • tt(sex)定义为sex*t,因此线性预测值随时间t动态变化,需要针对每个时间点重新计算;
  • frailty(disease)作为随机效应,计算时默认排除(即设为0,对应exp(0)=1,不改变风险比),得到的是固定效应校正后的生存曲线;
  • 若需要考虑frailty的影响,可以在计算时加入frailty的预测值,但校正曲线通常仅关注固定效应的组间对比。

内容的提问来源于stack exchange,提问作者Luke Jenner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 11:27:47