eval(predvars, data, env) 中的错误:在 R pls() 中找不到对象“”

问题描述

我已经看到这个问题出现了很多,但还没有找到满意的解决方案,特别是对于我的情况。

我正在使用 pls() 包在 R 中运行偏最小二乘回归,然后想使用拟合模型对新数据使用 RMSEP() 计算预测的均方根误差。这会引发错误,我相信这是因为我正在对函数进行如下编码:

plsr( Y ~ X[whatever,whatever ] ...

我需要索引 dataframe$X 的特定部分。下面是一个例子:

library(pls)

gasoline <- gasoline

#Split dataframe between training and testing data
set.seed(123)
split <- sample.split(gasoline$octane,SplitRatio = 0.70)

gasoline$train <- split

gas.fit <- plsr(octane ~ NIR[,1:10] + NIR[,20:30],ncomp = 10,data = gasoline[gasoline$train,],validation = "LOO",scale = FALSE,center = TRUE,method = "simpls"
)

#I can use RMSEP() on the fitted model
RMSEP(gas.fit)

#I can use the fitted model to predict octane of my test set
predict(gas.fit,newdata = gasoline[!gasoline$train,])  

#But I cannot get the RMSEP of the test predictions
RMSEP(gas.fit,estimate = "test",])

最后一条命令抛出错误

eval(predvars,data,env) 中的错误:未找到对象“NIR”

我所知道的: 我知道对象“NIR”应该存在,因为我选择将训练和测试数据合并到一个数据帧中。

RMSEP() 函数在样式“plsr(Y ~ X[whatever,whatever ]”的模型上运行良好,只要您不调用 newdata。 predict() 函数在这两种情况下都能正常工作。

我的尝试: Mevik & Wehrens (2007) 坚持我们使用这种格式

plsr( octane ~ NIR,...
data = gasoline
...)

而不是

plsr( gasoline$octane ~ gasoline$NIR,

这更类似于我在示例中所做的,但并不完全相同。尽管如此,我还是尝试了以下调整:

gas.fit <- plsr(octane ~ NIR,data = c(
              gasoline[gasoline$train,]$NIR[,1:10],gasoline[gasoline$train,20:30]
                        ),method = "simpls"
)

但这也不好('envir' 不是长度为 1);这也意味着我还必须包含额外的汽油辛烷值,这进一步违反了长度标准。

我真的很想找到这种方法解决方案,因为我的最终使用目标是将 plsr() 模型包含在该样式的 for() 循环中:

gas.fit <- plsr(octane ~ NIR[,i:(i+20)],

作为移动窗口 PLSR 算法的一部分。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)