0

我是 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)
}
4

2 回答 2

0

收集 fold 每次迭代结果的一种方法是使用列表:

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, ]
于 2013-08-20T01:14:56.203 回答
0

因为 k 折交叉验证在每次运行中每个案例(行)准确地得到一个预测,所以您可以轻松地将预测收集在一个向量(或矩阵,用于更多迭代/重复和/或每个案例的多个预测值)中:

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 校准图

> 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
于 2013-08-20T09:06:43.910 回答