当前位置: 首页 > news >正文

R语言随机森林分析显示R方和P值

最近在做一个因子的驱动力分析。我参考了相关文献,写了个函数,希望能帮助到大家。

library(ggplot2)
library(tidyverse)
library(randomForest)
library(devtools)
library(rfUtilities)
library(rfPermute)
library(forcats)rfCalulate2 <- function(data_excel,dep_var,formulaTXT,imagename){# 定义变量名映射表 - 在这里自定义变量显示名称var_name_mapping <- c("npp00_23" = "NPP","FVC00_23" = "植被覆盖度","GDP00_23" = "GDP","pop00_23" = "人口","tem00_23" = "温度","pre00_23" = "降雨",#"wind00_23" = "风速","forest00_23" = "森林面积","nature00_23" = "自然生境面积","wetland00_23" = "湿地面积","csh00_23" = "城市化率","TGDP00_23" = "旅游收入","Tpop00_23" = "旅游人口","WZL00_23" = "农业产品","WZC00_23" = "林产品", "WZM00_23" = "牧产品","WZY00_23" = "渔产品","WZS00_23" = "生态能源","WZW00_23" = "水资源")# 定义因变量显示名称dep_var_names <- c("GEP00_23" = "Gross Ecosystem Product","TJ00_23" = "调节服务", "WH00_23" = "文化服务","WZ00_23" = "物质供给")mydata <- read_xlsx(data_excel) %>% # 读取Excel数据#select(4:30) %>%# 获取前八列作为分析变量#log1p() %>%  # 对数变换 有负数的话就会存在nodata值na.omit() %>%  # 移除缺失值as.data.frame()  # 转换为数据框# 打印NaNs值的行mydata <- as.data.frame(mydata)set.seed(123)# for i in ["TJ00_23", "WH00_23", "WZ00_23", "GEP00_23"]:#   print(i)formula_str <- paste(dep_var, formulaTXT)#+ wind00_23 + csh00_23treat_rf <- randomForest(as.formula(formula_str), data = mydata, importance = TRUE, proximity = TRUE)# 置换检验显著性set.seed(123)treat_perm <- rf.significance(treat_rf, mydata, nperm = 99, ntree = 500)treat_perm# 检查 treat_perm 的结构,提取 p-valuep_value <- as.numeric(treat_perm$pValue) # 如果出错,请用 `str(treat_perm)` 确认字段名# 如果 p-value 提取失败,提示检查数据结构if (is.na(p_value)) {  stop("Unable to extract or convert p-value. Check treat_perm structure.")}# 提取模型的 R-squaredr_squared <- round(treat_rf$rsq[500], 4)# 变量重要性分析并转换数据set.seed(123)ANPP_rfP <- rfPermute(as.formula(formula_str), data = mydata, ntree = 500, na.action = na.omit, nrep = 100, num.cores = 1)ANPP_dat <- importance(ANPP_rfP, sort.by = NULL, decreasing = TRUE)# 数据转换并添加显著性标记plot_data <- ANPP_dat %>%  as_tibble(rownames = "names") %>%  data.frame() %>%  mutate(    label = if_else(X.IncMSE.pval < 0.001, "***",                    if_else(X.IncMSE.pval < 0.01, "**",                            if_else(X.IncMSE.pval < 0.05, "*", "ns"))),    X.IncMSE = as.numeric(X.IncMSE),    group = if_else(label == "ns", "Non-Significant", "Significant")  ) %>%  arrange(X.IncMSE) %>% # 按 X.IncMSE 值升序排序  mutate(names = factor(names, levels = names)) # 确保因子水平顺序为升序# 自定义颜色custom_colors <- c("Non-Significant" = "#FD7D6D", "Significant" = "#008CB7")# 应用变量名重命名plot_data <- plot_data %>%mutate(display_names = ifelse(names %in% names(var_name_mapping), var_name_mapping[as.character(names)], as.character(names)),display_names = factor(display_names, levels = unique(display_names)))# 自定义颜色custom_colors <- c("Non-Significant" = "#FD7D6D", "Significant" = "#008CB7")# 获取因变量显示名称dep_display_name <- ifelse(dep_var %in% names(dep_var_names), dep_var_names[dep_var], dep_var)  # 绘图p <- ggplot(plot_data, aes(x = display_names, y = X.IncMSE, fill = group)) +  geom_bar(stat = "identity") +  scale_fill_manual(values = custom_colors) +  geom_text(aes(y = X.IncMSE + 1, label = label), hjust = 0, size = 3) +  labs(x = "", y = "%IncMSE", fill = "Significance",title = paste("Variable Importance for", dep_display_name)) +  coord_flip() +  theme_bw() +  theme(legend.position = "right") +  # 在右下角添加注释  annotate("text", x = 1, y = max(plot_data$X.IncMSE) * 0.5, hjust = 0, label=paste0("p-value:",round(p_value,4),"\nR-squared:",r_squared))# 保存图形(可选)ggsave(imagename, p, width = 12, height = 9, dpi = 300)#print(p)

运行的代码。

data_excel<- "change_analysis.xlsx"
dep_var <- "WZ00_23"
formulaTXT <- "~  tem00_23 +  wetland00_23 + csh00_23 + TGDP00_23 + Tpop00_23 + WZL00_23 + WZC00_23 + WZM00_23 + WZY00_23 + WZS00_23 + WZW00_23"rfCalulate2(data_excel,dep_var,formulaTXT,imagename="image/变化-WZ00_23.png")

目前这个存在的问题

1.目前这个模型还存在一个问题,就是这个模型有些因子加进去可能是增加其均方差的,删除其后其的排序又会有所变化。
2.另外,就是当调整变量顺序的时候,其影响因子的排序和效果也会发生改变。

参考文献
https://mp.weixin.qq.com/s/aKk_DXczV4MtBg9we_PVBQ

http://www.dtcms.com/a/520243.html

相关文章:

  • 《Python爬虫 + 飞书自动化上传》全流程详细讲解
  • ELK——logstash
  • 图像进行拼接-后进行ocr检测识别
  • 登封网站设计wordpress终极简码
  • 网站服务器关闭建设网站需要的安全设备
  • STM32 RS422异步UART通信测试全方案C++软件开发,嵌入式软件开发,Linux
  • Qt笔记:的初次使用Qt-Advanced-Docking-System
  • 基于PyTorch和CuPy的GPU并行化遗传算法实现
  • Apollo Canbus模块技术深度解析
  • DeepSeek-OCR 嵌入dify工作流
  • Linux小课堂: Vim与Emacs之Linux文本编辑器的双雄格局及Vim安装启动详解
  • 江宁外贸网站建设国内付费代理ip哪个好
  • 多种大连网站建设景观设计公司理念
  • KP201FLGA电机驱动电源方案SOT23-6恒压恒流恒功率电路原理图分析
  • Hadoop报错 Couldn‘t find datanode to read file from. Forbidden
  • 【案例实战】HarmonyOS分布式购物车:多设备无缝协同的电商体验
  • OpenCV工程中直接包含调用vs2022
  • 怎么看一个网站用什么做的北京建设公司有哪些
  • 上海交大刘鹏飞:智能不在于数据堆砌,78个样本训练出超强Agent,数据效率提升128倍
  • SpringAI1-快速⼊⻔
  • 本地局域网邮件管理系统:从原理到实现的完整指南
  • 面向小样本蜂窝网络故障诊断的模型与知识互增强方法
  • 上海网站推广方法河北石家庄属于几线城市
  • 专业购物网站建设哪家好免费找客户网站
  • 受欢迎的网站开发php源码搭建网站流程
  • 第八章 排序——课后习题解练【数据结构(c语言版 第2版)】
  • 如果有大量的key需要设置同一时间过期,一般需要注意什么?
  • 【nvidia-GB200】(2) 18 台 GB200 服务器集群 NCCL All-to-All 性能深度测评:72 张 GPU 多对多通信的效率与潜力
  • MYSQL数据库--基本练习
  • Harbor VS Hadess,开源制品管理工具一文详细对比分析