特征变量选择

TCGA-11.听起来很霸气用起来并不难的随机森林

2020-02-05  本文已影响0人  小洁忘了怎么分身

花花写于2020-02-05 今天豆豆点了个外卖,以前可以送到房间门口,现在只能去大门口取了,而且回来还需要例行检查。感谢疫情中守护我们的工作人员,愿一切快点好起来。
今天继续学习机器学习算法做生存模型,高大上的随机森林,听起来需要学两年,但初步应用的代码很简单,并不是搞懂了算法、原理才能去用。这个运行时间很长,有点考验电脑哦。

1.准备输入数据

输入数据是TCGA的表达矩阵expr、临床信息meta和group_list。保存为forest.Rdata了,在生信星球公众号后台聊天窗口回复“森林”即可获得。

load("forest.Rdata")
exprSet = expr[,group_list=="tumor"]

## 必须保证生存资料和表达矩阵,两者一致
all(substring(colnames(exprSet),1,12)==meta$ID)
#> [1] TRUE
library(randomForest)
library(ROCR)
library(genefilter)
library(Hmisc)

2.构建随机森林模型

输入数据是表达矩阵(仅含tumor样本)和对应的生死。

高能:此处可能需要运行十几分钟,取决于你电脑的配置,配置很不好就不要跑这一步了,容易卡死,看看代码理解一下意思就好。
x=t(log2(exprSet+1))
y=meta$event
#构建模型,一个叫randomForest的函数,运行时间很长,存Rdata跳过
tmp_rf=file.path('./Rdata/TCGA_KIRC_miRNA_rf_output.Rdata')
if(!file.exists(tmp_rf)){
  rf_output=randomForest(x=x, y=y,importance = TRUE, ntree = 10001, proximity=TRUE )
  save(rf_output,file = tmp_rf)
}
load(file = tmp_rf)
#top30的基因
varImpPlot(rf_output, type=2, n.var=30, scale=FALSE, 
           main="Variable Importance (Gini) for top 30 predictors",cex =.7)
rf_importances=importance(rf_output, scale=FALSE)
head(rf_importances)
#>                   %IncMSE IncNodePurity
#> hsa-let-7a-1 0.0005839108     0.3952803
#> hsa-let-7a-2 0.0006337582     0.4783033
#> hsa-let-7a-3 0.0005867823     0.4106104
#> hsa-let-7b   0.0005974527     0.2871573
#> hsa-let-7c   0.0003302193     0.2344674
#> hsa-let-7d   0.0003187660     0.1929435
#解释量top30的基因,和图上是一样的,从下往上看。
choose_gene=rownames(tail(rf_importances[order(rf_importances[,2]),],30))

3.模型预测和评估

3.1自己预测自己

rf.prob <- predict(rf_output, x)
re=cbind(y ,rf.prob)
head(re)
#>                              y   rf.prob
#> TCGA-A3-3307-01A-01T-0860-13 0 0.1094791
#> TCGA-A3-3308-01A-02R-1324-13 0 0.1719678
#> TCGA-A3-3311-01A-02R-1324-13 1 0.6914492
#> TCGA-A3-3313-01A-02R-1324-13 1 0.7408259
#> TCGA-A3-3316-01A-01T-0860-13 0 0.1635503
#> TCGA-A3-3317-01A-01T-0860-13 0 0.1204913

3.2 箱线图

对预测结果进行可视化。以实际的生死作为分组,画箱线图整体上查看预测结果。

re=as.data.frame(re)
colnames(re)=c('event','prob')
re$event=as.factor(re$event)
library(ggpubr) 
p1 = ggboxplot(re, x = "event", y = "prob",
               color = "event", palette = "jco",
               add = "jitter")+ stat_compare_means()
p1

对比lasso回归,这个似乎更好一些?

3.3 AUC值

library(ROCR)
#library(caret)

pred <- prediction(re[,2], re[,1])
auc = performance(pred,"auc")@y.values[[1]]
auc
#> [1] 1

自己预测自己,auc值竟然是1。ROC曲线我就不画了,和前面的几个模型画的代码一样。

4.切割数据构建模型并预测

4.1 切割数据

用R包caret切割数据,生成的结果是一组代表列数的数字,用这些数字来给表达矩阵和meta取子集即可。

library(caret)
set.seed(12345679)
sam<- createDataPartition(meta$event, p = .5,list = FALSE)

train <- exprSet[,sam]
test <- exprSet[,-sam]
train_meta <- meta[sam,]
test_meta <- meta[-sam,]

4.2 切割后的train数据集建模

和上面的建模方法一样。

#建模
x = t(log2(train+1))
y = train_meta$event
tmp_rf=file.path('./Rdata/TCGA_KIRC_miRNA_t_rf_output.Rdata')
if(!file.exists(tmp_rf)){
  rf_output=randomForest(x=x, y=y,importance = TRUE, ntree = 10001, proximity=TRUE )
  save(rf_output,file = tmp_rf)
}
load(file = tmp_rf)

choose_gene=rownames(tail(rf_importances[order(rf_importances[,2]),],30))
length(choose_gene)
#> [1] 30

5.模型评估和预测

用训练集构建模型,预测测试集的生死。

x = t(log2(test+1))
y = test_meta$event
rf.prob <- predict(rf_output, x)
re=cbind(y ,rf.prob)
re=as.data.frame(re)
colnames(re)=c('event','prob')
re$event=as.factor(re$event)
library(ggpubr) 
p1 = ggboxplot(re, x = "event", y = "prob",
               color = "event", palette = "jco",
               add = "jitter")+ stat_compare_means()
p1

再看AUC值。

library(ROCR)
# 训练集模型预测测试集
pred <- prediction(re[,2], re[,1])
auc= performance(pred,"auc")@y.values[[1]]
auc
#> [1] 0.7118081

还行。

微信公众号生信星球同步更新我的文章,欢迎大家扫码关注!


我们有为生信初学者准备的学习小组,点击查看◀️
想要参加我的线上线下课程,也可加好友咨询🔼
如果需要提问,请先看生信星球答疑公告
上一篇下一篇

猜你喜欢

热点阅读