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

R语言预测任务滑动窗口切分建模代码报错求解

问题定位

你的代码一共有3处核心错误,直接导致运行报错、输出结果不符合预期:

  • 训练集筛选逻辑错误:使用==做多年份匹配时,R会对长度不一致的向量做循环对齐,不仅无法准确取出t、t+1、t+2三年的训练样本,甚至可能筛出空数据集,触发glm拟合时的Argument mu must be a nonempty numeric vector报错,你看到的"longer object length is not a multiple of shorter object length"警告就是这个问题导致的。多年份匹配应该用*%in%*操作符。
  • predict函数参数错误:predict.glm()指定待预测数据集的参数是newdata,不是data。你写data=df_sub2时函数不会读取你准备的单年测试集,会默认用拟合模型的3行训练集做预测,所以每次都会输出3个预测值,和单年测试集的预期不符。
  • 循环范围与结果存储逻辑错误:你的数据集覆盖2000-2009年,最后一组训练集应该是2006-2008年、对应测试集2009年,原循环写到i=2007时会取i+3=2010年的测试集,数据集中不存在对应年份,会取到空测试集。另外直接用年份值当list索引会导致pred列表前1999个元素全为空,最终列表长度异常。
修正后可运行代码
# 生成模拟数据
set.seed(123)
df <- data.frame(year = 2000:2009,  # 时间跨度10年
                 y = c(1, 1, 1, 1, 0, 0, 1, 0, 0, 0), 
                 var1 = runif(10, min=0, max=1), 
                 var2 = runif(10, min=1, max=2))

# 存储预测结果
pred <- list()
# 循环范围修正为2000-2006,正好生成7组训练测试拆分
for(idx in seq_along(2000:2006)){
  i <- 2000 + idx - 1
  # 用%in%筛选连续3年训练集
  df_train <- subset(df, year %in% c(i, i+1, i+2)) 
  mod <- glm(y~var1+var2, data=df_train, family=binomial())
  # 筛选t+3年测试集
  df_test <- subset(df, year == i+3)
  # 用newdata参数指定测试集,按顺序存结果
  pred[[idx]] <- data.frame(
    year = i+3,
    pred_y = predict(mod, newdata=df_test, type = "response")
  )
}

# 合并所有预测结果
pred_result <- do.call(rbind, pred)
运行结果说明

修正后代码会输出7组预测结果,分别对应2003-2009年的预测值,pred_result长度为7,单年仅返回1个预测值,无运行报错与警告。

内容的提问来源于stack exchange,提问作者Chris T.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 06:12:22