GLM预测报错:newdata行数与变量行数不匹配问题求助
解决GLM预测时newdata维度不匹配的警告问题
我来帮你拆解下这个问题——你遇到的警告核心是变量引用的混淆:你把全量数据的列赋值给了全局变量(g、a、b、c、f),但训练模型时又指定了data=df[f=="01",],这让glm在拟合时出现变量来源冲突,最终导致预测时无法匹配测试集的维度。
问题根源
看你的代码:
g = df$ontime #binary a = df$currency #String b = df$INCOTERMS #String c = df$price #float f = df$month #string mod1 <- glm(g~a+b+c,family=binomial(link="logit"), data=df[f=="01",])
公式g~a+b+c调用的是全局环境里的变量(这些都是全量df的列,共22488行),但data参数又指定只取1月的子集。glm虽然会按data的行索引截取全局变量的对应行来拟合,但模型内部仍会关联全量的全局变量,导致后续用16623行的测试集预测时,模型试图匹配22488行的全局变量,从而抛出警告。
正确解决方法
你需要让模型完全基于子集数据拟合,不要用全局变量,直接用数据框的列名构建公式,同时明确创建训练集和测试集:
# 拆分训练集和测试集 train_df <- df[df$month == "01", ] test_df <- df[df$month %in% c("02", "03", "04"), ] # 直接用子集列名构建模型,无需全局变量 mod1 <- glm(ontime ~ currency + INCOTERMS + price, family = binomial(link = "logit"), data = train_df) # 用测试集执行预测 pred_ontime1 <- predict(mod1, newdata = test_df, type = "response")
这么做的优势:
- 模型完全基于训练集(
train_df)拟合,变量来源清晰,不会和全量数据混淆 - 预测时
newdata明确传入测试集(test_df),维度完全匹配,不会再出现警告
为什么包含训练集就不报错?
当你把训练集加入测试集后,测试集行数等于全量数据的22488行,和全局变量的行数一致,模型检测不到维度差异,但这确实不符合测试集的定义,你的判断是对的。
内容的提问来源于stack exchange,提问作者Christian R. Houen
相关产品推荐
相关产品推荐

