首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何有效地平稳化非周期波信号?

如何有效地平稳化非周期波信号?
EN

Stack Overflow用户
提问于 2021-09-01 19:56:39
回答 1查看 65关注 0票数 1

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

EN

回答 1

Stack Overflow用户

发布于 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代码

代码语言:javascript
复制
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)}")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69019900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档