Вопрос или проблема
У меня есть две переменные в виде временных рядов, одна из которых является следствием другой. Я хотел бы найти среднюю временную задержку, которую требует зависимая переменная для реакции на независимую переменную. Кроме того, я хотел бы найти диапазон дисперсии, связанный с временем задержки, и его соответствующий уровень доверия. Я не уверен, как подойти к этому статистически корректно, но я использую Python.
В настоящее время я использовал np.diff(np.sign(np.diff(df)))
, чтобы изолировать относительные максимумы и минимумы временного ряда, а затем попытаться найти временной разрыв между последующими парами минимумов и максимумов, но это, на мой взгляд, не слишком валидно — что вы об этом думаете? Выход минимумы и максимумы возвращает массив вроде [0, -2, 0, 2, 0, 0, -2]
, где -2 — это относительный минимум, а 2 — относительный максимум.
Буду очень признателен за методологические советы.
Спасибо за ваше время и будьте осторожны!
Всего наилучшего,
RS
В первом приближении, то, что вы ищете, может быть запаздлыми корреляциями. Вы сдвигаете временной ряд на некоторое время t и смотрите на корреляцию с первым временным рядом, изменяя задержку. Значение задержки, которое дает наибольшую корреляцию, является хорошим кандидатом для оценки временной задержки между двумя рядами.
Если вы хотите более сложную статистику, такую как дисперсия (что означает, что у вас переменная задержка), это может усложниться, так как вам придется определить, какой пик в первом временном ряду соответствует какому в втором. В зависимости от формата вашего временного ряда это может быть легко или сложно. Я бы предложил сначала попробовать простой подход: для каждого пика вашего первого временного ряда попытайтесь найти соответствующий в втором (например, первый пик, который появляется после него). Это может стать сложным, если некоторые пики перекрываются или задержка слишком переменная. Другой вариант — использовать более сложные методы, такие как алгоритмы динамического временного выравнивания.
Ответ или решение
Для анализа среднего времени задержки и его вариации между двумя временными рядами, где один ряд зависит от другого, можно использовать несколько различных статистических методов. Ниже представлен детальный подход к решению данной задачи с помощью языка программирования Python.
Этап 1: Подготовка данных
Прежде всего убедитесь, что у вас есть две временные серии в формате, удобном для анализа, обычно с помощью библиотеки pandas:
import pandas as pd
# Загрузка данных
df = pd.read_csv('ваши_данные.csv')
# Убедитесь, что временные ряды выровнены по индексу
df['time_series_1'] = df['column_для_независимой_переменной']
df['time_series_2'] = df['column_для_зависимой_переменной']
Этап 2: Установление задержки с помощью корреляции
Одним из наиболее простых методов для нахождения задержки является использование лагированной корреляции:
import numpy as np
# Функция для вычисления индекс максимальной корреляции
def find_lagged_correlation(ts1, ts2, max_lag):
correlations = []
for lag in range(max_lag + 1):
# Сдвиг одного временного ряда на lag
shifted_ts2 = np.roll(ts2, lag)
corr = np.corrcoef(ts1, shifted_ts2)[0, 1]
correlations.append(corr)
return np.argmax(correlations), correlations
max_lag = 50 # Определите максимальную задержку для теста
lag_index, correlations = find_lagged_correlation(df['time_series_1'], df['time_series_2'], max_lag)
print(f'Наибольшая корреляция при лаге {lag_index}, значение корреляции {correlations[lag_index]}')
Этап 3: Определение соответствующих пиков
Чтобы найти среднее время задержки с вариацией, вы можете использовать функцию для нахождения пиков в обоих временных рядах:
from scipy.signal import find_peaks
peaks1, _ = find_peaks(df['time_series_1'])
peaks2, _ = find_peaks(df['time_series_2'])
# Подсчёт задержки между пиками
delays = []
for peak in peaks1:
# Найти ближайший пик в серии 2
future_peaks = peaks2[peaks2 > peak]
if len(future_peaks) > 0:
delays.append(future_peaks[0] - peak)
average_delay = np.mean(delays)
variance_delay = np.var(delays)
print(f'Средняя задержка: {average_delay}, Вариация задержки: {variance_delay}')
Этап 4: Оценка доверительного интервала
Для оценки доверительного интервала для средней задержки можно использовать стандартную ошибку среднего и распределение t:
from scipy import stats
confidence_level = 0.95
degrees_freedom = len(delays) - 1
sample_mean = average_delay
sample_standard_error = np.std(delays, ddof=1) / np.sqrt(len(delays))
confidence_interval = stats.t.interval(confidence_level, degrees_freedom, sample_mean, sample_standard_error)
print(f'Доверительный интервал: {confidence_interval}')
Заключение
Таким образом, описанные методы позволят вам определить среднее время задержки, его вариацию и доверительный интервал с использованием языка Python. Не забудьте протестировать алгоритм на ваших данных и проверить качество полученных результатов. Если задержки сильно варьируются, вам могут быть полезны более сложные методы, такие как алгоритмы динамического временного выравнивания (Dynamic Time Warping).