2017-01-19 33 views
0

我使用Leaps包中的10倍交叉验证和regsubsets函数进行最佳子集选择。我想在拟合我的模型后计算RSS。我不想为这个10倍交叉验证使用任何软件包。我想我们不能使用rgsubsets对象的预测函数。所以我试着用下面的代码来计算我的模型的rss,但是有一个错误。使用k折叠交叉验证获取模型的RSS,而无需在R中使用任何包

 mydata <- Hitters[sample(nrow(Hitters)),] 

     folds <- cut(seq(1, nrow(mydata)), breaks = 10, labels = F) 

     for (i in 1:10) { 

      testindex <- which(folds == i) 
      testdata <- mydata[testindex,] 
      traindata <- mydata[ - testindex,] 

    #there may be an error after this 


      best.fits11 <- regsubsets(Salary ~ ., data = traindata, nvmax=19) 
      test[i]<-coef(best.fits11, id = 19) * testdata 
      train[i]<-traindata 
      } 
    for (i in 1:10) { 
    err.rss <-mean((test[i]-train[i])^2) 
    } 

回答

0

让我们考虑一下你在显示的代码和你写的代码完全一样,当你得到这个错误。

代码中存在一些明显的错误。

  1. 什么是test[i]test[i]
  2. 的尺寸是多少,与train[i]相同。
  3. 考虑到traintest都是相似的矩阵。根据你的语法,我非常怀疑。
  4. 现在正在计算RSS。仅当您将testtrain表示为相同长度的矢量时,该计算才会有效。所以,定义中没有问题。

请详细说明traintest的数据,以便我可以进一步帮助您。

+0

嗨,感谢您的帮助。我正在使用ISLR包中的数据集Hitters。数据集中有20列,其中19个是预测变量,薪水是回答。该算法将运行10次迭代,并且在每次迭代中要计算train [i]和test [i],以便可以计算RSS。我想在每次迭代时使用traindata的估计来评分我的测试数据,但是我的代码测试[i] < - coef(best.fits11,id = 19)* testdata可能是错误的 – abhi