【基于机器学习算法的随机生存森林-R语言生存分析】

在生存分析中,常用Cox回归进行多因素分析。本文介绍一种基于随机森林算法的生存分析方法-随机生存森林(randomForestRSC)。

随机生存森林是随机森林处理生存数据的扩展方法。它涵盖了随机森林的各种模型,包括:连续变量的回归,多元回归,分位数回归,分类,生存分析等典型应用。我们着重介绍其中的生存分析部分的内容。

1、加载R包和数据集​​​​​​

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

2、构建随机生存森林模型

2.1 模型构建

rfsrc_fit <- rfsrc(                   Surv(time,status)~., #公式                   ntree = 100,         # 树的棵树                    nsplit = 5,          # 最小节点数                   importance = TRUE,   #变量重要性                   tree.err=TRUE,       # 误差                   data=veteran         # 数据集                   )

2.2 打印模型信息​​​​

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

2.3 绘制树结构

plot(get.tree(rfsrc_fit,3))

2.4 模型结果可视化(误差和变量重要性)

plot(rfsrc_fit)

3、绘制生存曲线

 绘制前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)

4、采用KM法和rfsrc法计算Brier score 并绘图

4.1 计算Brier score

​​​​​​​

# km法bs_km <- get.brier.survival(rfsrc_fit,                             cens.model = "km")$brier.scorehead(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 法bs_rsf <- get.brier.survival(rfsrc_fit,                              cens.model = "rfsrc")$brier.scorehead(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

4.2 绘制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))

5、优化节点参数

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。

6、变量重要性

​​​​​​​

vipm_obj <- subsample(rfsrc_fit)plot(vipm_obj)

7、绘制部分依赖图(PDP)

7.1  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")

7.2  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 survivalmatplot(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)

参考资料

  1. https://www.randomforestsrc.org/index.html

  2. https://blog.csdn.net/weixin_41368414/article/details/126102345

分享更多R语言知识,请关注下方公众号。后台回复“随机生存森林”免费索取代码。如果对您有帮助请【分享+点赞+在看】

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
随机生存森林是一种用于生存分析机器学习算法,它可以用来预测一个人或事物的生存时间。在R语言中,可以使用“randomForestSRC”包来生成随机生存森林模型并查看预测结果。 以下是一个简单的例子: 首先,我们需要加载“randomForestSRC”包和一个示例数据集“pbc”。 ```R library(randomForestSRC) data(pbc) ``` 接下来,我们需要将数据集分为训练集和测试集。这里我们将70%的数据用于训练,30%的数据用于测试。 ```R set.seed(123) train_index <- sample(1:nrow(pbc), floor(0.7*nrow(pbc))) train_data <- pbc[train_index, ] test_data <- pbc[-train_index, ] ``` 然后,我们可以使用“rfsrc”函数生成随机生存森林模型。 ```R model <- rfsrc(Surv(days, status) ~ ., data=train_data) ``` 这个模型使用了“days”和“status”作为响应变量,其余变量作为预测变量。 现在,我们可以使用“predict”函数对测试集进行预测并查看预测结果。 ```R predictions <- predict(model, newdata=test_data) ``` “predictions”是一个包含两列的数据框,第一列是预测的生存时间,第二列是预测的生存概率。我们可以使用“summary”函数查看预测结果的统计信息。 ```R summary(predictions) ``` 这将显示出预测结果的一些统计信息,如平均生存时间、中位数生存时间、生存概率等。 此外,我们可以使用“plot”函数绘制预测结果的 Kaplan-Meier 曲线。 ```R plot(predictions$predicted, type='s') ``` 这将绘制出预测结果的 Kaplan-Meier 曲线,可以用来比较预测结果与实际情况之间的差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮肤小白生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值