我正在对一个非周期信号进行预处理,以便进一步对该信号进行自回归建模。信号如下图所示。但是,当我对阈值p= 0.01的信号应用增强的Dickey-Fuller (ADF)测试时,该信号被测试为非平稳的。在对非平稳信号实施一阶差分或具有固定间隔的差分之后,差分信号仍被测试为非平稳信号。在这种情况下,如何有效地预处理原始信号,以便处理后的时间序列通过ADF测试(阈值p-value = 0.01)?如有任何帮助或建议,将不胜感激!

发布于 2021-09-03 16:49:09
正如评论中所说,您的实际信号可能不是平稳的(在任何意义上--均值、方差、频率等)。
但是,我们可以尝试将您的信号分解为平稳分量(如果存在)和非平稳分量。下面我给出一个例子(从统计数据和信号处理文献中有很多方法可以做到这一点--我展示了一种方法)。
我创建了一个小的Python脚本来生成与您的信号有点类似的信号,因为它具有很强的周期性,中间有一个“突发”振幅(我还在此之上添加了一些实际的噪声)。
对于分析,我使用statsmodels.tsa.seasonal.STL滤波器(使用LOESS)将信号分解为趋势、季节性和残差(这是一个加性模型--信号=趋势+季节性+残差):

ADF测试对原始信号的p值为~0.02 (上图),对残差信号的p值为0.0,因此看起来我们成功地分离了分量。
因此,您可以在任何后续分析中使用残差,并将趋势和季节性重新分层。
希望这篇文章能给你一些启发。有很多方法可以做到这一点。
这里没有展示的其他方法包括ARCH和GARCH过程模型,它们是处理非平稳波动率和波动率集群的手段:https://en.wikipedia.org/wiki/Autoregressive_conditional_heteroskedasticity
python代码
from random import uniform
import pandas as pd
from matplotlib import pyplot
from statsmodels.tsa.seasonal import DecomposeResult, STL
from statsmodels.tsa.stattools import adfuller
with open("signal.txt", 'r') as f:
series = pd.Series(uniform(.5, 2)*float(i) for i in f.readlines())
adf = adfuller(series, store=True)
stat, pval = adf[:2]
print(f"Signal ADF Test: ADF={stat}, p-val={round(pval,2)}")
periods = []
p = 0
for i in range(len(series)-1):
if series[i]*series[i+1] >= 0:
p += 1
continue
periods.append(p)
p = 0
T = round(sum(periods)/len(periods))
print(T)
result: DecomposeResult = STL(series, period=2*T).fit()
result.plot()
pyplot.show()
resid = result.resid
adf = adfuller(resid, store=True)
stat, pval = adf[:2]
print(f"Residual ADF Test: ADF={stat}, p-val={round(pval,2)}")https://stackoverflow.com/questions/69019900
复制相似问题