2013-08-20 46 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