代码之家  ›  专栏  ›  技术社区  ›  DeltaIV

具有标准估计误差的线性回归的R-k倍交叉验证

  •  4
  • DeltaIV  · 技术社区  · 9 年前

    我想在R中对线性回归模型进行k倍交叉验证,并测试一个标准误差规则:

    https://stats.stackexchange.com/questions/17904/one-standard-error-rule-for-variable-selection

    因此,我需要一个函数来返回预测误差的交叉验证估计 该估计值的标准误差(或至少每个倍数的MSE,以便我自己计算标准误差)。许多包具有计算交叉验证错误的函数(例如, cv.glm boost 包),但通常它们只返回预测误差的CV估计,而不返回其标准误差或每个倍数的MSE。

    我试过使用软件包 DAAG ,其功能 CVlm 应该比 cv.glm 。然而,我似乎做不到!这是我的代码:

    a=c(0.0056, 0.0088, 0.0148, 0.0247, 0.0392, 0.0556, 0.0632, 0.0686, 0.0786, 0.0855, 0.0937)
    b=c(6.0813, 9.5011, 15.5194, 23.9409, 32.8492, 40.8399, 43.8760, 45.5270, 46.7668, 46.1587, 43.4524)
    dataset=data.frame(x=a,y=b)
    CV.list=CVlm(df=dataset,form.lm = formula(y ~ poly(x,2)), m=5)
    

    我得到了几乎没有信息的错误

    Error in xy.coords(x, y, xlabel, ylabel, log) : 
    'x' and 'y' lengths differ 
    

    这对我来说没什么意义。 x y 相同的长度(11),所以很明显,函数在抱怨其他函数 x(x) , y 它在内部创建的变量。

    我很乐意接受其他软件包的解决方案(例如 caret ). 此外,如果我能指定k倍交叉验证的重复次数,那就太好了。

    2 回复  |  直到 3 年前
        1
  •  4
  •   cmbarbu    9 年前

    CVlm 不喜欢 poly(x,2) 在您的公式中。您可以通过添加 聚(x,2) 首先在数据表中调用 CVlm公司 关于这些新变量:

    dataset2 <- cbind(dataset,poly(dataset$x,2))
    names(dataset2)[3:4] <- c("p1","p2")
    CV.list=CVlm(df=dataset2,form.lm = formula(y ~ p1+p2))
    

    由于您对打印的值感兴趣,但遗憾的是这些值没有保存在任何地方,因此您可以使用以下内容:

    # captures the printed output
    printOut <- capture.output(CV.list=CVlm(df=dataset2,form.lm = formula(y ~ p1+p2)))
    
    # function to parse the output 
    # to be adapted if necessary for your needs
    GetValues <- function(itemName,printOut){
        line <- printOut[grep(itemName,printOut)]
        items <- unlist(strsplit(line,"[=]|  +"))
        itemsMat <- matrix(items,ncol=2,byrow=TRUE)
        vectVals <- as.numeric(itemsMat[grep(itemName,itemsMat[,1]),2])
        return(vectVals)
    }
    
    # get the Mean square values as a vector
    MS <- GetValues("Mean square",printOut)
    
        2
  •  1
  •   Robin Donatello    8 年前

    平均MSE被存储为模型对象的属性。 attributes(CV.list)$ms 给你你想要的。