r - cv.glm 变量长度不同

标签 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')

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

最佳答案

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

这将产生错误:

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形式指定的变量code> 具有原始(未分区)长度,其他(由 . 指定)具有分区长度。

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

有关公式的其他建议:

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

为什么要加个零?如果它试图删除拦截,则使用 -1 代替。然而,我认为这是一个不好的做法

关于r - cv.glm 变量长度不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28350357/

相关文章:

r - 计算R中具有不同原点和范围的2个栅格层之间的重叠区域

r - Emmeans 连续自变量

python - 得分为 ='roc_auc' 的 cross_val_score 和 roc_auc_score 有什么区别?

r - 如何获取特定名称的行索引号?

R:填充列直到末尾并从头继续

r - 如何拟合Skellam回归?

machine-learning - 随机森林的交叉验证

python - 用于交叉验证的附加拟合参数

r - 随机变量的生成

modeling - 如何将多个 roc 绘制在一起?