使用R的tsfeatures计算STL分解时提示数据不足的问题排查
问题分析与解决
数据转换方式的合理性
你当前的面板数据转ts对象的逻辑有瑕疵,但触发STL分解警告的核心原因是数据量本身:
- STL分解需要至少两个完整的周期数据来估计季节成分,你的每个时间序列只有365天(对应一个年度周期),数据量不足以满足STL的计算要求,因此触发警告。
- 你的
ts对象转换中,start=c(2022, 121)的设置会让R将序列识别为从2022年第121天开始的年度频率序列,365个观测值会跨越到2023年,但本质上还是只有一个完整的年度周期,无法满足STL的需求。
如果你的数据确实只有单一年度的日度观测,stl_features本身就不适合计算,或者需要调整参数(但效果有限)。
正确的数据转换方式(针对跨年度日度序列)
如果后续有跨年度数据,正确转换面板数据为多变量时间序列的方式可以调整为:
library(tsfeatures) library(dplyr) library(zoo) set.seed(25) # 生成跨两年的日度示例数据 inds <- seq(as.Date("2022-05-01"), as.Date("2024-04-30"), by = "day") values <- c(rnorm(length(inds), mean = 20, sd = 2), rnorm(length(inds), mean = 200, sd = 20)) products <- rep(c("A","B"), each = length(inds)) df <- data.frame(date = rep(inds,2), products, values) # 转换为宽格式 df_wide <- df %>% tidyr::pivot_wider(names_from = products, values_from = values) %>% arrange(date) # 基于日期生成标准的多变量时间序列对象 df_mts <- as.ts(zoo(df_wide %>% select(-date), order.by = df_wide$date)) frequency(df_mts) <- 365 # 此时计算stl_features不会触发警告(具备两个完整年度周期) features <- bind_cols( tsfeatures(df_mts, c("acf_features","entropy","lumpiness","flat_spots","crossing_points")), tsfeatures(df_mts,"stl_features", s.window = "periodic", robust = TRUE) )
单一年度数据的替代方案
如果只有单一年度的365天数据,可选择以下两种方式:
- 放弃计算
stl_features,改用其他不需要季节分解的特征; - 手动调整STL的
s.window参数为更小的值(强制拟合季节成分,结果可靠性较低):
features <- bind_cols( tsfeatures(df_mts, c("acf_features","entropy","lumpiness","flat_spots","crossing_points")), tsfeatures(df_mts,"stl_features", s.window = 11, robust = TRUE) )
内容的提问来源于stack exchange,提问作者TheGoat
相关产品推荐
相关产品推荐

