cv.glm变量长度不同

时间:2015-02-05 17:29:34

标签: r glm cross-validation

我试图在线性模型上使用cv.glm,但每次我都会得到错误

Error in model.frame.default(formula = lindata$Y ~ 0 + lindata$HomeAdv +  : 
variable lengths differ (found for 'air-force-falcons')

air-force-falcons是数据集lindata中的第一个变量。当我运行glm时,我没有错误。所有变量都在一个数据集中,并且没有缺失值。

> linearmod5<- glm(lindata$Y ~ 0 + lindata$HomeAdv + ., data=lindata, na.action="na.exclude")
> set.seed(1)
> cv.err.lin=cv.glm(lindata,linearmod5,K=10)
Error in model.frame.default(formula = lindata$Y ~ 0 + lindata$HomeAdv +  : 
variable lengths differ (found for 'air-force-falcons')

我不知道是什么导致了这个错误或解决方案。有任何想法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

导致此错误的原因是指定公式

的方式有误

这将产生错误:

mod <- glm(mtcars$cyl ~ mtcars$mpg + .,
            data = mtcars, na.action = "na.exclude")

cv.glm(mtcars, mod, K=11) #nrow(mtcars) is a multiple of 11

这不是:

mod <- glm(cyl ~ ., data = mtcars)

cv.glm(mtcars, mod, K=11)

这两个:

mod <- glm(cyl ~ + mpg + disp, data = mtcars)

cv.glm(mtcars, mod, K=11)

如果您在mtcars$cyl中指定变量,则此变量的行数等于原始数据集的行数。当您使用cv.glm时,您在K部分中对数据框进行分区,但是当您在重采样数据上重新构建模型时,它会评估data.frame$var形式中指定的具有原始(非分区)长度的变量,具有分区长度的其他(由.指定)。

所以你必须在公式中使用相对变量(没有$)。

关于公式的其他建议:

避免使用指定变量和.混合使用双变量。该点适用于df中所有变量,除了波浪号左侧的变量。

为什么要加零?如果它是试图删除拦截使用-1而不是。但是,在我看来,这是一种不好的做法