R语言smooth.spline模型predict()无法输出新数据预测值问题
核心错误点
- 时间序列转换参数错误:原始数据时间范围是2020-01至2022-05,转
ts对象时错误设置start = c(2000,1),直接导致时间索引整体偏移20年,Date列从原本的日期类型被强制转成ts内部数值,真实时间信息错乱。 - 预测函数传参错误:
predict.smooth.spline的第二个位置参数为x,接收待预测的自变量取值,你传入的ibex.1=ibex11[270:273]是无效命名参数,会被函数直接忽略,因此仅返回原训练集的拟合值。 - 对象类型混用错误:在
ts对象上直接调用tibble的add_row方法会丢失ts的时间属性,且新加入的Date类型值和ts对象内部的数值型时间格式不统一,无法匹配模型训练时的自变量格式。
修正后可运行代码
不需要强制把数据转成ts格式,smooth.spline接收数值型向量输入即可,统一时间变量的数值格式是关键:
library(tidyverse) # 步骤1:提取字段并统一时间格式 ibex$Date <- as.Date(ibex$Date) ibex <- as_tibble(ibex) ibex.1 <- ibex[,c("Date","Open")] # 把日期转为月度匹配的数值型自变量:格式为「年 + (月-1)/12」,和月度频率对齐 ibex.1 <- ibex.1 %>% mutate(time_num = year(Date) + (month(Date)-1)/12) # 步骤2:训练平滑样条模型 ibex.spl <- smooth.spline(x = ibex.1$time_num, y = ibex.1$Open, cv = TRUE) # 步骤3:生成待预测日期,转成和训练集完全一致的数值格式 nuevafecha <- seq(as.Date("2022-06-01"), as.Date("2022-08-01"), by = "1 month") new_data <- tibble( Date = nuevafecha, time_num = year(Date) + (month(Date)-1)/12 ) # 步骤4:正确传参执行预测 pred_res <- predict(ibex.spl, x = new_data$time_num) # 合并结果 final_output <- new_data %>% mutate(Open_pred = pred_res$y)
运行后final_output里就是2022年6-8月的对应预测值。
注意事项
平滑样条本质是插值类方法,训练集自变量范围外的外推结果稳定性弱于范围内的插值结果,仅适合做短期趋势参考。
内容的提问来源于stack exchange,提问作者David Aguinaga
相关产品推荐
相关产品推荐

