1

用户

我正在尝试开发一个本地模型(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]]
}

我不知道如何正确处理查询示例 - 非常感谢 ia 的任何帮助!

最好的祝福,

切加

4

1 回答 1

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, ]etc,加上这个通用约定将在其他建模工具中为您提供很好的服务,其中 R 将期望成为与模型公式中提到的完全相同newdata的数据框。在您的情况下,使用您的代码,这意味着创建一个名称不容易做到的数据框,这是有充分理由的!names x[kni, ]

于 2013-05-07T21:17:48.413 回答