0

我想为带有包“rpart”的分类树模型执行 5 倍 CV,在此之前我使用代码将我的数据划分为 5 个子数据集,并且出现 1 个错误:在数据划分步骤期间出现错误,例如:

[]中的错误*tmp*:下标超出范围

我已经google了错误,但仍然无法解决。

我的数据有点大,超过 370,000 行和 13 个预测变量。我的响应变量中有 51 个级别。

> w <- read.csv('D:/R code/animal2.csv',header = T)
> names(w)
[1] "cluster_ward50" "AAT10"          "AAT0"           "ARIDITY"        "VEGETATION"    
[6] "PRECITAT"       "TMAX"           "TMIN"           "PREMAX"         "PREMIN"        
[11] "AMT"            "T_OC"           "ELEMAX"         "ELEMIN"        
> 
> w$cluster_ward50 <- as.factor(w$cluster_ward50)
> w$VEGETATION <- as.factor(w$VEGETATION)
> d <- 1:370827
> dd <- list()
> Z <- 5
> nn <- levels(w$cluster_ward50)
    > KL <- length(nn)
    > for(i in 1:KL)
    +   dd[[i]] <- d[w$cluster_ward50==nn]
> kk<- NULL
> for(i in 1:KL)
+   kk <- c(kk,round(length(dd[[i]])/Z))
> set.seed(1111)
> yy <- list(NULL,NULL,NULL)
> for(i in 1:KL){xx <- list()
+                uu<-dd[[i]]
+                for(j in 1:(Z-1)){xx[[j]] <- sample(uu,kk)
+                                  uu<- setdiff(uu,xx[[j]])}
+                xx[[Z]] <- uu
+                for(k in 1:Z)
+                  yy[[i]][[k]] <- xx[[k]]}
Error in `*tmp*`[] : subscript out of bounds
> mm <- list(NULL,NULL,NULL,NULL,NULL)
> for(i in 1:Z)
+   for(j in 1:KL)
+     mm[[i]] <- c(mm[[i]],yy[[j]][])
Error in yy[[j]] : subscript out of bounds
4

1 回答 1

0
  • 您的错误消息的含义是您以某种方式请求了一个不存在的索引。
    您可以在错误发生后检查循环变量的当前状态。这意味着您可以“事后”检查出错的计算。

  • R 具有为您完成繁琐的交叉验证工作的包,例如cvTools
    cvTools 允许您提供进行建模和计算损失/性能度量的函数。您还需要有一个适当的predict方法(特别是,我认为它需要返回结果结构的第一个元素中的预测数量,但我不确定这一点)。如果您想要其中任何一个,则必须使用自己的分类性能度量。

请阅读此站点上有关模型比较的许多帖子中的一些:要以统计合理的方式进行比较,您需要非常大的测试集。

于 2013-11-12T09:00:18.507 回答