如何从周期图中识别时间序列的季节性?

机器算法验证 时间序列 有马 季节性 傅里叶变换
2022-04-07 03:37:30

我需要识别数据集的季节性/周期性,以便开发 ARMAX 模型。这是原始时间序列的样子 在此处输入图像描述

我已经绘制了数据集的周期图。

Ps:我使用了原始时间序列的一阶差分,以便从原始时间序列中去除趋势。这就是周期图的样子在此处输入图像描述

我还从数据中删除了线性趋势并估计了周期图。下面是它的样子

在此处输入图像描述

我还估计了原始数据集的周期图,没有任何差异。显然,它表明数据存在一些趋势。我正在使用以下 R 代码来生成它

A <- read.xlsx("Interpolation_Data.xlsx")
y <- A[,2]
x <- as.numeric(A[,4])
diff.y <- diff(y)
diff.x <- diff(x)
Fs<- 1/60
n=length(diff.y)
xdft <-fft(diff.y)
xdft <- xdft[1:(n/2+1)]
psdx <- (1/(Fs*n))* abs(xdft)^2
psdx[c(-1,-n)] <- 2*psdx[c(-1,-n)]
f <- seq(0,Fs/2,by = Fs/n)
plot(f,10*log10(psdx),type='l')

这是数据集的链接

1个回答

好吧,采取一阶差分后的周期图并没有表明任何明确的周期性。但是,请注意,采用一阶差分会放大高频分量,它应该在功率谱中显示为二次趋势,在对数功率谱中显示为对数形趋势(这与我们在这里看到的大致兼容) .

我的建议:

– 首先计算周期图而不进行任何预处理。

– 然后,去除线性趋势,但不是通过使用一阶差分,而是通过回归拟合一条线并从数据中减去结果(R 中还应该有一个“去趋势”函数)。

– 使用适当的频谱估计函数。我不熟悉 R,但我确信它包含Welch 修改周期图方法的实现。


更新问题的更新:

时间序列展示了大约 360 个样本的主要周期,对于每分钟 1 个的采样率,这意味着 360 分钟。因此,主频率应约为 0.0028 min这似乎与减去趋势后的周期图一致。尝试放大低频范围以更精确地确定峰值位置。叠加在其上的是 180 个采样周期或 0.0056 分钟频率的二次振荡。11

自己分析您的数据,我在 0.0029 分钟 ^{-1} 处得到一个主峰,在 0.0059 分钟处得到一个次峰(因子 2,一次谐波)。次级峰值小了大约 36 倍或 16 dB。我可以分享我的代码,但我使用的是 Matlab,而不是 R。11

顺便说一句,您的地块上的频率比例似乎不一致;有时会上升到 0.008,有时会上升到 0.5?我认为前者以 Hz 为单位给出频率,后者以 min给出频率。1