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

news2025/6/10 9:31:56

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,说明各变量的风险比在研究期间保持稳定,结果是可信的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2406455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ABAP设计模式之---“Tell, Don’t Ask原则”

“Tell, Don’t Ask”是一种重要的面向对象编程设计原则&#xff0c;它强调的是对象之间如何有效地交流和协作。 1. 什么是 Tell, Don’t Ask 原则&#xff1f; 这个原则的核心思想是&#xff1a; “告诉一个对象该做什么&#xff0c;而不是询问一个对象的状态再对它作出决策。…

虚拟机网络不通的问题(这里以win10的问题为主,模式NAT)

当我们网关配置好了&#xff0c;DNS也配置好了&#xff0c;最后在虚拟机里还是无法访问百度的网址。 第一种情况&#xff1a; 我们先考虑一下&#xff0c;网关的IP是否和虚拟机编辑器里的IP一样不&#xff0c;如果不一样需要更改一下&#xff0c;因为我们访问百度需要从物理机…

SOC-ESP32S3部分:30-I2S音频-麦克风扬声器驱动

飞书文档https://x509p6c8to.feishu.cn/wiki/SKZzwIRH3i7lsckUOlzcuJsdnVf I2S简介 I2S&#xff08;Inter-Integrated Circuit Sound&#xff09;是一种用于传输数字音频数据的通信协议&#xff0c;广泛应用于音频设备中。 ESP32-S3 包含 2 个 I2S 外设&#xff0c;通过配置…

break 语句和 continue 语句

break语句和continue语句都具有跳转作用&#xff0c;可以让代码不按既有的顺序执行 break break语句用于跳出代码块或循环 1 2 3 4 5 6 for (var i 0; i < 5; i) { if (i 3){ break; } console.log(i); } continue continue语句用于立即终…

【Linux】使用1Panel 面板让服务器定时自动执行任务

服务器就是一台24小时开机的主机&#xff0c;相比自己家中不定时开关机的主机更适合完成定时任务&#xff0c;例如下载资源、备份上传&#xff0c;或者登录某个网站执行一些操作&#xff0c;只需要编写 脚本&#xff0c;然后让服务器定时来执行这个脚本就可以。 有很多方法实现…

Excel 怎么让透视表以正常Excel表格形式显示

目录 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总

LINUX编译vlc

下载 VideoLAN / VLC GitLab 选择最新的发布版本 准备 sudo apt install -y xcb bison sudo apt install -y autopoint sudo apt install -y autoconf automake libtool编译ffmpeg LINUX FFMPEG编译汇总&#xff08;最简化&#xff09;_底部的附件列表中】: ffmpeg - lzip…

WinUI3开发_使用mica效果

简介 Mica(云母)是Windows10/11上的一种现代化效果&#xff0c;是Windows10/11上所使用的Fluent Design(设计语言)里的一个效果&#xff0c;Windows10/11上所使用的Fluent Design皆旨在于打造一个人类、通用和真正感觉与 Windows 一样的设计。 WinUI3就是Windows10/11上的一个…

Python爬虫(52)Scrapy-Redis分布式爬虫架构实战:IP代理池深度集成与跨地域数据采集

目录 一、引言&#xff1a;当爬虫遭遇"地域封锁"二、背景解析&#xff1a;分布式爬虫的两大技术挑战1. 传统Scrapy架构的局限性2. 地域限制的三种典型表现 三、架构设计&#xff1a;Scrapy-Redis 代理池的协同机制1. 分布式架构拓扑图2. 核心组件协同流程 四、技术实…

华为OD机考- 简单的自动曝光/平均像素

import java.util.Arrays; import java.util.Scanner;public class DemoTest4 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint[] arr Array…

Spring是如何实现无代理对象的循环依赖

