Корреляция двух наборов измерений во времени

Задача количественной характеристики связи между двумя наборами измерений очень распространена. Она встречается в самых различных областях человеческой деятельности: в научных исследованиях, когда необходимо проследить зависимость одного параметра от другого (например, длины листа от его ширины; или диаметра ствола дерева от его высоты и пр.), при анализе цен на какие-либо товары или их группу, в психологии – при интерпретации результатов социальных опросов и др. Традиционным подходом к такому типу задач является вычисление коэффициента корреляции. В зависимости от природы сравниваемых наборов (количественные, упорядоченные наборы, качественные показатели), могут быть использованы различные меры корреляционной зависимости. 

Нередко возникает задача, когда имеется два набора измерений, каждый из которых отражает изменение каких-либо параметров во времени.  При этом требуется количественно характеризовать зависимость между этими двумя наборами. Такая задача, в частности, имеет место, когда необходимо оценить влияние какого-либо контролируемого фактора на процесс.

Пример наборов измерений для исследования взаимной корреляции

Рис.: Зашумленные графики синуса и косинуса

Рассмотрим виртуальный пример. Исследуется влияние инсектицида на популяцию насекомых. Имеется возможность оценивать численность популяции насекомых, и концентрацию инсектицида. Таким образом, оценки количества насекомых и концентрации действующего на них вещества могут быть представлены в виде двух временных рядов. Задача состоит в том, чтобы количественно охарактеризовать влияние обработки на популяцию паразитов. Действие вещества может быть несколько отсроченным (например, оно действует только на личинки паразитов или способность их к воспроизводству), поэтому непосредственное взятие коэффициента корреляции для двух рядов может показать, что обработка не приносит резульатов; Таким образом, коэффициент корреляции двух совокупностей значений не всегда информативен, если речь идет об оценке влияния одного временного процесса на другой. Такое влияние, вследствие каких-либо особенностей природных систем, может проявляться с запаздыванием, которое "коэффициент корреялции" не в сосотоянии уловить.

На рисунке выше представлены два модельных процесса — это зашумленные случайными значениями функции синуса и косинуса. Вычисляя значения коэффициента корреляции для этих двух рядов, были получены значения не превосходящие 0.15.  В случае, когда при генерации пробных рядов использовалась только функция синуса, а случайный вклад оставался на прежнем уровне, значения коэффициента корреляции поднималось до 0.85. Это связано с тем, что в этом случае отсутствовал сдвиг фаз, который имеет место между синусом и косинусом.

Таким образом, осуществляя анализ влияния одного фактора на другой, необходимо учитывать возможное наличие запаздывания между сравниваемыми наборами данных. Учет запаздывания при расчетах корреляции между двумя наборами возможен, если рассматривать коэффициент корреляции как функцию величины сдвига одной выборки относительно другой.

Рассмотрим следующий пример с модельными данными.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#  -*- coding: utf8 -*-
import numpy as np 
from pylab import *

#Инициализация генератора, для воспроизводимости результатов
np.random.seed(10)


#Используется для генерации модельных данных 
x = np.linspace(0, 10, 100)


# Генерация модельных данных №1
data1 = np.sin(x) + np.random.rand(len(x))

np.random.seed(15)
# Генерация модельных данных №2
data2 = np.cos(x) + np.random.rand(len(x))

print 'Коэффициент корреляции Пирсона для двух совокупностей данных:', np.corrcoef(data1, data2)[0,1]

def custom_corr(data1, data2):
  '''
  Вспомогательная функция, вычисляющая корреляции с учетом сдвига
  '''
  return [np.corrcoef(np.hstack([data1[j:],data1[:j]]),data2)[0,1] for j in xrange(len(data1))]

print 'Максимальная корреляция с учетом возможных сдвигов ',max(custom_corr(data1,data2))

#Чтобы русские символы отображались корректно на графике
rcParams['font.family'] = ['Liberation serif']

plot(custom_corr(data1,data2))
title(u'Коэффициент корреляции в зависимости от сдвига')
xlabel(u'Сдвиг')
ylabel(u'Коэффициент корреляции')
show()

В рассматриваемом примере производится генерация данных. Данные намерено смещены друг относительно друга (образующие функции - синус и косинус). Непосредственное вычисление коэффициента корреляции приводит к значению 0.05915, таким образом, без учета запаздывания, наборы данных некоррелированы.

Для того, чтобы учесть запаздывание в наборах данных, одна из выборок циклически сдвигается на j-позиций:

$$\begin{array}{l} (x_1,x_2,x_3,\ldots,x_n) \mbox{ при }  j=0 \\ (x_n, x_1,x_2,x_3,\ldots,x_{n-1})\mbox{ при }  j=1\\(x_{n-1}, x_n,x_1,x_2,\ldots,x_{n-2}) \mbox{ при } j=2 \end{array} $$

Таким образом, имеется возможность построить график набора коэффициентов корреляций, вычисленных при различных уровнях сдвига \(j\).

Такой график для рассматриваемых модельных наборов данных представлен на рисунке ниже.

График коэффициентов корреляций в зависимости от сдвигов

На графике видно, что непосредственно вычисленный без взаимного сдвига рядов коэффициент корреляции не значителен, однако, последовательно осуществляя сдвиг рядов друг относительно друга, получаем функцию, максимум которой равен 0.661. Это уже существенное (и статистически значимое) значение.  Следовательно, исследуемые на взаимную зависимость наборы данных следует признать зависимыми (с учетом запаздывания). В качестве меры такой зависимости целесообразно выбрать максимум, достигаемый коэффициентами корреляций по всем возможным значениям сдвигов.

Подобный прием для оценки взаимной зависимости между временными рядами используется в теории обработки сигналов и является очень полезным инструментом для анализа данных.

blog comments powered by Disqus