cv.glm 可变长度不同
cv.glm variable lengths differ
我正在尝试 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')
我不知道导致此错误的原因或解决方案。有任何想法吗?谢谢!
导致此错误的原因是您指定公式的方式有误
这将产生错误:
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。但是,我认为这是一种不好的做法
我正在尝试 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')
我不知道导致此错误的原因或解决方案。有任何想法吗?谢谢!
导致此错误的原因是您指定公式的方式有误
这将产生错误:
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。但是,我认为这是一种不好的做法