2013-08-20 48 views
0

我是R新手,一直试图使用下面的代码(感谢stackoverflow)来交叉验证MARS回归。执行代码时出现错误。在R中使用pls函数进行交叉验证

除了上述问题,还有一种方法可以打印交叉验证的所有结果吗?

如果有人能帮忙,我将不胜感激。

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) 
} 
+0

“当我运行的代码我得到一个错误” - 它可能是有益的张贴什么错误实际上是。在附注 - 你不需要分号来结束你的陈述R – Dason

+0

你提到的方式在你的问题标题中恕我直言,当你实际上做MARS而不是PLS时,相当具有误导性。 – cbeleites

回答

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 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 
+0

完美,这就是我一直在寻找的。 – forecaster

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) 
} 

这纠正错误,虽然我不知道这是否会产生你想要什么。

编辑以获得表的要求,我们可以使用meltreshape2

对于第一result

require(reshape2) 

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

Hugh谢谢发布,实际上我希望以表格格式输出具有观察值,预测值和实际值的输出。您提供的代码不提供此格式的结果。 – forecaster

+0

编辑如何? – Hugh