当前位置: 首页 > news >正文

从0开始学习R语言--Day17--Cox回归

Cox回归

在用医疗数据作分析时,最常见的是去预测某类病的患者的死亡率或预测他们的结局。但是我们得到的病人数据,往往会有很多的协变量,即使我们通过计算来减少指标对结果的影响,我们的数据中依然会有很多的协变量,且其之间还可能存在互相的影响以及合并症对结局的影响,也就是会导致研究的方向歪了。

协变量过多导致的过拟合(在训练数据上表现好但泛化能力差)、多重共线性(变量间高度相关,导致系数估计不稳定)以及统计功效降低(每个变量的效应可能被稀释)等问题,虽然不能直接修改cox的参数来改变,但是我们可以用曲线救国的方式,将风险转移或分割开来。比如针对过拟合问题,我们可以基于临床知识,知道哪些数据对病人的结局影响较大,先单独对这些变量进行cox回归,将p值<0.1的保留下来,应用到后续的模型里;对于合并症不同,其对死亡结局的影响也不同,我们可以对其进行分层处理,明确不同变量的影响力;如果做的再精细些,我们可以通过计算指标,判断病人是否换其他疾病,再将一些连续变量转为因子(通过分成区间等转成分类变量),从而使得模型更精确。

下面我们通过一个例子来理解:

set.seed(123)# 生成模拟数据集
n_samples <- 500# 创建预测变量 - 包括10个潜在相关变量
age <- rnorm(n_samples, mean = 65, sd = 10) # 年龄
treatment <- rbinom(n_samples, 1, 0.5) # 治疗组(1)或对照组(0)
severity <- runif(n_samples, 0.1, 1.0) # 疾病严重程度(0.1-1.0)# 生成7个合并症指标(二元变量)
comorbidities <- matrix(rbinom(n_samples*7, 1, 0.3), ncol=7)
colnames(comorbidities) <- paste0("comorb", 1:7)# 生成实验室指标(连续变量)
lab_values <- matrix(c(rnorm(n_samples, mean = 100, sd = 20), # 血红蛋白rnorm(n_samples, mean = 1.0, sd = 0.3), # 肌酐rnorm(n_samples, mean = 5.0, sd = 1.5) # 白细胞计数
), ncol=3)
colnames(lab_values) <- c("hemoglobin", "creatinine", "wbc")# 合并所有协变量
covariates <- cbind(age, treatment, severity, comorbidities, lab_values)# 生成生存时间(只有age, treatment, severity和comorb1, comorb2, hemoglobin真正有影响)
true_coefs <- c(0.04, -0.7, 0.6, 0.4, 0.3, 0.02, rep(0, 7)) # 最后8个变量无影响
linear_predictor <- covariates %*% true_coefs
risk_score <- exp(linear_predictor)
survival_time <- rexp(n_samples, rate = risk_score) * 30 # 乘以30使时间范围更合理# 生成删失数据(约25%的观察在事件发生前结束)
censoring_time <- rexp(n_samples, rate = 1/50)
observed <- survival_time < censoring_time
time <- ifelse(observed, survival_time, censoring_time)# 创建数据框
df <- data.frame(time = time,event = as.integer(observed),covariates
)# 查看数据结构
head(df)
summary(df)# 1. 基本Cox模型(只包含主要变量)
cox_model <- coxph(Surv(time, event) ~ age + treatment + severity, data = df)
summary(cox_model)library(survminer)# 可视化主要结果
ggforest(cox_model, data = df)# 2. 包含所有变量的完整模型
full_model <- coxph(Surv(time, event) ~ ., data = df)
summary(full_model)# 3. 变量选择方法(使用Lasso回归)
# 准备数据
x <- as.matrix(df[, -(1:2)]) # 去除时间和事件列
y <- Surv(df$time, df$event)# 交叉验证选择最佳lambda
cv_fit <- cv.glmnet(x, y, family = "cox", alpha = 1) # alpha=1表示Lasso
plot(cv_fit)# 最佳模型
best_lambda <- cv_fit$lambda.min
lasso_model <- glmnet(x, y, family = "cox", alpha = 1, lambda = best_lambda)# 查看选择的变量
coef(lasso_model)# 用选择的变量建立最终Cox模型
selected_vars <- which(as.vector(coef(lasso_model)) != 0)
final_formula <- as.formula(paste("Surv(time, event) ~", paste(colnames(x)[selected_vars], collapse = " + "))
)
final_model <- coxph(final_formula, data = df)
summary(final_model)# 检查比例风险假设
cox.zph(final_model)
plot(cox.zph(final_model)[1]) # 示例:绘制第一个变量的Schoenfeld残差图

输出:

              chisq df    p
age        0.000371  1 0.98
treatment  2.256668  1 0.13
comorb1    1.451580  1 0.23
comorb2    0.294485  1 0.59
comorb3    0.075093  1 0.78
comorb6    0.138340  1 0.71
comorb7    0.328857  1 0.57
hemoglobin 0.006359  1 0.94
wbc        0.081378  1 0.78
GLOBAL     5.214219  9 0.82

从结果来看,年龄和治疗方案是对结局有显著影响的,而服务这一块的影响很小,可以考虑从模型中去除;而输出结果表示各个变量的p值都大于0.05,且global的检验p也大于0.05,说明各变量的风险比在研究期间保持稳定,结果是可信的。

相关文章:

  • Ubuntu ifconfig 查不到ens33网卡
  • Axure零基础跟我学:展开与收回
  • 【hadoop】Davinci数据可视化工具的安装部署
  • 如何自定义一个 Spring Boot Starter?
  • 【hadoop】Flink安装部署
  • 云原生 DevOps 实践路线:构建敏捷、高效、可观测的交付体系
  • 跑通 TrackNet-Badminton-Tracking-tensorflow2 项目全记录
  • 无人机避障与视觉跟踪技术分析!
  • 捍卫低空安全!-中科固源发现无人机MavLink协议远程内存泄漏漏洞
  • CppCon 2015 学习:CLANG/C2 for Windows
  • SpringBoot EhCache 缓存
  • Java并发编程实战 Day 10:原子操作类详解
  • 国芯思辰|SCS5501/5502芯片组打破技术壁垒,重构车载视频传输链路,兼容MAX9295A/MAX96717
  • MPLAB X IDE ​软件安装与卸载
  • 【QT】使用QT帮助手册找控件样式
  • 网络通信核心概念全解析:从IP地址到TCP/UDP实战
  • adb 连不上真机设备问题汇总
  • 【JavaEE】Spring Boot项目创建
  • 华为云Flexus+DeepSeek征文 | 基于DeepSeek-V3构建企业知识库问答机器人实战
  • 【JavaEE】万字详解HTTP协议
  • 陕西江川建设有限公司公司网站/百度收录工具
  • 创建qq网站吗/百度云客服人工电话
  • 网站免费靠谱2021/雅虎搜索引擎
  • 网站改成自适应/百度seo综合查询
  • 中小企业建站平台/网络营销工作内容和职责
  • 站群建站/推广资讯