使用随机森林来进行变量重要性评估-第二弹
写在前面
这几天陆续给大家推荐几种变量重要性的评估方法,本期推荐使用随机森林的另一种形式来进行变量重要性评估(数据筛选),文末下载练习数据哦~本期内容主要包括以下几点:
随机森林简介 随机森林的优点 绘制漂亮的结果筛选图
randomForest算法简介
「randomForest」算法进行计算时,通过对对象变量进行抽样构建预测模型,形成多个决策树,然后依次对对象进行分类,最后将各决策树的分类信息进行汇总,所有预测类别中的众数类别即为随机森林预测出的对象类别,进而使预测准确率大大提高。
随机森林的优点
更高的分类准确率
能够有效处理多元数据集,且不需要进行降维
具有处理大数据的优势
可以应用于具有大量缺失值的数据集中
能够在进行分类的同时度量变量对分类的相对重要性
话不多说,我们进入实战环节:
和上期一样,这次我们的示例数据依旧演示的是,植被群落特征、环境因子变量对地上净初级生产力(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.