ML 48.机器学习之临床生存树(rpartSurv)


简介

机器学习中生存树(Survival Tree)的原理详解 生存树是结合决策树与生存分析的机器学习模型,主要用于处理带有时间-事件数据(包含删失数据)的预测问题。其核心目标是:通过树状结构对数据进行递归分割,使每个叶节点内的样本具有相似的生存模式。以下是生存树的核心原理分步解析:

一、基础概念回顾

生存分析的核心要素:

时间(Time):事件发生的时间或研究截止时间。

状态(Status):事件是否发生(如1=死亡,0=存活)。

删失(Censoring):部分样本在研究结束时未观察到事件。

传统生存模型:

Kaplan-Meier估计:非参数方法,估计生存函数。

Cox比例风险模型:半参数模型,分析协变量对风险的影响。

二、生存树的构建原理

生存树通过递归划分数据,生成树结构,每个叶节点代表一个风险群体。其核心步骤包括:

  1. 分裂准则(Splitting Criterion) 目标:选择最优特征和切分点,使得子节点的生存差异最大化。

常用方法:

对数秩检验(Log-Rank Test):比较左右子节点生存曲线的差异,选择统计量最大的分裂点。

似然比检验:基于生存模型(如指数分布或Cox模型)的似然函数差异。

Harrell's C-index:最大化子节点的预测区分度。

示例: 在每个候选分裂点,计算左右子节点的Kaplan-Meier曲线,通过对数秩检验的p值评估差异显著性,选择p值最小的分裂点。

  1. 处理删失数据 删失数据参与计算:在计算生存差异时,删失数据会被纳入风险集,直到其退出研究。

节点纯度的衡量:使用生存函数的差异性(而非分类的纯度指标如基尼系数)。

  1. 树的生长与剪枝 生长阶段:递归分裂直到满足停止条件(如节点样本数过少或无法显著提升区分度)。

剪枝策略:

复杂度参数(CP):通过交叉验证选择最优子树,平衡模型复杂度与预测误差。

基于损失函数:如指数损失(method="exp")或Cox模型的偏似然损失。

三、生存树的预测与解释

  1. 预测输出 风险评分(Risk Score):每个叶节点的样本具有相似的风险水平,可通过中位生存时间或累积风险函数描述。

生存概率曲线:基于叶节点内样本的Kaplan-Meier估计生成。

  1. 变量重要性 分裂贡献度:通过特征在分裂过程中提升的生存差异(如对数秩统计量)衡量重要性。

替代指标:基于特征在树中出现的位置和次数(越靠近根节点或出现次数越多,重要性越高)。

  1. 可视化解释 树结构图:显示每个节点的分裂条件、样本量及生存统计量。

生存曲线对比:不同叶节点的Kaplan-Meier曲线可视化(如下图)。

生存树节点生存曲线示例

四、生存树的优缺点

优点: 非线性关系处理:自动捕捉变量间的交互效应和非线性模式。

可解释性:树结构直观展示风险分层规则。

无需分布假设:非参数方法,适用于复杂生存数据。

缺点: 过拟合风险:需通过剪枝和交叉验证控制。

稳定性较低:数据微小变化可能导致树结构剧变(可通过集成方法如随机生存森林缓解)。

五、与经典方法的对比

特性 Cox模型 生存树 模型假设 比例风险假设 无分布假设 交互效应处理 需手动指定 自动捕捉 可解释性 回归系数解释 树结构规则解释 适用场景 线性效应主导的问题 复杂非线性/交互效应问题

六、实际应用案例

医疗领域:预测患者生存时间,根据年龄、基因表达等特征分层。

金融风控:预测客户流失时间,识别高风险群体。

工业维护:预测设备故障时间,制定预防性维护策略。

安装必要包

install.packages(c("survival", "rpart", "rpart.plot", "ggplot2", "survminer"))

加载包

library(survival)    # 生存分析基础包
library(rpart)       # 递归分区生存树
library(rpart.plot)  # 树结构可视化
library(ggplot2)     # 图形绘制
library(survminer)   # 生存曲线可视化

载入示例数据(lung数据集)

data(lung)
## Warning in data(lung): 没有'lung'这个数据集
df <- lung[, c("time", "status", "age", "sex", "ph.ecog", "ph.karno")]

数据预处理

df$status <- ifelse(df$status == 2, 1, 0)  # 将状态转换为0/1(1=事件发生)
df <- na.omit(df)  # 删除缺失值(实际分析需谨慎处理缺失值)

划分训练集/测试集

set.seed(123)
train_index <- sample(1:nrow(df), size = floor(0.7*nrow(df)))
train_data <- df[train_index, ]
test_data <- df[-train_index, ]

构建生存树模型

surv_tree <- rpart(formula = Surv(time, status) ~ .,  # 生存公式data = train_data,method = "exp",                   # 指数生存模型control = rpart.control(minsplit = 10,     # 节点最小样本数cp = 0.01,         # 复杂度参数xval = 10# 交叉验证折数)
)

