跟着NC学分析-随机森林模型分析

科技   2024-10-23 09:02   陕西  

欢迎关注R语言数据分析指南

本节分享nature communications论文中的随机森林模型分析,论文提供了该分析的数据及代码,均能正常运行。小编根据个人对数据的理解来稍作解读仅供参考,具体的内容请参考论文中的详细介绍。

论文

Prophage-encoded antibiotic resistance genes are enriched in human-impacted environments

论文数据代码

https://zenodo.org/records/13301199

下载数据文件夹解压缩后,RF script内即为该分析相关的数据+代码。

结果图

该分析通过主成分分析(PCA)对与人类活动相关的变量进行降维,根据Kaiser-Guttman准则(特征值大于1)选取了13个主要的主成分。随后,利用随机森林模型评估这些主成分对细菌抗生素抗性基因(ARGs)总丰度的影响,以量化人类活动对ARGs地理分布的影响程度。模型使用R的randomForest和rfPermute包构建,随机种子设为123,初始参数通过将70%的数据用于训练、30%用于验证进行优化。最终模型在所有数据上构建,参数设定为importance=TRUE、ntree=500、nrep=1000,并通过1000次置换检验评估模型的显著性和交叉验证的R²值。结果显示,人类活动相关的主成分对ARGs的分布具有显著影响。

数据整理

library(vegan)  # 加载vegan包,用于生态学和多元统计分析
library(ggplot2)  # 加载ggplot2包,用于数据可视化
library(RColorBrewer)  # 加载RColorBrewer包,提供颜色调色板
library(tidyverse)  # 加载tidyverse包,包含数据处理和可视化工具集

# 读取数据文件,指定分隔符为制表符(\t),首行为列名
data_pca <- read.delim("HH.bacteria_ARG_RF.txt", sep = "\t", header = TRUE)

# 划分数据集
set.seed(123)  # 设置随机种子,保证结果可重复
sample_indices <- sample(1:nrow(data_pca), nrow(data_pca) * 0.3)  # 从数据集中随机抽取30%的行索引作为测试集
test_data <- data_pca[sample_indices, ]  # 根据索引提取测试集数据
train_data <- data_pca[-sample_indices, ]  # 剩余的数据作为训练集

使用随机森林模型预测HH.ARG变量

library(randomForest)  # 加载randomForest包,用于构建随机森林模型
rf_model <- randomForest(
  HH.ARG ~ .,  # 公式,表示以HH.ARG为因变量,其他所有变量为自变量
  data = train_data,  # 指定训练数据集
  ntree = 500,  # 设置随机森林中决策树的数量为500
  importance = TRUE  # 计算变量的重要性
)  
rf_model  # 输出模型的摘要信息

# 使用测试集进行预测
predictions <- predict(rf_model, newdata = test_data)  # 基于模型对测试集数据进行预测

# 评估模型性能
mse <- mean((predictions - test_data$HH.ARG)^2)  # 计算预测值与实际值之间的均方误差(MSE)
r_squared <- 1 - mse / var(test_data$HH.ARG)  # 计算决定系数R²,表示模型的解释能力
print(paste("Mean Squared Error (MSE): ", mse)) # 输出MSE值
print(paste("R-squared (R^2): ", r_squared))  # 输出R²值

进行变量重要性分析

library(rfPermute)  # 加载rfPermute包,用于评估变量重要性的显著性

# 使用rfPermute函数重新进行随机森林分析,并计算变量重要性的p值
set.seed(123)  # 设置随机种子
factor_rfP <- rfPermute(
  HH.ARG ~ .,  # 公式,与之前相同
  data = data_pca,  # 使用完整的数据集
  ntree = 500,  # 设置决策树数量为500
  importance = TRUE,  # 计算变量的重要性
  nrep = 1000,  # 设置置换的重复次数为1000次,以计算p值
  num.cores = 6  # 使用6个CPU核心进行并行计算,提高计算效率
)
factor_rfP  # 输出rfPermute分析结果

# 提取变量的重要性得分并标准化
importance_factor.scale <- data.frame(
  importance(factor_rfP, scale = TRUE),  # 提取并标准化变量的重要性
  check.names = FALSE  # 防止R修改列名
)
importance_factor.scale  # 显示变量的重要性得分

# 提取变量的重要性得分的显著性p值
importance_factor.scale.pval <- factor_rfP$pval[ , , 2]  # 获取p值矩阵的第二层,即%IncMSE的p值
importance_factor.scale.pval  # 显示变量的重要性p值

# 按照%IncMSE(均方误差增加的百分比)对变量进行降序排序
importance_factor.scale <- importance_factor.scale[order(importance_factor.scale$'%IncMSE', decreasing = TRUE), ]
importance_factor.scale  # 显示排序后的变量重要性得分

绘制变量的重要性柱状图

# 添加变量名称列,方便绘图时使用
importance_factor.scale$OTU_name <- rownames(importance_factor.scale)
# 将变量名称设置为因子,并按照排序后的顺序
importance_factor.scale$OTU_name <- factor(importance_factor.scale$OTU_name, levels = importance_factor.scale$OTU_name)

