3

这可能是一个愚蠢的问题,但我只是找不到一个包来做到这一点......我知道我可以编写一些代码来获得我想要的东西,但如果有一个自动执行它的功能会很好!

所以基本上我想对 glm 模型进行 k 折交叉验证。我想自动获得每个验证集的预测和实际值。因此,如果我正在做一个 10 倍的 CV,我想要一个函数来返回 10 个验证集以及实际响应和预测。

先感谢您!

4

2 回答 2

14

如评论中所述,caret使交叉验证非常容易。只需使用“glm”方法,如下所示:

> library(caret)
> set.seed(2)
> dat <- data.frame(label=round(runif(100,0,5)),v1=rnorm(100),v2=rnorm(100))
> tc <- trainControl("cv",10,savePred=T)
> (fit <- train(label~.,data=dat,method="glm",trControl=tc,family=poisson(link = "log")))
100 samples
  2 predictors

No pre-processing
Resampling: Cross-Validation (10 fold) 

Summary of sample sizes: 90, 91, 91, 90, 90, 89, ... 

Resampling results

  RMSE  Rsquared  RMSE SD  Rsquared SD
  1.53  0.146     0.131    0.235      


> fit$finalModel$family

Family: poisson 
Link function: log 

> head(fit$pred)
      pred obs rowIndex .parameter Resample
1 2.684367   1        1       none   Fold01
2 2.165246   1       18       none   Fold01
3 2.716165   3       35       none   Fold01
4 2.514789   3       36       none   Fold01
5 2.249137   5       47       none   Fold01
6 2.328514   2       48       none   Fold01
于 2013-08-28T19:56:59.517 回答
2

我建议cv.glm从 package进行调查boot,因为您正在使用 glm 模型。另一种选择是 package cvTools。不过,我发现为 CV 编写自己的函数更有用。听起来您想要一个中途结束的 CV 函数,而我见过的大多数 CV 函数将平均所有验证集的预测误差并仅返回平均值(当然,这是交叉验证的定义)。

于 2013-08-28T20:02:36.793 回答