R语言tsSmooth函数用法详解:如何获取带线性趋势的单变量时间序列
R语言tsSmooth函数详解与实操
函数核心作用
tsSmooth是R语言forecast扩展包中用于时间序列平滑拟合的专用函数,核心功能是基于指定的时间序列模型(如结构化时间序列模型、ARIMA、ETS等),输出序列的平滑拟合值,也可以单独提取序列的趋势、季节等结构化分量,完全满足提取单变量时间序列线性趋势的需求。
核心常用参数
x:输入对象,要求为R标准ts类时间序列model:指定用于平滑拟合的模型,提取线性趋势时推荐搭配StructTS结构化时间序列模型使用,拟合效果稳定type:指定返回的分量类型,要提取线性趋势直接设置为"trend"即可,可选值还包括"level"(水平项)、"seasonal"(季节项)
实操步骤(提取线性趋势序列)
步骤1:安装加载依赖包
如果未安装过forecast包先执行安装,之后加载:
# 安装依赖(仅需执行一次) install.packages("forecast") # 加载包 library(forecast)
步骤2:构造带线性趋势的单变量时间序列
我们先生成一组模拟的带噪声线性趋势序列用于演示,你可以替换成自己的实际数据,注意要先转为ts格式:
# 固定随机种子保证结果可复现 set.seed(123) # 构造100期的线性趋势+随机噪声序列 t <- 1:100 real_trend <- 2 + 0.3 * t # 真实线性趋势:截距2,斜率0.3 noise <- rnorm(100, mean = 0, sd = 2) # 高斯噪声 # 转为ts类时间序列,frequency=1代表无季节波动的单周期序列 raw_ts <- ts(real_trend + noise, frequency = 1)
步骤3:调用tsSmooth提取线性趋势
# 先拟合带趋势项的结构化时间序列模型,再传入tsSmooth提取趋势分量 trend_smoothed <- tsSmooth( x = raw_ts, model = StructTS(raw_ts, type = "trend"), type = "trend" )
步骤4:结果验证与使用
输出的trend_smoothed本身就是标准ts类对象,可以直接用于后续分析,也可以绘图对比效果:
# 查看前6行拟合结果 head(trend_smoothed) # 绘图对比原始序列、真实趋势、拟合的平滑趋势 plot(raw_ts, col = "gray", lwd = 1, main = "线性趋势提取效果对比", ylab = "数值") lines(real_trend, col = "blue", lwd = 2, lty = 2) lines(trend_smoothed, col = "red", lwd = 2) legend("topleft", legend = c("原始带噪序列", "真实线性趋势", "tsSmooth提取趋势"), col = c("gray", "blue", "red"), lty = c(1,2,1), lwd = c(1,2,2))
运行后可以看到tsSmooth提取的趋势和真实线性趋势几乎重合,降噪效果符合预期。
注意事项
- 如果你的原始序列自带季节波动,只需将
StructTS的type参数改为"BSM"(基础结构模型),仍设置tsSmooth的type = "trend"即可单独提取剔除季节影响后的线性趋势 - 若需要调整平滑程度,可以自定义
StructTS的协方差参数,默认参数对绝大多数线性趋势场景的提取效果已经足够 - 输入序列如果存在缺失值,建议先用
na.interp()等函数先补全缺失值再进行拟合,避免报错
内容的提问来源于stack exchange,提问作者Giuseppina
相关产品推荐
相关产品推荐