无代理对象的循环依赖 什么是循环依赖解决方案实现方式测试验证 引入代理对象的影响创建代理对象问题分析 源码见&#xff1a;mini-spring 什么是循环依赖 循环依赖是指在对象创建过程中&#xff0c;两个或多个对象相互依赖&#xff0c;导致创建过程陷入死循环。以下通过一个简…

C++ Saucer 编写Windows桌面应用

文章目录 一、背景二、Saucer 简介核心特性典型应用场景 三、生成自己的项目四、以Win32项目方式构建Win32项目禁用最大化按钮 五、总结 一、背景 使用Saucer框架&#xff0c;开发Windows桌面应用&#xff0c;把一个html页面作为GUI设计放到Saucer里&#xff0c;隐藏掉运行时弹…

【AI News | 20250609】每日AI进展

AI Repos 1、OpenHands-Versa OpenHands-Versa 是一个通用型 AI 智能体&#xff0c;通过结合代码编辑与执行、网络搜索、多模态网络浏览和文件访问等通用工具&#xff0c;在软件工程、网络导航和工作流自动化等多个领域展现出卓越性能。它在 SWE-Bench Multimodal、GAIA 和 Th…

轻量安全的密码管理工具Vaultwarden

一、Vaultwarden概述 Vaultwarden主要作用是提供一个自托管的密码管理器服务。它是Bitwarden密码管理器的第三方轻量版&#xff0c;由国外开发者在Bitwarden的基础上&#xff0c;采用Rust语言重写而成。 &#xff08;一&#xff09;Vaultwarden镜像的作用及特点 轻量级与高性…

SQLSERVER-DB操作记录

在SQL Server中&#xff0c;将查询结果放入一张新表可以通过几种方法实现。 方法1&#xff1a;使用SELECT INTO语句 SELECT INTO 语句可以直接将查询结果作为一个新表创建出来。这个新表的结构&#xff08;包括列名和数据类型&#xff09;将与查询结果匹配。 SELECT * INTO 新…

开疆智能Ethernet/IP转Modbus网关连接鸣志步进电机驱动器配置案例

在工业自动化控制系统中&#xff0c;常常会遇到不同品牌和通信协议的设备需要协同工作的情况。本案例中&#xff0c;客户现场采用了 罗克韦尔PLC&#xff0c;但需要控制的变频器仅支持 ModbusRTU 协议。为了实现PLC 对变频器的有效控制与监控&#xff0c;引入了开疆智能Etherne…

NineData数据库DevOps功能全面支持百度智能云向量数据库 VectorDB,助力企业 AI 应用高效落地

NineData 的数据库 DevOps 解决方案已完成对百度智能云向量数据库 VectorDB 的全链路适配&#xff0c;成为国内首批提供 VectorDB 原生操作能力的服务商。此次合作聚焦 AI 开发核心场景&#xff0c;通过标准化 SQL 工作台与细粒度权限管控两大能力&#xff0c;助力企业安全高效…

代理服务器-LVS的3种模式与调度算法

作者介绍&#xff1a;简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们上一章介绍了Web服务器&#xff0c;其中以Nginx为主&#xff0c;本章我们来讲解几个代理软件&#xff1a…

解决MybatisPlus使用Druid1.2.11连接池查询PG数据库报Merge sql error的一种办法

目录 前言 一、问题重现 1、环境说明 2、重现步骤 3、错误信息 二、关于LATERAL 1、Lateral作用场景 2、在四至场景中使用 三、问题解决之道 1、源码追踪 2、关闭sql合并 3、改写处理SQL 四、总结 前言 在博客&#xff1a;【写在创作纪念日】基于SpringBoot和PostG…

使用VMware克隆功能快速搭建集群

自己搭建的虚拟机&#xff0c;后续不管是学习java还是大数据&#xff0c;都需要集群&#xff0c;java需要分布式的微服务&#xff0c;大数据Hadoop的计算集群&#xff0c;如果从头开始搭建虚拟机会比较费时费力&#xff0c;这里分享一下如何使用克隆功能快速搭建一个集群 先把…