TSLM模型添加额外变量的方法及运行报错问题求解
问题根因
- 数值协变量无因子水平匹配要求,因此之前传入
Volume、Low时无运行异常;分类因子变量则要求训练集、预测集的因子取值、顺序完全对齐,构造预测新数据时临时生成的因子会因水平定义与训练集不匹配触发报错。 - TSLM拟合时会为每个交叉验证折记录对应训练集内的因子水平,若预测新数据中的因子水平未提前和全局水平统一,就会出现某折训练集未包含对应水平、预测传入值无匹配项的错误。
- 协变量类型错位:原代码中
qt为数值型季度值,模型默认将其作为连续协变量处理,若某训练折的时间范围仅覆盖单一季度,qt为常数会被模型自动从公式中剔除,预测时传入的qt值会因对应变量不存在于模型结构中触发报错。 - 度量函数参数缺失:
winkler_score函数需要显式传入置信水平参数,直接传入accuracy计算会因参数不匹配触发运行错误。
修正方案
- 提前为所有分类协变量定义全局固定因子水平,保证训练集、预测集的因子水平、顺序完全统一,避免后续临时生成因子造成水平漂移。
- 明确将季度变量
qt转换为因子类型,和dow的处理逻辑保持一致,避免被误识别为连续协变量。 - 构造预测新数据时,分类变量的取值严格复用全局定义的因子水平生成,不调用
as.factor()临时生成新的因子对象。 - 为
winkler_score指定固定的置信水平参数,适配accuracy函数的调用格式。
修正后的可运行代码
library(fpp3) google_2015 <- gafa_stock %>% filter(Symbol == "GOOG", year(Date) == 2015) %>% mutate(trading_day = row_number()) %>% update_tsibble(index = trading_day, regular = TRUE) %>% # 提前固定分类变量的全局因子水平 mutate( qt = factor(quarter(Date), levels = 1:4, labels = c("Q1", "Q2", "Q3", "Q4")), dow = factor(weekdays(Date), levels = c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")) ) google_2015_stretch <- google_2015 %>% stretch_tsibble(.init = 3, .step = 1) %>% filter(.id != max(.id)) fit_cv <- google_2015_stretch %>% model(tslm = TSLM(Close ~ Volume + Low + qt + dow)) # 构造新数据时严格复用全局因子水平定义 f <- new_data(google_2015_stretch, 1) %>% mutate( Volume = 1447601, Low = 700, qt = factor(quarter(Date), levels = 1:4, labels = c("Q1", "Q2", "Q3", "Q4")), dow = factor(weekdays(Date), levels = c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")) ) fc <- forecast(fit_cv, new_data = f) fc %>% accuracy( google_2015, # 为winkler_score指定固定置信水平 list( rmse = RMSE, mae = MAE, mape = MAPE, mase = MASE, crps = CRPS, winkler = function(dist) winkler_score(dist, level = 95) ) ) %>% arrange(rmse)
内容的提问来源于stack exchange,提问作者user290703
相关产品推荐
相关产品推荐