p <- ggplot() + geom_col(
    data = importance_factor.scale,
    aes(x = reorder(OTU_name, `%IncMSE`),  # 变量名称,按照%IncMSE排序
        y = `%IncMSE`,  # y轴为%IncMSE值
        fill = `%IncMSE`),colour = 'black',width = 0.8) +
  coord_flip() +  # 翻转坐标轴,使x轴为纵轴
  scale_fill_gradientn(
    colors = c(
      low = brewer.pal(5"Blues")[2],  # 低值对应的颜色
      mid = brewer.pal(5"YlGnBu")[1],  # 中间值对应的颜色
      high = brewer.pal(6"OrRd")[4]  # 高值对应的颜色
    ),
    values = scales::rescale(c(01550)),  # 定义颜色渐变的中断点
    guide = FALSE,  # 不显示图例
    aesthetics = "fill"  # 应用于填充颜色
  ) +
  labs(
    title = NULL,  # 不设置标题
    x = NULL,  # x轴标签为空
    y = 'MSE增加百分比 (%)',  # y轴标签
    fill = NULL  # 填充颜色图例标签为空
  ) +
  theme_test() +  # 使用内置的测试主题
  theme(
    panel.grid = element_blank(),  # 去除网格线
    panel.background = element_blank(),  # 去除背景
    axis.line = element_line(colour = 'black')  # 设置坐标轴线为黑色
  ) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +  # x轴文本旋转90度,右对齐
  scale_y_continuous(
    expand = c(00),  # y轴从0开始,无额外扩展
    limit = c(078)  # 设置y轴的范围为0到78
  )
p  

# 标注变量的显著性信息
for (OTU in rownames(importance_factor.scale)) {
  # 获取对应变量的p值
  importance_factor.scale[OTU, '%IncMSE.pval'] <- importance_factor.scale.pval[OTU, '%IncMSE']
  # 根据p值设置显著性符号
  if (importance_factor.scale[OTU, '%IncMSE.pval'] >= 0.05) {
    importance_factor.scale[OTU, '%IncMSE.sig'] <- ''  # 不显著,空白
  } else if (importance_factor.scale[OTU, '%IncMSE.pval'] >= 0.01 & importance_factor.scale[OTU, '%IncMSE.pval'] < 0.05) {
    importance_factor.scale[OTU, '%IncMSE.sig'] <- '*'  # p < 0.05,标记为*
  } else if (importance_factor.scale[OTU, '%IncMSE.pval'] >= 0.001 & importance_factor.scale[OTU, '%IncMSE.pval'] < 0.01) {
    importance_factor.scale[OTU, '%IncMSE.sig'] <- '**'  # p < 0.01,标记为**
  } else if (importance_factor.scale[OTU, '%IncMSE.pval'] < 0.001) {
    importance_factor.scale[OTU, '%IncMSE.sig'] <- '***'  # p < 0.001,标记为***
  }
}

# 在图中添加显著性标注和%IncMSE值
p <- p +
  annotate(
    "text",
    x = importance_factor.scale$OTU_name,  # 变量名称
    y = importance_factor.scale$`%IncMSE`,  # %IncMSE值
    label = sprintf("%.2f%% %s", importance_factor.scale$`%IncMSE`, importance_factor.scale$`%IncMSE.sig`),  # 显示数值和显著性符号
    hjust = -0.2,  # 水平偏移,使文本靠右一些
    size = 3  # 字体大小
  )
p  

使用A3包评估模型的整体p值

该步骤非常耗费运行资源

library(A3)  # 加载A3包,用于模型的p值计算
# 使用a3函数计算模型的整体p值
set.seed(123)  # 设置随机种子
factor_forest.pval <- a3(
  HH.ARG ~ .,  # 模型公式
  data = data_pca,  # 数据集
  model.fn = randomForest,  # 指定模型函数为randomForest
  p.acc = 0.001,  # p值计算的精度,越小计算次数越多
  model.args = list(
    importance = TRUE,  # 计算变量的重要性
    ntree = 500  # 决策树数量为500
  )
)
factor_forest.pval  # 输出模型p值结果
model.out <- as.data.frame(factor_forest.pval$table)  # 提取结果表格
p.value <- as.numeric(gsub("<""", model.out[1"p value"]))  # 获取模型的p值,并去除可能的"<"符号

# 在图形上添加模型的R²值和p值注释
p <- p +
  annotate('text',
    label = 'Bacterial ARGs',  # 模型名称或标题
    x = 3,  # x轴位置
    y = 40,  # y轴位置
    size = 3  # 字体大小
  ) +
  annotate(
    'text',
    label = sprintf('italic(R^2) == %.2f', mean(factor_rfP[["rf"]][["rsq"]])),  # 显示平均R²值
    x = 2.5,  # x轴位置
    y = 40,  # y轴位置
    size = 3,
    parse = TRUE  # 解析数学表达式
  ) +
  annotate(
    'text',
    label = sprintf('italic(P) < %.3f', p.value),  # 显示模型的p值
    x = 2,  # x轴位置
    y = 40,  # y轴位置
    size = 3,
    parse = TRUE  # 解析数学表达式
  )
p

关注下方公众号下回更新不迷路

购买介绍

本节介绍到此结束,有需要学习R数据可视化的朋友欢迎到淘宝店铺:R语言数据分析指南,购买小编的R语言可视化文档(2024版),购买将赠送2023年的绘图文档内容。目前此文档(2023+2024)已经更新上传200案例文档,每个案例都附有相应的数据和代码,并配有对应的注释文档,方便大家学习和参考。

2024更新的绘图内容将同时包含数据+代码+注释文档+文档清单,2023无目录仅有数据文件夹,小编只分享案例文档,不额外回答问题,无答疑服务,零基础不推荐买。

案例特点

所选案例图均属于个性化分析图表完全适用于论文发表,内容异常丰富两年累计发布案例图200+,2024年6月起提供html版注释文档更加直观易学。文档累计上千人次购买拥有良好的社群交流体验。R代码结构清晰易懂,为防止中文乱码提供单独的注释文档

R代码结构清晰易懂,为防止中文乱码2024年6月起提供单独html注释文档

群友精彩评论

淘宝店铺

2024年已更新案例图展示


R语言数据分析指南
R语言重症爱好者,喜欢绘制各种精美的图表,喜欢的小伙伴可以关注我,跟我一起学习
 最新文章