#python #time-series #filtering #signal-processing #wavelet
Вопрос:
Я предварительно обрабатываю непериодический сигнал для дальнейшей реализации авторегрессионного моделирования сигнала. Сигнал показан на следующем рисунке. Однако, когда я применил дополненный тест Дики-Фуллера (ADF) к сигналу с пороговым значением p = 0,01, сигнал проверяется как нестационарный. После реализации дифференцирования первого порядка или дифференцирования с фиксированным интервалом на нестационарных сигналах дифференцированный сигнал все еще тестируется как нестационарный. В этом случае, как мне эффективно предварительно обработать необработанный сигнал, чтобы обработанные временные ряды прошли тест ADF(пороговое значение p = 0,01)? Любая помощь или предложения будут высоко оценены!
Комментарии:
1. Какова природа вашего сигнала? Если вы не ожидаете, что в течение определенного периода времени будет стационарный компонент, то преобразование вашего сигнала до тех пор, пока вы его не найдете, просто приведет к неправильному ответу. Каков ваш источник сигнала? Я больше знаком с традиционной обработкой сигналов, чем с вейвлет-обработкой сигналов, но, возможно, я смогу чем-то помочь, если мне предоставят больше информации.
Ответ №1:
Как сказано в комментариях, ваш фактический сигнал может быть нестационарным (в любом смысле-среднее значение, дисперсия, частота и т. Д.).
Однако мы можем попытаться разложить ваш сигнал на стационарную составляющую (если она существует) и нестационарную составляющую. Я привожу пример ниже (есть много способов сделать это из статистики и литературы по обработке сигналов-я показываю один способ).
Я создал небольшой скрипт на Python для генерации сигнала, похожего на ваш, в том смысле, что он имеет сильную периодичность с амплитудой «всплеска» в середине (я также добавил немного фактического шума поверх этого).
Для анализа я использую statsmodels.tsa.seasonal.STL
фильтр (использует ЛЕСС), чтобы разложить сигнал на тренд, сезонность и остаток (это аддитивная модель-Сигнал = Тренд Сезонность Остаток).:
Тест 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)}")