在GPT&实验记录|变量重要值计算PLS VIP和RF对比分析这个推文的基础上,我又一次研究了PLSR,下面是结合ChatGPT做的一些更新内容。
PLSR绘图并标注Importance数值
在顶部标注 Importance
数值,可以在 geom_col
基础上添加 geom_text
,并使用 hjust
和 coord_flip
的方向一致,使数值排列方向正确。以下是更新后的代码:
修改代码:
# 加载必要的包
library(ggplot2)
library(forcats)
# 创建示例数据
vip_resultdata <- tibble::tibble(
Variable = c("Pw", "NO3", "Nw", "NH4", "WH", "BOD", "KMnO4", "PH", "WT", "DO"),
Importance = c(34.5, 23.6, 2.01, 1.79, 1.22, 0.462, 0.38, 0.375, 0.116, 0.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 轴
代码解释:
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"
)
代码解释:
**
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
函数的参数(如 tol
或 maxit
),确保模型训练过程具有确定性。
总结
为了避免多次运行结果不一致,可以:
设置随机种子( set.seed()
)。检查是否有随机初始化过程并控制随机性。 对数据进行标准化,减少数值误差。
通过这些方法,PLSR 的结果通常可以实现重复性。