机器学习系列--R语言随机森林进行生存分析(2)

随机森林(Breiman 2001a)(RF)是一种非参数统计方法,需要没有关于响应的协变关系的分布假设。RF是一种强大的、非线性的技术,通过拟合一组树来稳定预测精度模型估计。随机生存森林(RSF)(Ishwaran和Kogalur,2007;Ishwaraan,Kogalur、Blackstone和Lauer(2008)是Breimans射频技术的延伸从而降低了对时间到事件数据的有效非参数分析。
接着文章《机器学习系列–R语言随机森林进行生存分析(1)》, 咱们继续分析

上一节,咱们已经介绍了通过VIMP来绘制变量的重要性。

在这里插入图片描述
在 VIMP 中,预后风险因素是通过在其他数据设置下测试森林预测来确定的,根据对森林预测能力的影响对最重要的变量进行排序。
randomForestSRC包中还有另一种方法是就是利用对森林构建的检验来对变量进行排序,就是最小森度。最小深度(Ishwaran 等人,2010 年;Ishwaran、Kogalur、Chen 和
Minn 2011)假定,对预测影响大的变量是那些最频繁地分割离根节点最近的节点的变量,它们在根节点上分割了最大的群体样本。在每棵树中,节点级别根据其与树根的相对距离进行编号(树根为 0)。最小深度是通过对森林中所有树的每个变量的第一次分割深度取平均值来衡量重要的风险因素。
该指标的假设是,较小的最小深度值表明该变量分离了大组观测值,因此对森林预测的影响较大。
一般来说,要根据 VIMP 选择变量,我们要检查 VIMP 值,寻找 VIMP 测量值差异较大的排序点。但是最小深度是森林构建的定量属性,Ishwaran 等人(2010 年)还推导出了变量影响证据的分析阈值。规则使用最小深度分布的平均值,将最小深度低于该阈值的变量归类为森林预测中的重要变量。

varsel_pbc <- var.select(rfsrc_pbc)
topvars <- varsel_pbc$topvars

在这里插入图片描述

gg_md <- gg_minimal_depth(varsel_pbc, lbls = st.labs)
print(gg_md)

在这里插入图片描述
综合上面两图,咱们可以得到,最小深度阈值(depth threshold)为5.2757,共筛选了15个变量,第一个进行分裂的变量就是bili,在深度2.144就开始分裂了,接着就是albumin和copper。
绘制深度节点和变量图

plot(gg_md)

在这里插入图片描述
从上图可以看出虚线就是最小深度,越往右深度越大,其中较小的最小深度值表示较高的重要性,较大的值表示重要性较低。
由于我们现在有两个指标来判定,那选哪个好呢?我们可以使用gg_minimal_vimp函数来进行综合比较,

plot(gg_minimal_vimp(gg_md)) +theme(legend.position=c(0.8, 0.2))

在这里插入图片描述
这个图形是这个包中的一个核心图形,我要好好解释一下。因为这张图使用两个方法,vimp和最小深度法。这条斜着的虚线是这两种方法的分界点,蓝色的点代表vimp大于0的,红色的点代表vimp小于0。红色斜着的虚线上的点,代表这个变量在两种分类方法排名相同,高于红色虚线上的点,代表它的vimp的排名更加高,低于红色虚线上的点,表明它的最小深度排名更高。

看它生成的表格也可以看出来

out2<-gg_minimal_vimp(gg_md)

在这里插入图片描述
我们可以看到两种方法有些排名是一样的,有些是不一样的。如果我们根据阈值5.2757进行筛选,那么最终可以选出"bili" ,“albumin” ,“copper” ,“prothrombin” ,"edema"这5个变量,有些文章介绍有临床意义的变量也是可以选进来的。

接下来绘制部分依赖图(PDP),假设咱们想了解"bili"这个变量,对1年和3年生存结局的影响(也就是依赖性),咱们先生成这个结局治疗的数据

gg_v <-gg_variable(rfsrc_pbc, time = c(1, 3),time.labels = c("1 Year", "3 Years"))

在这里插入图片描述
进行绘图,注意形状散点代表的意义不一样

plot(gg_v, xvar = "bili", alpha = 0.4) + #, se=FALSElabs(y = "Survival", x = "bili") +theme(legend.position = "none") +scale_color_manual(values = c("red", "blue"), labels = c("1 Year", "3 Years")) +coord_cartesian(ylim = c(-0.01, 1.01))+xlab("Serum Bilirubin")

在这里插入图片描述
ggRandomForests包的绘图函数画起来不咱们美观,我们可以根据结局数据自己来画

ggplot(gg_v) + geom_point(aes_string(x = "bili", y = "yhat", color = "event", shape = "event"))+geom_smooth(aes_string(x = "bili", y = "yhat", color = "time",fill="time"))+theme_classic()+xlab("bili")+ylab("yhat")

在这里插入图片描述
当然咱们也可以分面

ggplot(gg_v) + geom_point(aes_string(x = "bili", y = "yhat", color = "event", shape = "event"))+geom_smooth(aes_string(x = "bili", y = "yhat", color = "time",fill="time"))+facet_wrap(~time,ncol = 1)

在这里插入图片描述
上图表明胆红素超过20后,随着胆红素增加存活率上升。
部分依赖图(Partial Dependence Plot)显示了一个或两个特征对机器学习模型的预测结果的边际效应,由于机器学习算法非参数的特性使得部份依赖图可以揭示线性以及非线性特征,容易理解并且有较高的解释力。但是对于生存数据,我们还要考虑时间的影响,
咱们可以使用parallel包的mclapply函数,结合plot.variable函数来处理时间数据,我们先定义要观察的变量和3个时间节点(1年,3年和5年)

xvar <- c("bili", "albumin", "copper", "prothrombin", "age", "edema")
time_index <- c(which(rfsrc_pbc$time.interest > 1)[1]-1,which(rfsrc_pbc$time.interest > 3)[1]-1,which(rfsrc_pbc$time.interest > 5)[1]-1)

time_index装有3个时间点数据,下面导入包来分析mclapply函数类似于平时咱们的lapply函数,就是对多个时间点使用plot.variable函数来跑循环

library(parallel)
partial_pbc <- mclapply(rfsrc_pbc$time.interest[time_index],function(tm){plot.variable(rfsrc_pbc, surv.type = "surv",time = tm, xvar.names = xvar,partial = TRUE ,show.plots = FALSE)})

时间点的预测值存在partial_pbc列表里面,3个数据代表3年
在这里插入图片描述
咱们把数据提取出来,咱们这里只提取1年和3年

gg_dta <- mclapply(partial_pbc, gg_partial)
pbc_ggpart <- combine.gg_partial(gg_dta[[1]], gg_dta[[2]],lbls = c("1 Year", "3 Years"))

提取数据后就可以绘图了,先绘制一个箱线图

ggplot(pbc_ggpart[["edema"]], aes(y=yhat, x=edema, col=group))+geom_boxplot(notch = TRUE,outlier.shape = NA) + # panel=TRUE,labs(x = "Edema", y = "Survival (%)", color="Time", shape="Time") +theme_classic()

在这里插入图片描述
绘制时间依赖图(文章是这么叫的)

ggplot(pbc_ggpart[["bili"]], aes(y=yhat, x=bili, col=group))+geom_smooth() + # panel=TRUE,labs(x = "bili", y = "Survival (%)", color="Time", shape="Time") +theme(legend.position = c(0.1, 0.2))+theme_classic() 

在这里插入图片描述
咱们可以看到和部分依赖图还是有点区别的,结论也不一样了。咱们也可以按我上面的方法从pbc_ggpart提取数据来自己绘制,有兴趣的可以试一下,这样更加灵活,更加好看。

接下来咱们来做下亚组的依赖关系,也就是亚组分析,亚组关系需要按年提取,咱们提取第一年的数据

ggvar<- gg_variable(rfsrc_pbc, time = 1)

在这里插入图片描述
咱们把edema改成分组的显示

ggvar$edema <- paste("edema = ", ggvar$edema, sep = "")

在这里插入图片描述
绘制亚组关系图,表明了每个亚组对生存结局的影响

ggplot(ggvar) + geom_point(aes_string(x = "bili", y = "yhat", color = "event", shape = "event"))+geom_smooth(aes_string(x = "bili", y = "yhat"))+facet_wrap(~edema)

在这里插入图片描述
咱们也可以对连续变量进行分组后在绘制

bili_cts <-quantile_pts(ggvar$bili, groups = 6, intervals = TRUE)
bili_cts[1] <- bili_cts[1] - 1.e-7  #我们需要移动最小值,以便包含该观察结果

##创建条件组并添加到gg_variable对象

bili_grp <- cut(ggvar$bili, breaks = bili_cts)
ggvar$bili_grp <- bili_grp
levels(ggvar$bili_grp) <- paste("bilirubin =", levels(bili_grp))  #调整面的命名

绘图

ggplot(ggvar) + geom_point(aes_string(x = "albumin", y = "yhat", color = "event", shape = "event"))+geom_smooth(aes_string(x = "albumin", y = "yhat"))+facet_wrap(~bili_grp)

在这里插入图片描述
也可以使用gg_partial_coplot来绘制亚组的图,前面步骤是一样的,先生成分组变量

albumin_cts <-quantile_pts(ggvar$albumin, groups = 6, intervals = TRUE)
albumin_cts[1] <- albumin_cts[1] - 0.01  #我们需要移动最小值,以便包含该观察结果

##创建条件组并添加到gg_variable对象

albumin_grp <- cut(ggvar$albumin, breaks = albumin_cts)
ggvar$albumin_grp <- albumin_grp

使用g_partial_coplot生成绘图数据

coplotpbc <- gg_partial_coplot(rfsrc_pbc, xvar = "bili",groups = ggvar$albumin_grp,surv_type = "surv",time = rfsrc_pbc$time.interest[time_index[1]],show.plots = FALSE)

在这里插入图片描述
绘图

ggplot(coplotpbc, aes(x=bili, y=yhat, col=group, shape=group)) +geom_smooth(se = FALSE) +labs(x = "bili", y = "Survival at 1 year (%)",color = "albumin", shape = "albumin")+theme_classic()

在这里插入图片描述
除此之外还可以做决策曲线和roc曲线,这里就不弄了,我的既往文章都有。这两章内容比较多,代码我自己跑是没问题,但是怕有时候贴出来有时候会少贴一段,我把这两章代码进行了打包,公众号回复:随机森林生存分析代码,可以获得,回复要一模一样才行。

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

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

相关文章

Linux du和df命令

目录 一. df二. du 一. df ⏹用于显示系统级别&#xff0c;磁盘分区上的可用和已用空间的信息 -h&#xff1a;以人类可读的格式显示文件系统大小 ⏹每秒钟监视当前磁盘的使用情况 watch 用于周期性的执行特定的命令-n 1 表示每一秒刷新一次命令执行的结果df -h ./ 表示周期性…

Salesforce Einstein详解

首先给大家强调的是Einstein AI在国内的阿里云版是不具备的&#xff0c;原因不言自喻。 一&#xff0e;saleforce Einstein简介 爱因斯坦是SalesForce花重金&#xff08;收购RelateIQ、机器学习公司PredictionIO与深度学习企业MetaMind&#xff0c;MetaMind创始人Richard Soc…

Linux ps命令

一. 说明 用于显示系统中当前运行的进程信息。 提供了查看进程的不同视图和选项&#xff0c;允许用户了解系统上正在运行的进程的状态、资源使用情况等。 -e&#xff1a;显示所有进程&#xff0c;而不仅仅是与当前终端关联的进程。-f&#xff1a;以完整的格式显示进程信息&am…

Kubernetes(K8S)云服务器实操TKE

一、 Kubernetes(K8S)简介 Kubernetes源于希腊语,意为舵手,因为首尾字母中间正好有8个字母,简称为K8S。Kubernetes是当今最流行的开源容器管理平台,是 Google 发起并维护的基于 Docker 的开源容器集群管理系统。它是大名鼎鼎的Google Borg的开源版本。 K8s构建在 Docker …

Spring Boot 接入 KMS 托管中间件密码第三方接口密钥

1. 需求 Nacos中关于中间件的密码&#xff0c;还有第三方API的密钥等信息&#xff0c;都是明文存储&#xff0c;不符合系统安全要求。现需对这些信息进行加密处理&#xff0c;Nacos只存储密文&#xff0c;并在服务启动时&#xff0c;调用云厂商的KMS接口进行解密&#xff0c;将…

C#编程-实现在文本文件中的读和写

实现在文本文件中的读和写 Stream类用于从文本文件读取数据和向文本文件写入数据。它是一个抽象类,支持向流读写字节。如果文件的数据仅是文本,那么您可以使用StreamReader类和StreamWriter类来完成相应的读和写任务。 StreamReader类 StreamReader类继承自从抽象类TextRea…

机器学习指南:如何学习机器学习?

机器学习 一、介绍 你有没有想过计算机是如何从数据中学习和变得更聪明的&#xff1f;这就是机器学习 &#xff08;ML&#xff09; 的魔力&#xff01;这就像计算机科学和统计学的酷炫组合&#xff0c;计算机从大量信息中学习以解决问题并做出预测&#xff0c;就像人类一样。 …

面试题:什么是雪花算法?啥原理?

SnowFlake 算法&#xff0c;是 Twitter 开源的分布式 ID 生成算法。 其核心思想就是&#xff1a;使用一个 64 bit 的 long 型的数字作为全局唯一 ID。在分布式系统中的应用十分广泛&#xff0c;且 ID 引入了时间戳&#xff0c;基本上保持自增的&#xff0c;后面的代码中有详细…

UV胶水能够粘接聚苯乙烯PS吗?需要注意哪些事项?又有哪些优势呢?

聚苯乙烯&#xff08;Polystyrene&#xff0c;简称PS&#xff09;是一种常见的合成聚合物&#xff0c;属于热塑性塑料。它是由苯乙烯单体聚合而成的&#xff0c;具有轻质、透明或半透明、电绝缘性好等特点。常见: 包装材料白色泡沫塑料&#xff08;EPS&#xff0c;用于包装、保…

不断发展的识别技术为多个行业带来新机遇

随着人工智能和机器学习技术的不断进步&#xff0c;识别技术已经得到了广泛的应用。识别技术是指通过计算机软件和硬件的配合&#xff0c;自动识别输入的信息并转换为可处理的数据的过程。这种技术的应用范围非常广泛&#xff0c;包括人脸识别、语音识别、文字识别、车牌识别等…

java注解学习

java注解 Annotation 为什么要学注解&#xff1f; 在日常开发中&#xff0c;基本都是在使用别人定义或是各种框架的注解&#xff0c;比如Spring框架中常用的一些注解&#xff1a;Controller、Service、RequestMapping&#xff0c;以此来实现某些功能&#xff0c;但是却不知道如…

HarmonyOS@Link装饰器:父子双向同步

Link装饰器&#xff1a;父子双向同步 子组件中被Link装饰的变量与其父组件中对应的数据源建立双向数据绑定。 说明 从API version 9开始&#xff0c;该装饰器支持在ArkTS卡片中使用。 概述 Link装饰的变量与其父组件中的数据源共享相同的值。 装饰器使用规则说明 Link变…

echarts使用之柱状图

一、引入Echarts npm install eacharts --save 二、选择一个Echarts图 选择创建一个柱状图 option { // x轴参数的基本配置xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun] //X轴数据}, // y轴参数的基本配置yAxis: {type: value}, // series:[{data: …

富文本BraftEditor引起的bug

1、BraftEditor踩坑1 #基于之前写的一篇BraftEditor的使用# 1. 问题起源&#xff1a; 打开编辑弹窗--> 下面页面所示--> 当进行分类选择时候&#xff0c;就会报错&#xff0c;并且这个报错还不是一直都有&#xff0c;6次选择出现一次报错吧 2. 解决&#xff1a; 2.1 起…

CES 2024:LG专注于新产品的人工智能变革

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

蓝牙模块在电动汽车充电设施中的创新应用

随着电动汽车的普及&#xff0c;充电设施的便捷性和智能化成为关键的发展方向。蓝牙技术作为一种无线通信技术&#xff0c;在电动汽车充电设施中发挥着越来越重要的作用。本文将深入探讨蓝牙模块在电动汽车充电设施中的创新应用&#xff0c;以提高充电体验、提升管理效率&#…

MulticoreWare与Imagination一同按下汽车计算工作负载的“加速键”

中国北京 – 2024年1月8日 - MulticoreWare Inc与Imagination Technologies共同宣布已在德州仪器TDA4VM处理器上实现了GPU计算&#xff0c;不仅使算力提升了约50 GFLOPS&#xff0c;而且还实现了自动驾驶和高级驾驶辅助系统&#xff08;ADAS&#xff09;常见工作负载性能的跃升…

PCL 使用克拉默法则进行四点定球(C++详细过程版)

目录 一、算法原理二、代码实现三、计算结果本文由CSDN点云侠原创,PCL 使用克拉默法则进行四点定球(C++详细过程版),爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、算法原理 已知空间内不共面的四个点,设其坐标为 A (…

鼠标随动指定区域高亮显示(Excel聚光灯)

实例需求&#xff1a;工作表中数据表实现跟随鼠标选中高亮效果&#xff0c;需要注意如下几个细节需求 数据表为连续区域&#xff0c;但是不一定从A1单元格开始数据表的前两行&#xff08;标题行&#xff09;不使用高亮效果数据表中已经应用了条件格式&#xff0c;高亮显示取消…

redis持久化与SpringBoot整合

redis持久化与SpringBoot整合 1、Redis全局命令1.2、Redis事务 2、Redis持久化2.1、RDB方式2.1.1、客户端触发机制2.1.2、服务端触发机制2.2.3、配置生成快照名称和位置2.2.4、优点2.2.5、缺点 2.2、AOF方式2.2.1、优点2.2.2、缺点 2.3、RDB-AOF混合方式2.4、持久化机制的选择 …