正如 cmets 中所说,您的实际信号可能不是固定的(在任何意义上——均值、方差、频率等)。
但是,我们可以尝试将您的信号分解为固定分量(如果存在)和非固定分量。我在下面举了一个例子(从统计数据和信号处理文献中有很多方法可以做到这一点——我正在展示一种方法)。
我创建了一个小的 Python 脚本来生成一个有点像你的信号,因为它具有很强的周期性,中间有一个“突发”幅度(我还在此之上添加了一些实际噪声)。
对于分析,我使用statsmodels.tsa.seasonal.STL 过滤器(使用 LOESS)将信号分解为趋势、季节性和残差(它是一个加法模型 -- 信号 = 趋势 + 季节性 + 残差):
ADF 测试在原始信号(上图)上的 p 值约为 0.02,在应用于残差信号时为 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)}")