查看原文
其他

使用随机森林来进行变量重要性评估-第二弹

生态R学社 生态R学社 2022-07-17

写在前面

这几天陆续给大家推荐几种变量重要性的评估方法,本期推荐使用随机森林的另一种形式来进行变量重要性评估(数据筛选),文末下载练习数据哦~本期内容主要包括以下几点:

  • 随机森林简介
  • 随机森林的优点
  • 绘制漂亮的结果筛选图

randomForest算法简介

「randomForest」算法进行计算时,通过对对象变量进行抽样构建预测模型,形成多个决策树,然后依次对对象进行分类,最后将各决策树的分类信息进行汇总,所有预测类别中的众数类别即为随机森林预测出的对象类别,进而使预测准确率大大提高。

随机森林的优点

  1. 更高的分类准确率

  2. 能够有效处理多元数据集,且不需要进行降维

  3. 具有处理大数据的优势

  4. 可以应用于具有大量缺失值的数据集中

  5. 能够在进行分类的同时度量变量对分类的相对重要性

实例数据演示

话不多说,我们进入实战环节:

和上期一样,这次我们的示例数据依旧演示的是,植被群落特征、环境因子变量对地上净初级生产力(ANPP)变化的重要性

#调用R包library(randomForest)library(ggplot2)#构建函数,这一步不需要改动create_rfplot <- function(rf, type){ imp <- importance(rf, type = type, scale = F) featureImportance <- data.frame(Feature = row.names(imp), Importance = imp[,1]) p <- ggplot(featureImportance, aes(x = reorder(Feature, Importance), y = Importance)) + geom_bar(stat = "identity", fill = "#53cfff", width = 0.65) + coord_flip() + theme_light(base_size = 20) + theme(axis.title.x = element_text(size = 15, color = "black"), axis.title.y = element_blank(), axis.text.x = element_text(size = 15, color = "black"), axis.text.y = element_text(size = 15, color = "black")) return(p)}#设置随机种子set.seed(123)#读取数据mydata<-read.csv(file.choose(),row.names=1)#进行随机森林逆袭rf1 <- randomForest( ANPP ~ ., ntree = 40, data = mydata, nodesize = 1, replace = FALSE, importance = TRUE)#查看随机森林结果rf1$importance#保存随机森林结果write.csv(rf1$importance,"随机森林结果.csv")#绘图create_rfplot(rf1, type = 2)

结果与绘图

这是分析结果

这是初步绘图

示随机森林第二种使用方式

我们用如上代码进行随机森林分析后,好多小伙伴就会问一个问题,我们只是对变量的重要性进行了一个排序,那么如果我想知道哪个变量贡献较为显著,且随机森林的整体解释度是多少该怎么办呢,就像下边这幅图一样,那就运行下边的代码吧~

依旧演示的是,植被群落特征、环境因子变量对地上净初级生产力(ANPP)变化的重要性,代码很简洁,唯一需要注意的是,df<-design[,2:14],这个代码代表的意思是,我们选取的是第2到第14列的数据

代码来了~

#调用R包library(rfPermute)library(ggplot2)#读取数据design<-read.csv(file.choose())#构建随机森林数据框,读取第2列到第14列数据df<-design[,2:14]#设置随机种子,使结果能够重现set.seed(123)#运行随机森林rf_results<-rfPermute(df$ANPP~., data =df, importance = TRUE, ntree = 1000)#查看随机森林主要结果rf_results$rf#提取预测因子的解释率predictor_var<- data.frame(importance(rf_results, scale = TRUE), check.names = FALSE)#提取预测变量的显著predictor_sig<-as.data.frame((rf_results$pval)[,,2])colnames(predictor_sig)<-c("sig","other")#合并显著因子和解释率表df_pre<-cbind(predictor_var,predictor_sig)df_pre$sig[df_pre$sig<=0.05]<-"*"df_pre$sig[df_pre$sig>=0.05]<-" "k <- df_pre$IncNodePurity[df_pre$sig=="*"]<-"red"#绘制柱状图
ggplot(data=df_pre,aes(x=rownames(df_pre),y=df_pre$`%IncMSE`))+ geom_bar(stat = 'identity',width=0.7,fill=k)+ theme_classic()+ labs(x='',y='Increase in MSE(%)')+ scale_y_continuous(expand = c(0,0),limit = c(0, 12))+ geom_text(aes(label = df_pre$sig,y= df_pre$`%IncMSE`+ 0.1, x =rownames(df_pre)),vjust = -0.3,size = 6)+ theme(axis.text = element_text(color = "black",size = 11))+ annotate('text', label = sprintf('italic(R^2) == %.2f', 96.14), x = 9, y = 10, size = 5, parse = TRUE)

结果与绘图

这是R方等主要分析结果



这是初步绘图


由于数据是自己杜撰的,所以显著性有些差,大家快换自己的数据试试吧~


示例数据及脚本下载

关注生态R学社,回复“随机森林2”即可下载示例数据与脚本

参考文献:

Jiao S, Chen W, Wang J, et al. Soil microbiomes with distinct assemblies through vertical soil profiles drive the cycling of multiple nutrients in reforested ecosystems. Microbiome, 2018, 6(1): 1-13.

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存