You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:05:08