用户
我正在尝试开发一个本地模型(PLSR),它使用下面的代码通过基于10个最相似样本的模型预测查询样本(不是完整模型,只是其中的一部分)。我试图预测查询样本时遇到困难(倒数第二行)。该模型实际上是预测某些东西,(“prd”)但不是查询样本!
这是我的代码:
require("pls")
set.seed(10000) # generate some sample data
mat <- replicate(100, rnorm(100))
y <- as.matrix(mat[,1], drop=F)
x <- mat[,2:100]
eD <- dist(x, method="euclidean") # create a distance matrix
eDm <- as.matrix(eD)
循环遍历所有100个样本并提取其10个最相似的样本,以便随后进行模型构建和查询样本预测:
for (i in 1:nrow(eDm)) {
kni <- head(order(eDm[,i]),11)[-1] # add 10 most similar samples to kni
pls1 <- plsr(y[kni,] ~ x[kni,], ncomp=5, validation="CV") # run plsr on sel. samples
prd <- predict(pls1, ncomp=5, newdata=x[[i]]) # predict query sample ==> I suspect there is something wrong with this expression: newdata=x[[i]]
}
我无法弄清楚如何正确处理查询示例 - 非常感谢i.a.任何帮助!
致以最诚挚的问候,
Chega
答案 0 :(得分:3)
你会遇到各种各样的疼痛建筑模型。此外x[[i]]
没有按照您的想法行事 - 您需要为这些建模功能提供数据框。在这种情况下,矩阵似乎也很好。
如果我使用的话,我可以使你的所有代码都正常工作:
prd <- predict(pls1, ncomp=5, newdata=x[i, ,drop = FALSE])
给
> predict(pls1, ncomp=5, newdata=x[i,,drop = FALSE])
, , 5 comps
y[kni, ]
[1,] 0.6409897
您在代码中看到的是训练数据的拟合值。
> fitted(pls1)[, , 5, drop = FALSE]
, , 5 comps
y[kni, ]
1 0.1443274
2 0.2706769
3 1.1407780
4 -0.2345429
5 -1.0468221
6 2.1353091
7 0.8267103
8 3.3242296
9 -0.5016016
10 0.6781804
如果您不提供newdata
或者您提供的对象没有意义并且不包含生成预测所需的协变量,则这是R中的约定。
我会按照以下方式拟合模型:
pls1 <- plsr(y ~ x, ncomp=5, validation="CV", subset = kni)
我将subset
参数用于其预期目的;选择输入数据的行以适合模型。你可以从模型中获得更好的输出;标签使用y
而非y[kni, ]
等,此常规约定将在其他建模工具中很好地为您提供服务,其中R期望newdata
成为names
的数据框完全与模型公式中提到的相同。在您的情况下,使用您的代码,这意味着创建一个名称为x[kni, ]
的数据框,这是不容易做到的,这是有充分理由的!