交叉验证码的问题 - r -

时间:2014-11-15 21:22:04

标签: r logistic-regression cross-validation

我正在编写一个函数来对数据帧的两列执行逻辑回归。我无法解决错误......我正在尝试使用10倍交叉验证。这是我正在使用的代码:

SAdata = read.table("http://statweb.stanford.edu/~tibs/ElemStatLearn/datasets/SAheart.data", 
                     sep=",",head=T,row.names=1)

log.fun = function(x,y) {

    prediction = data.frame()
    tset = data.frame()
    dframe = cbind(x,y)
    dframe = as.data.frame(dframe)
    dframe$fold = sample(1:10, nrow(data), replace = TRUE)
    list = 1:10

    for (i in 1:10) { 

        train = subset(dframe, fold %in% list[-i])
        test = subset(dframe, fold %in% c(i))
        model = glm(x~y, data=train, family=binomial)
        pred = as.data.frame(predict(model, test[,-1]))
        prediction <- rbind(prediction, pred)

    }
}

log.fun(SAdata$chd,SAdata$obesity)

我得到的错误是“sample.int中的错误(长度(x),大小,替换,概率):   无效的“大小”参数“

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这是for循环和特殊建模的次优使用...如果你想尝试一些好的模型开发尝试包'caret'

如果你仍想使用该功能,这是一种解决方法

SAdata = read.table("http://statweb.stanford.edu/~tibs/ElemStatLearn/datasets/SAheart.data",sep=",",head=T,row.names=1)

log.fun=function(x,y){

  prediction = data.frame()
  tset=data.frame()
  dframe=cbind(x,y)
  dframe=as.data.frame(dframe)
  dframe$fold = sample(1:10, nrow(dframe), replace = TRUE)
  list = 1:10

  results <- list()
  for (i in 1:10) {     

    results[[paste0('Fold',i)]]$train <- subset(dframe, fold %in% list[-i])
    results[[paste0('Fold',i)]]$test <- subset(dframe, fold %in% c(i))
    results[[paste0('Fold',i)]]$model <- glm(x~y, data=results[[i]]$train, family=binomial)
    results[[paste0('Fold',i)]]$pred <- as.data.frame(predict(results[[i]]$model, results[[i]]$test[,-1]))
    results[[paste0('Fold',i)]]$prediction <- rbind(prediction, results[[i]]$pred)

}
results}


your_results<-log.fun(SAdata$chd,SAdata$obesity)

head(your_results$Fold1$prediction)

事实上,你在函数'sample'中遇到了一些问题,因为你指定'data'并且该对象不存在...我将它替换为dframe并为结果的每个部分添加了一些名称。

希望有所帮助