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

news2025/5/25 10:43:30

简介

机器学习中生存树(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)$concordance

cat(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.coloradmin.cn/o/2385293.html

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

相关文章

HarmonyOS 应用开发,如何引入 Golang 编译的第三方 SO 库

本指南基于笔者临时修复的 ohos_golang_go 项目fork&#xff0c;解决HO 应用导入 cgo编译产物时的 crash 问题。 1. 下载 ohos_golang_go git clone https://gitcode.com/deslord/ohos_golang_go.git&#x1f4cc; 该仓库为笔者临时修复版本&#xff0c;修复了 CGO 编译模式下…

一体化雷达波明渠流量计简介

一、技术定义与核心原理 一体化雷达波明渠流量计是基于微波技术的全自动流量监测设备&#xff0c;采用 24G K 波段平面雷达技术&#xff0c;通过非接触式测量方式实现对明渠、河道、排水管网等场景的水位、流速及流量监测。其核心原理是利用雷达发射高频电磁波&#xff0c;经水…

Pr -- 耳机没有Pr输出的声音

问题 很久没更新视频号了&#xff0c;想用pr剪辑一下&#xff0c;结果使用Pr打开后发现耳机没有Pr输出的声音 解决方法 在编辑--首选项-音频硬件中设置音频硬件的输出为当前耳机设备

白皮精读:2024年国家数据基础设施建设指引【附全文阅读】

《国家数据基础设施建设指引》提出建设覆盖数据采集至安全全链条的新型基础设施,目标到 2029 年形成横向联通、纵向贯通的格局,聚焦数据可信流通、算力协同、高速传输、安全保障四大功能,明确技术架构与重点方向,强调政府与市场协同,分阶段推进试点及规模化部署,为数字中…

穿屏技巧:Mac-Windows一套鼠标键盘控制多台设备 (sharemouse6.0-Keygen)| KM-401A

文章目录 引言I sharemouse6.0介绍功能介绍关闭自动更新安装包II 安装系统对应的sharemouse软件Windowsmac版本III 知识扩展:SCP、FTP、SSH文件传输SCP配置SSH密钥免密登录FTP(File Transfer Protocal,文件传输协议)引言 基于USB进行同步键盘和鼠标事件,更流畅。 基于局域…

【写在创作纪念日】基于SpringBoot和PostGIS的各省东西南北四至极点区县可视化

目录 前言 一、空间检索简介 1、空间表结构 2、四至空间检索 二、前后端实现 1、后端实现 2、前端集成 三、成果展示 1、东部省份 2、西部省份 3、南部省份 4、北部省份 5、中部省份 四、总结 前言 在当今数字化时代&#xff0c;地理信息数据的分析与可视化对于众…

如何制作可以本地联网搜索的MCP,并让本地Qwen3大模型调用搜索回答用户问题?

环境: SearXNG Qwen3-32B-FP8 vllm 0.8.5 问题描述: 如何制作可以本地联网搜索的MCP,并让本地Qwen3大模型调用搜索回答用户问题? 解决方案: 一、安装searxng 1.按需新建模型相关文件夹 mkdir MCP chmod 777 /mnt/program/MCP2.配置conda源 nano ~/.condarc nano…

服务器硬盘虚拟卷的处理

目前的情况是需要删除逻辑卷&#xff0c;然后再重新来弄一遍。 数据已经备份好了&#xff0c;所以不用担心数据会丢失。 查看服务器的具体情况 使用 vgdisplay 操作查看服务器的卷组情况&#xff1a; --- Volume group ---VG Name vg01System IDFormat …

一个国债交易策略思路

该国债交易策略的核心在于通过分析历史价格数据来识别市场趋势&#xff0c;并在趋势确认时进行开仓操作。策略的设计思路结合了价格波动范围的计算和市场波动性的评估&#xff0c;旨在捕捉市场的短期趋势并控制风险。 首先&#xff0c;策略通过对过去5根K线的最高价和最低价进行…

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球 文章目录 【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球前言高斯函数一维高斯多维高斯 椭球基本定义一般二次形式 3D高斯椭球3D高斯与椭球的关系各向同性(Isotropic)和…

手写ES6 Promise() 相关函数

手写 Promise() 相关函数&#xff1a; Promise()、then()、catch()、finally() // 定义三种状态常量 const PENDING pending const FULFILLED fulfilled const REJECTED rejectedclass MyPromise {/*定义状态和结果两个私有属性:1.使用 # 语法&#xff08;ES2022 官方私有字…

【NLP 76、Faiss 向量数据库】

压抑与痛苦&#xff0c;那些辗转反侧的夜&#xff0c;终会让我们更加强大 —— 25.5.20 Faiss&#xff08;Facebook AI Similarity Search&#xff09;是由 Facebook AI 团队开发的一个开源库&#xff0c;用于高效相似性搜索的库&#xff0c;特别适用于大规模向…

软件名称:系统日志监听工具 v1.0

软件功能&#xff1a;一款基于 PyQt5 开发的 Windows 系统日志监听工具&#xff0c;适用于系统运维、网络管理、故障排查等场景&#xff0c;具备以下核心功能&#xff1a; 支持监听系统三大日志源&#xff1a;应用程序 / 系统 / 安全日志实时抓取新日志事件&#xff0c;自动滚…

Spring AI 之结构化输出转换器

截至 2024 年 2 月 5 日,旧的 OutputParser、BeanOutputParser、ListOutputParser 和 MapOutputParser 类已被弃用,取而代之的是新的 StructuredOutputConverter、BeanOutputConverter、ListOutputConverter 和 MapOutputConverter 实现类。后者可直接替换前者,并提供相同的…

Java虚拟机面试题:内存管理(上)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

进程间通信I·匿名管道

目录 进程间通信&#xff08;IPC&#xff09; 含义 目的 分类 匿名管道 原理 创建过程 特性 四大情况 close问题 代码练习 简单通信 进程池 小知识 进程间通信&#xff08;IPC&#xff09; 含义 就是让不同的进程能看到同一份资源&#xff0c;实现数据交流。 …

Ubuntu Linux系统的基本命令详情

1.Ubuntu Linux是以桌面应用为主的Linux发行版操作系统 2.Ubuntu的用户使用 在登录系统一般使用在安装系统时建立的普通用户登录&#xff0c;如果要使用超级用户权限 #sudo ---执行命令 sudo passwd ---修改用户密码 su - root ---切换超级用户 系统的不同&#xff0c;命令也不…

大数据治理:理论、实践与未来展望(二)

书接上文 文章目录 七、大数据治理的未来发展趋势&#xff08;一&#xff09;智能化与自动化&#xff08;二&#xff09;数据隐私与安全的强化&#xff08;三&#xff09;数据治理的云化&#xff08;四&#xff09;数据治理的跨行业合作&#xff08;五&#xff09;数据治理的生…

PCB布局设计

PCB布局设计 一、原理图到PCB转换前的准备工作 在将原理图转换为PCB之前&#xff0c;我们需要进行一系列准备工作&#xff0c;确保设计的正确性和完整性。这一步骤至关重要&#xff0c;可以避免后续PCB设计中出现不必要的错误。 // 原理图转PCB前必要检查步骤 // 1. 仔细检查…

esp32+IDF V5.1.1版本编译freertos报错

error: portTICK_RATE_MS undeclared (first use in this function); did you mean portTICK_PERIOD_MS 解决方法: 使用命令 idf.py menuconfig 打开配置界面配置freeRtos 使能configENABLE_BACKWARD_COMPATIBLITY