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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 19:56:50