问题描述
我已经看到这个问题出现了很多,但还没有找到满意的解决方案,特别是对于我的情况。
我正在使用 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 (将#修改为@)