可视化树结构

prp(surv_tree,main = "Survival Tree Structure",extra = 101,        # 显示节点样本数和风险比branch.type = 5,nn = TRUE,cex = 0.5)

绘制变量重要性

var_imp <- surv_tree$variable.importance
barplot(var_imp, main = "Variable Importance", col = "skyblue",horiz = T,las=1)

模型预测(示例:测试集)

test_pred <- predict(surv_tree, newdata = test_data, type = "vector")

生存曲线可视化(按风险分组)

分组

使用中位数风险值划分高低风险组,生成风险分组并绑定到测试数据。

test_data$risk_groups <- ifelse(test_pred > median(test_pred), "High Risk", "Low Risk")
surv_fit <- survfit(Surv(time, status) ~ risk_groups, data = test_data)

绘制KM图

ggsurvplot(surv_fit,data = test_data,pval = TRUE,risk.table = TRUE,legend.labs = c("High Risk", "Low Risk"),title = "Kaplan-Meier Survival Curves by Risk Group")

模型评估(C-index)

训练集性能

train_pred <- predict(surv_tree, newdata = train_data)
c_index_train <- concordance(Surv(train_data$time, train_data$status) ~ train_pred)$concordance

测试集性能

c_index_test <- concordance(Surv(test_data$time, test_data$status) ~ test_pred)$concordancecat(paste("Training C-index:", round(c_index_train, 3), "\n",
"Test C-index:", round(c_index_test, 3)))
## Training C-index: 0.287 
##  Test C-index: 0.346

保存结果

保存模型

saveRDS(surv_tree, file = "survival_tree_model.rds")

保存预测结果

write.csv(test_pred, file = "test_predictions.csv")

保存工作空间镜像

save.image("survival_tree_analysis.RData")

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

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

相关文章

测试文章1

本篇技术博文摘要 &#x1f31f; 引言 &#x1f4d8; 在这个变幻莫测、快速发展的技术时代&#xff0c;与时俱进是每个IT工程师的必修课。我是盛透侧视攻城狮&#xff0c;一名什么都会一丢丢的网络安全工程师&#xff0c;也是众多技术社区的活跃成员以及多家大厂官方认可人员&a…

【Ubuntu修改串口延时(Latency Timer)为1毫秒(设备拔插或系统重启后自动生效)】

Ubuntu修改串口延时Latency Timer为1毫秒-设备拔插或系统重启后自动生效 在Ubuntu系统中&#xff0c;串口设备的延时参数(latency_timer)可以通过udev规则永久修改。以下是完整步骤&#xff1a; 创建udev规则文件 sudo vim /etc/udev/rules.d/99-ftdi-low-latency.rules添加以…

【C++进阶篇】红黑树的实现(赋源码)

红黑树&#xff1a;如何用颜色和旋转征服复杂数据 一. 红黑树简介1.1 基本概念1.2 红黑树效率1.3 意义1.4 应用场景 二. 红黑树实现2.1 红黑树结构2.2 插入&#xff08;难点&#xff09;2.2.1 单纯变色的情况2.2.2 单旋变色2.2.3 双旋变色 2.3 查找2.4 红黑树的验证2.5 AVL与RB…

【软考向】Chapter 3 数据结构

线性结构线性表顺序存储 —— 访问易&#xff0c;增删难链式存储 —— 访问难、增删易 栈 —— 后进先出 和 队列 —— 先进先出字符串 —— KMP 匹配算法 数组、矩阵和广义表数组 树 —— 树根为第一层&#xff0c;最大层数为树高/深度线索二叉树哈夫曼编码树和森林 —— 树的…

Python 训练 day31

知识点回顾 规范的文件命名规范的文件夹管理机器学习项目的拆分编码格式和类型注解 作业&#xff1a;尝试针对之前的心脏病项目ipynb&#xff0c;将他按照今天的示例项目整理成规范的形式&#xff0c;思考下哪些部分可以未来复用。 机器学习项目的流程 一个典型的机器学习项目通…

C++?模板(进阶)!!!

一、引言 在之前我们已经介绍过C中引入的非常好用的一个工具--模板&#xff0c;同时借助模拟实现string、vector、list等容器熟悉了如何使用模板&#xff0c;今天我们将要一起学习有关模板的进阶知识&#xff0c;如果还想了解模板的概念以及基础的使用可以跳转到以下链接&#…

《量子计算实战》PDF下载

内容简介 在加密、科学建模、制造物流、金融建模和人工智能等领域&#xff0c;量子计算可以极大提升解决问题的效率。量子系统正变得越来越强大&#xff0c;逐渐可用于生产环境。本书介绍了量子计算的思路与应用&#xff0c;在简要说明与量子相关的科学原理之后&#xff0c;指…

Vue3前后端分离用户信息显示方案

在Vue3前后端分离的项目中&#xff0c;若后端仅返回用户ID&#xff0c;可通过以下步骤显示用户名&#xff1a; 解决方案 获取用户信息API 确保后端提供以下任意一种接口&#xff1a; 批量查询接口&#xff1a;传入多个用户ID&#xff0c;返回对应的用户信息列表 单个查询接口…

艾默生流量计与Profibus DP主站转Modbus RTU/TCP网关通讯案例

艾默生流量计与Profibus DP主站转Modbus RTU/TCP网关通讯案例 在现代工业自动化控制系统中&#xff0c;艾默生流量计因其高精度、稳定性和易用性而备受青睐。然而&#xff0c;为了实现与不同协议设备之间的无缝通信&#xff0c;经常需要借助专业的通讯网关进行协议转换。本文将…

SQL优化学习笔记

SQL优化 insert优化 常规优化思路 每次插入数据时都需要和数据库建立连接、关闭连接&#xff0c;因此批量插入会大量节省IO避免浪费。&#xff08;每次500-1000条&#xff09;开启手动提交事务&#xff08;start transaction … commit&#xff09;主键顺序插入&#xff1a;…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Hidden Search Widget (交互式搜索框)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— Hidden Search Widget 组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ ✨ 组件目标 点击按钮展开隐藏的搜索框 再次点击按钮…

大模型——多模态检索的RAG系统架构设计

文章目录 1. 系统架构设计核心组件 2. 跨模态向量空间对齐方案方法一&#xff1a;预训练对齐模型&#xff08;如CLIP&#xff09;方法二&#xff1a;跨模态投影网络方法三&#xff1a;联合微调 3. 混合检索策略4. 关键问题解决Q: 如何解决模态间向量尺度不一致&#xff1f;Q: 如…

【NGINX】 -10 keepalived + nginx + httpd 实现的双机热备+ 负载均衡

文章目录 1、主架构图1.1 IP地址规划 2、web服务器操作3、配置nginx服务器的负载均衡4、配置keepalived4.1 master4.1 backup 5、测试双机热备5.1 两台keepalived服务器均开启5.2 模拟master节点故障 1、主架构图 1.1 IP地址规划 服务器IP地址web1192.168.107.193web2192.168.…

SQL 多表关联与分组聚合:解密答题正确率分析

一、问题拆解&#xff1a;从业务需求到SQL逻辑 1.1 需求分析 题目要求&#xff1a;计算浙江大学用户在不同难度题目下的答题正确率&#xff0c;并按正确率升序排序。 关键分析点&#xff1a; 数据来源&#xff1a; user_profile&#xff1a;存储用户信息&#xff08;大学&a…

VS Code启动Git导致大量磁盘读写 - 解决方案

问题 通过VS Code打开项目后&#xff0c;若项目使用了Git&#xff0c;且文件数目较多&#xff0c;则VS Code会自动在后台调用Git检查项目修改&#xff0c;会造成大量磁盘读写&#xff0c;严重影响电脑性能。 解决方案 在VS Code设置中关闭Git功能&#xff0c;在终端中使用Gi…

Vue3 与 Vue2 区别

一、Vue3 与 Vue2 区别 对于生命周期来说&#xff0c;整体上变化不大&#xff0c;只是大部分生命周期钩子名称上 “on”&#xff0c;功能上是类似的。不过有一点需要注意&#xff0c;组合式API的Vue3 中使用生命周期钩子时需要先引入&#xff0c;而 Vue2 在选项API中可以直接…

网络安全之身份验证绕过漏洞

漏洞简介 CrushFTP 是一款由 CrushFTP LLC 开发的强大文件传输服务器软件&#xff0c;支持FTP、SFTP、HTTP、WebDAV等多种协议&#xff0c;为企业和个人用户提供安全文件传输服务。近期&#xff0c;一个被编号为CVE-2025-2825的严重安全漏洞被发现&#xff0c;该漏洞影响版本1…

Word2Vec模型学习和Word2Vec提取相似文本体验

文章目录 说明Word2Vec模型核心思想两种经典模型关键技术和算法流程优点和局限应用场景 Word2Vec提取相似文本完整源码执行结果 说明 本文适用于初学者&#xff0c;体验Pytorch框架在自然语言处理中的使用。简单了解学习Word2Vec模型&#xff0c;体验其使用。 Word2Vec模型 …

flutter 配置 安卓、Ios启动图

android 配置启动图 launch_background.xml <?xml version"1.0" encoding"utf-8"?> <!-- Modify this file to customize your launch splash screen --> <layer-list xmlns:android"http://schemas.android.com/apk/res/android&…

MCP(一)——QuickStart

目录 1. MCP简介2. MCP的优势3. MCP核心4. QuickStart For Server Developers(仅具参考)4.1 MCP核心概念4.2 构建MCP服务器的代码4.2.1 设置MCP服务器实例4.2.2 辅助函数4.2.3 实现工具执行4.2.4 在Cherry-Studio中添加MCP服务器4.2.5 演示4.2.5.1 测试工具get_alerts4.2.5.2 测…