偏最小二乘回归PLSR计算重要值的一些问题

学术   2024-12-12 15:36   云南  

GPT&实验记录|变量重要值计算PLS VIP和RF对比分析这个推文的基础上,我又一次研究了PLSR,下面是结合ChatGPT做的一些更新内容。

PLSR绘图并标注Importance数值

在顶部标注 Importance 数值,可以在 geom_col 基础上添加 geom_text,并使用 hjustcoord_flip 的方向一致,使数值排列方向正确。以下是更新后的代码:

修改代码:

# 加载必要的包
library(ggplot2)
library(forcats)

# 创建示例数据
vip_resultdata <- tibble::tibble(
  Variable = c("Pw""NO3""Nw""NH4""WH""BOD""KMnO4""PH""WT""DO"),
  Importance = c(34.523.62.011.791.220.4620.380.3750.1160.0623)
)

# 绘制直方图并标注数值
ggplot(vip_resultdata, aes(x = fct_reorder(Variable, Importance), y = Importance)) +
  geom_col(fill = "steelblue") +  # 使用 geom_col 绘制柱状图
  geom_text(
    aes(label = round(Importance, 2)),  # 添加数值标签并四舍五入到两位小数
    hjust = -0.2,  # 调整水平对齐方式
    color = "black",
    size = 3
  ) +
  labs(
    title = "PLSR Importance Plot",
    x = "Variable",
    y = "Importance"
  ) +
  theme_minimal() +  # 使用简洁主题
  coord_flip()  # 交换 X 和 Y 轴

代码解释:

  1. geom_text(aes(label = round(Importance, 2)), hjust = -0.2):
  • label = round(Importance, 2):将 Importance 显示为两位小数。
  • hjust = -0.2:调整数值的位置,确保与柱状图的方向一致。
  • coord_flip():
    • X 和 Y 轴已经交换,因此数值标签也会保持同方向。

    效果:

    • 数值会显示在柱状图顶部,按照柱状图的方向正确排列,与直方图一致。

    给PLSR指定一个变量的响应变量

    要让 Pn 用一个变量动态替代,可以使用公式接口中的 .data[[variable]] 语法,该语法允许将列名变量化。以下是修改后的代码:

    修改后的代码:

    # 定义变量
    response_var <- colnames(plsr_vegdata[1])

    # 构建偏最小二乘回归模型
    plsr_model <- plsr(
      formula = as.formula(paste(response_var, "~ .")),
      data = plsr_vegdata,
      validation = "CV"
    )

    代码解释:

    1. **response_var <- colnames(plsr_vegdata[1])**:

    • 动态获取列名并存储到变量 response_var 中。
  • **as.formula(paste(response_var, "~ ."))**:

    • 使用 paste 函数将变量构建为公式字符串,例如 "Pn ~ ."
    • as.formula 将字符串转换为公式对象,供 plsr 使用。
  • **validation = "CV"**:

    • 保留交叉验证配置不变。

    这样,response_var 变量可以动态替代固定的 Pn,提高代码的通用性。

    为什么同样的数据,plsr计算每次得到的结果数值不一致

    偏最小二乘回归(PLSR)计算结果可能在多次运行中出现不一致,主要原因可能包括以下几个方面:


    1. 随机性来源于交叉验证

    • 如果在 plsr 中设置了 validation = "CV"(交叉验证),交叉验证的子集划分可能带有随机性。
    • 每次运行可能会生成不同的训练集和验证集,从而导致模型参数和预测结果略有差异。

    解决方法:设置随机种子以确保交叉验证的划分一致:

    set.seed(123)  # 确保结果可重复
    plsr_model <- plsr(formula, data = dataset, validation = "CV")

    2. 数值计算中的随机性

    • 某些 PLSR 的数值优化算法可能涉及初始参数的随机性,特别是当数据规模较大或复杂时。
    • 这种随机性可能导致每次运行的结果略有不同。

    解决方法:如果 plsr 的实现使用了随机初始化,可以查看相关文档是否支持设置随机种子。


    3. 数据中的浮点数精度问题

    • 数据的浮点数精度可能导致极小的数值差异,特别是在处理高维数据时。
    • 不同运行环境(例如不同版本的 R、不同平台)可能加剧这种问题。

    解决方法:确保数据没有多余的小数精度,必要时对数据进行标准化处理:

    plsr_data <- scale(plsr_data)  # 数据标准化

    4. PLSR 模型的特性

    • PLSR 本身是一种多元统计方法,可能受到特定算法实现的影响。
    • 特别是在计算权重向量时,算法的迭代顺序或收敛准则可能导致微小差异。

    解决方法:检查 plsr 函数的参数(如 tolmaxit),确保模型训练过程具有确定性。


    总结

    为了避免多次运行结果不一致,可以:

    1. 设置随机种子(set.seed())。
    2. 检查是否有随机初始化过程并控制随机性。
    3. 对数据进行标准化,减少数值误差。

    通过这些方法,PLSR 的结果通常可以实现重复性。

    走天涯徐小洋地理数据科学
    一个爱生活的地理土博,分享GIS、遥感、空间分析、R语言、景观生态等地理数据科学实操教程、经典文献、数据资源
     最新文章