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.
相关产品推荐
相关产品推荐

