基于机器学习算法的随机生存森林-R语言生存分析
创作时间:
作者:
@小白创作中心
基于机器学习算法的随机生存森林-R语言生存分析
引用
CSDN
1.
https://blog.csdn.net/weixin_46587777/article/details/138094900
在生存分析领域,随机生存森林(Random Survival Forests,RSF)是一种基于随机森林算法的生存分析方法。它能够处理生存数据,涵盖连续变量的回归、多元回归、分位数回归、分类等多种应用场景。本文将详细介绍如何使用R语言中的randomForestSRC包进行随机生存森林模型的构建和分析。
加载R包和数据集
首先,我们需要加载randomForestSRC包并加载内置的veteran数据集。veteran数据集包含了关于肺癌患者的生存数据。
library(randomForestSRC)
data("veteran")
head(veteran)
## trt celltype time status karno diagtime age prior
## 1 1 1 72 1 60 7 69 0
## 2 1 1 411 1 70 5 64 10
## 3 1 1 228 1 60 3 38 0
## 4 1 1 126 1 60 9 63 10
## 5 1 1 118 1 70 11 65 10
## 6 1 1 10 1 20 5 49 0
构建随机生存森林模型
模型构建
使用rfsrc
函数构建随机生存森林模型。这里我们指定100棵树,最小节点数为5,并计算变量重要性。
rfsrc_fit <- rfsrc(
Surv(time,status)~., # 公式
ntree = 100, # 树的数量
nsplit = 5, # 最小节点数
importance = TRUE, # 变量重要性
tree.err=TRUE, # 误差
data=veteran # 数据集
)
打印模型信息
通过print
函数查看模型的基本信息。
print(rfsrc_fit)
## Sample size: 137
## Number of deaths: 128
## Number of trees: 100
## Forest terminal node size: 15
## Average no. of terminal nodes: 5.66
## No. of variables tried at each split: 3
## Total no. of variables: 6
## Resampling used to grow trees: swor
## Resample size used to grow trees: 87
## Analysis: RSF
## Family: surv
## Splitting rule: logrank *random*
## Number of random split points: 5
## (OOB) CRPS: 0.0631377
## (OOB) Requested performance error: 0.2920389
绘制树结构
使用plot
函数绘制第3棵树的结构。
plot(get.tree(rfsrc_fit,3))
模型结果可视化
绘制模型的误差和变量重要性。
plot(rfsrc_fit)
绘制生存曲线
绘制前5个样本的生存曲线。
matplot(rfsrc_fit$time.interest,
100*t(rfsrc_fit$survival.oob[1:5,]),
xlab = "time",
ylab = "Survival",
type="l",lty=1,
lwd=2)
也可以采用如下方法绘制:
plot.survival(rfsrc_fit,subset=1:5)
采用KM法和rfsrc法计算Brier score 并绘图
计算Brier score
使用Kaplan-Meier法计算Brier score。
bs_km <- get.brier.survival(rfsrc_fit,
cens.model = "km")$brier.score
head(bs_km)
## time brier.score
## 1 1 1.469133e-02
## 2 2 2.207674e-02
## 3 3 2.916115e-02
## 4 4 3.378161e-02
## 5 7 5.346989e-02
## 6 8 7.667463e-02
使用rfsrc法计算Brier score。
bs_rsf <- get.brier.survival(rfsrc_fit,
cens.model = "rfsrc")$brier.score
head(bs_rsf)
## time brier.score
## 1 1 1.469133e-02
## 2 2 2.207674e-02
## 3 3 2.916115e-02
## 4 4 3.378161e-02
## 5 7 5.346989e-02
## 6 8 7.667463e-02
绘制Brier score随时间变化的曲线
plot(bs_km,type="s",col=2,lwd=3)
lines(bs_rsf,type = "s",col=4,lwd=3)
legend("topright",
legend = c("cens.model"="km",
"cens.moedl"="rfs"),
fill = c(2,4))
优化节点参数
使用tune.nodesize
函数优化节点参数。
tune.nodesize(Surv(time,status) ~ ., veteran)
输出结果:
## nodesize = 1 error = 32.6%
## nodesize = 2 error = 32.4%
## nodesize = 3 error = 32.64%
## nodesize = 4 error = 31.45%
## nodesize = 5 error = 30.41%
## nodesize = 6 error = 30.7%
## nodesize = 7 error = 29.17%
## nodesize = 8 error = 30.17%
## nodesize = 9 error = 30.19%
## nodesize = 10 error = 28.97%
## nodesize = 15 error = 30.46%
## nodesize = 20 error = 30.41%
## nodesize = 25 error = 30.89%
## nodesize = 30 error = 29.88%
## nodesize = 35 error = 29.76%
## nodesize = 40 error = 31.66%
## optimal nodesize: 10
## $nsize.opt
## [1] 10
##
## $err
## nodesize err
## 1 1 0.3259640
## 2 2 0.3240416
## 3 3 0.3264164
## 4 4 0.3145426
## 5 5 0.3041389
## 6 6 0.3069660
## 7 7 0.2916996
## 8 8 0.3016510
## 9 9 0.3018772
## 10 10 0.2896641
## 11 15 0.3045912
## 12 20 0.3041389
## 13 25 0.3088884
## 14 30 0.2988239
## 15 35 0.2975800
## 16 40 0.3165781
优化后的最佳节点数为10。
变量重要性
使用subsample
函数计算变量重要性,并绘制结果。
vipm_obj <- subsample(rfsrc_fit)
plot(vipm_obj)
绘制部分依赖图(PDP)
age对死亡率的影响
partial_obj <- partial(rfsrc_fit,
partial.xvar = "age",
partial.type = "mort",
partial.values = rfsrc_fit$xvar$age,
partial.time = rfsrc_fit$time.interest)
# 提取数据
pdta <- get.partial.plot.data(partial_obj)
# 绘图
plot(lowess(pdta$x, pdta$yhat, f = 1/3),
type = "l", xlab = "age", ylab = "adjusted mortality")
karno变量对生存的影响
karno <- quantile(rfsrc_fit$xvar$karno)
partial.obj <- partial(rfsrc_fit,
partial.type = "surv",
partial.xvar = "karno",
partial.values = karno,
partial.time = rfsrc_fit$time.interest)
pdta <- get.partial.plot.data(partial.obj)
## plot partial effect of karnofsky on survival
matplot(pdta$partial.time, t(pdta$yhat), type = "l", lty = 1,
xlab = "time", ylab = "karnofsky adjusted survival")
legend("topright",
legend = paste0("karnofsky = ", karno), fill = 1:5)
参考资料
热门推荐
语言多样性遇上AI:迈阿密方言如何推动大模型进化
波斯战争2500周年,揭秘希腊城邦的逆袭之路
海竿是什么意思?鱼竿两大类型之一,泛指所有配备渔轮的鱼竿!
研究揭示:高血压是鼻出血重要诱因,及时监测可预防中风
中山市口腔医院:守护市民口腔健康的专业力量
揭秘和平精英外挂黑产:从加速透视到非法牟利
《和平精英》快速升级攻略:7天内轻松达到10级!
冬季滋补首选鲍鱼炖鸡:营养美味在家就能做
会议速记法:让你秒变会议纪要达人
从庚辰到公元:中国纪年法的演变与并存
大英博物馆必买文创,圣诞礼物首选!
老边饺子馆:沈河区必打卡美食圣地
恋爱神器:“小糖豆”教你甜蜜沟通
3月1日起,河南驾考科目一将增考地方交通法规
749局:从军事科研到超自然探索,揭秘电影背后的神秘机构
香辣猪头肉的神仙做法,你get了吗?
从洛伦兹力到安培力:电磁作用的微观与宏观表现
郑州合记烩面:五十年匠心传承,一碗面里的中原味道
糖尿病患者必知:甘舒霖R六种副作用及预防要点
人与人最好的交往,永远是双向奔赴
沈阳燕都医院揭秘特发性肺纤维化治疗新突破
语音控制智能家居:智能语音助手技术与应用前瞻
至贱而有大功:蒲公英的药用与食用双重价值
北京中医医院推荐:实用中医护眼法
脉压差超60毫米汞柱,当心心血管疾病
失恋疗愈指南:跟着热歌走出阴霾
摩托车整流器的作用与检测方法
中国春节成功申遗,成第44项世界级非遗
算盘:承载千年智慧的中国传统文化瑰宝
XNGP之城市路书 | 探索揭阳古城