在R中使用pls函数进行交叉验证

时间:2013-08-20 01:01:17

标签: r validation cross-validation

我是R的新手并且一直在尝试使用以下代码(感谢stackoverflow)来交叉验证MARS回归。我执行代码时遇到错误。

除上述问题外,还有办法打印交叉验证的所有结果吗?

如果有人能提供帮助,我将不胜感激。

library(earth)
library(pls)

set.seed(1)

k <- 10;
result <- 0;
folds <- cvsegments(nrow(trees), k);

for (fold in 1 : k){
  currentFold <- folds[fold][[1]];
  fit = earth(Volume ~ ., data=trees[-currentFold,])
  pred = predict(fit, trees[currentFold,]);
  result <- result + table(true=trees[currentFold,3], pred=pred)
}

2 个答案:

答案 0 :(得分:0)

收集折叠每次迭代结果的方法是使用列表:

library(earth)
library(pls)

set.seed(1)

k <- 10;
resulti <- 0
result <- vector("list", k);
folds <- cvsegments(nrow(trees), k);

for (fold in 1 : k){
  currentFold <- folds[fold][[1]];
  fit = earth(Volume ~ ., data=trees[-currentFold,])
  pred = predict(fit, trees[currentFold,]);
  result[[fold]] <- resulti + table(true=trees[currentFold,3], pred=pred)
}

这可以纠正错误,但我不确定这是否会产生你想要的东西。

修改以获取所请求的表格,我们可以在melt中使用reshape2

对于第一个result

require(reshape2)

df.1 <- melt(result[[1]])
df.1[df.1$value == 1, ]

答案 1 :(得分:0)

由于k-fold交叉验证在每次运行中每个案例(行)只能得到一个预测,因此您可以轻松地在向量中收集预测(或矩阵,以获得更多迭代/重复和/或每个案例的多个预测值):

library(earth)
library(pls)
set.seed(1)

k <- 10;
folds <- cvsegments(nrow(trees), k);
result <- rep (NA, nrow (trees))

for (fold in 1 : k){
  currentFold <- folds[[fold]]
  fit = earth(Volume ~ ., data=trees[-currentFold,])
  result [currentFold] <- predict(fit, trees[currentFold,]);
}

然后,您可以随意查看结果:

> plot (trees$Volume, result)  

cv-results calibration plot

> head (cbind (trees, pred.Vol = result))
  Girth Height Volume  pred.Vol
1   8.3     70   10.3  9.701729
2   8.6     65   10.3 10.627089
3   8.8     63   10.2 10.737521
4  10.5     72   16.4 16.313330
5  10.7     81   18.8 21.297516
6  10.8     83   19.7 22.408600