使用年度间隔分解时间序列

3

我有跨越17年的数据,想用ts()制作年度时间序列。对于1、3和6个月的间隔,它运行得非常好,但是当我尝试每年一次时,就会出错。

这是我的示例:

date <- c("2000-01-01", "2001-01-01", "2002-01-01", "2003-01-01", "2004-01-01", "2005-01-01", "2006-01-01", "2007-01-01", "2008-01-01", "2009-01-01", "2010-01-01", "2011-01-01", "2012-01-01", "2013-01-01", "2014-01-01", "2015-01-01", "2016-01-01")
var <- c(1:17)
df <- data.frame(as.Date(date), var)
ts_df <- ts(df$var,start=c(2000,1),frequency=1)
stl_df <- stl(ts_df, s.window = "periodic")

有没有解决这个问题的方法?

我读到过,对于月份,你需要至少24个月的数据来建模。那么对于年份,我是否也需要相同数量的数据?如果有其他工具可以帮助解决这个问题,我也很愿意尝试。

我的最终目标是使用:

autoplot(cbind(Data=ts_df,Seasonal=seasonal(stl_df),
               Trend=trendcycle(stl_df)), 
         facets=TRUE)

date <- c("2000-01-01", "2001-01-01", "2002-01-01", "2003-01-01", "2004-01-01", "2005-01-01", "2006-01-01", "2007-01-01", "2008-01-01", "2009-01-01", "2010-01-01", "2011-01-01", "2012-01-01", "2013-01-01", "2014-01-01", "2015-01-01", "2016-01-01")
var <- c(1:17)
df <- data.frame(as.Date(date), var)
ts_df <- ts(df$var,start=c(2000,1),frequency=1)
stl_df <- stl(ts_df, s.window = "periodic")
1个回答

4
为了提供更多样化的例子:
date <- seq(as.Date("2000-01-01"),as.Date("2016-01-01"), by="1 year")
var <- cumsum(rnorm(17))

df <- data.frame(date = as.Date(date), var)
ts_df <- ts(df$var,start=c(2000,1),frequency=1)

抱歉,如果时间间隔大于等于一年,则无法从时间序列中分解季节性。这与季节性的定义相矛盾,因此在此处使用“stl”或“decompose”没有多大作用。在这种情况下,您可以分解趋势和周期性模式,而不是季节性。在“mFilter”中有几种平滑/过滤方法可供使用,易于实现。例如,Hodrick Prescott过滤:
library(mFilter)
filtered <- mFilter(ts_df,filter="HP")
print(filtered)
summary(filtered)
residuals(filtered)
fitted(filtered)
plot(filtered)

在此输入图像描述

还有一种更加“高级”的方法,使用了 wavelets 包中的 时间序列多分辨率分析。该方法可以为您提供分解出的平滑值(S)、残差周期模式(D1,D2……,DJ)。该程序包没有默认的绘图方法,因此需要进行一些额外操作——但只需进行一点调整即可:

library(waveslim)
library(ggplot2)
library(reshape2)
filtered <- mra(ts_df,J=2)

results <- as.data.frame(filtered)
results <- cbind(df,results)

melt(results, id.var="date") %>%
  ggplot(aes(x=date,y=value,group=variable)) +
  geom_line() +
  facet_wrap(~variable)

在这里输入图片描述

愉快!


1
非常感谢!这是解决问题的一个不错的方法。 - GaryDe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接