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

具有标准估计误差的线性回归的R-k倍交叉验证,r,linear-regression,cross-validation,r-caret,standard-error,R,Linear Regression,Cross Validation,R Caret,Standard Error,我想在R中对线性回归模型执行k倍交叉验证,并测试一个标准误差规则: 因此,我需要一个函数,该函数将返回预测误差的交叉验证估计值和该估计值的标准误差(或者至少是每倍的MSE,以便我自己计算标准误差)。许多软件包都有计算交叉验证误差的函数(例如,boost软件包中的cv.glm),但它们通常只返回预测误差的cv估计值,而不返回其标准误差,或返回每个折叠的MSE 我尝试使用包DAAG,它的函数CVlm应该比cv.glm提供更丰富的输出。然而,我似乎无法让它工作!这是我的密码: a=c(0.0056,

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

因此,我需要一个函数,该函数将返回预测误差的交叉验证估计值和该估计值的标准误差(或者至少是每倍的MSE,以便我自己计算标准误差)。许多软件包都有计算交叉验证误差的函数(例如,
boost
软件包中的
cv.glm
),但它们通常只返回预测误差的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
y
变量


我很乐意接受其他软件包的解决方案(例如
caret
)。另外,如果我能为k-折叠交叉验证指定一些重复,那就太好了。谢谢

CVlm
不喜欢公式中的
poly(x,2)
。通过将
poly(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))

dataset2平均MSE存储为模型对象的属性。

attributes(CV.list)$ms
为您提供所需信息

插入符号
训练
功能不是设计用来做这件事的。@topepo,哇!您是
caret
的github存储库的所有者,是吗?那么我就没有希望通过使用插入符号来解决这个问题了。真遗憾!你知道有没有其他软件包可以帮助我实现one SE规则?顺便问一下,你对DAAG的CVlm抛出的错误有什么建议吗?没有人?甚至没有帮助我理解为什么
DAAG
代码不起作用(谢谢!这就对了。我看到CVlm打印出来,可以为每个折叠筛选MSE,这是我一直在寻找的。但它实际上只是将其打印到屏幕上!它不会将其作为向量返回。你知道我如何将其存储在变量中吗?除了我当前的“粗野”滚动-屏幕-上下-复制-每个-值-创建-向量之外。@DeltaIV现在查看它
# 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)