Формула для автокорреляции в R против Excel

13

Я пытаюсь выяснить, как R вычисляет автокорреляцию lag-k (очевидно, это та же формула, что используется Minitab и SAS), так что я могу сравнить ее с использованием функции CORREL в Excel, примененной к серии, и ее версии с k-lagged. R и Excel (используя CORREL) дают немного разные значения автокорреляции.

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

Галит Шмуэли
источник
RФормула далее анализируется и объясняется по адресу stats.stackexchange.com/questions/81754/… .
whuber

Ответы:

17

Точное уравнение дано в: Venables, WN и Ripley, BD (2002) Современная прикладная статистика с S. Четвертое издание. Springer-Verlag. Я приведу вам пример:

### simulate some data with AR(1) where rho = .75
xi <- 1:50
yi <- arima.sim(model=list(ar=.75), n=50)

### get residuals
res <- resid(lm(yi ~ xi))

### acf for lags 1 and 2
cor(res[1:49], res[2:50])      ### not quite how this is calculated by R
cor(res[1:48], res[3:50])      ### not quite how this is calculated by R

### how R calculates these
acf(res, lag.max=2, plot=F)

### how this is calculated by R
### note: mean(res) = 0 for this example, so technically not needed here
c0 <- 1/50 * sum( (res[1:50] - mean(res)) * (res[1:50] - mean(res)) ) 
c1 <- 1/50 * sum( (res[1:49] - mean(res)) * (res[2:50] - mean(res)) ) 
c2 <- 1/50 * sum( (res[1:48] - mean(res)) * (res[3:50] - mean(res)) ) 
c1/c0
c2/c0

И так далее (например, res[1:47]и res[4:50]для отставания 3).

Wolfgang
источник
Спасибо Вольфганг! Это именно то, что я искал. Теперь я могу попробовать скопировать его в Excel (для моих студентов, которые используют только Excel).
Галит Шмуэли
11

Наивный способ вычислить автокорреляцию (и, возможно, то, что использует Excel) состоит в том, чтобы создать 2 копии вектора, а затем удалить первые 1 n элементов из первой копии и последние n элементов из второй копии (где n - это задержка, которую вы вычисления от). Затем передайте эти 2 вектора в функцию для вычисления корреляции. Этот метод в порядке и даст разумный ответ, но он игнорирует тот факт, что сравниваемые 2 вектора действительно являются мерами одного и того же.

Улучшенная версия (как показывает Вольфганг) представляет собой функцию, аналогичную обычной корреляции, за исключением того, что она использует весь вектор для вычисления среднего значения и дисперсии.

Грег Сноу
источник
3
Другое отличие - коэффициент 1 / n вместо 1 / (nk), где n - длина ряда, а k - число лагов. Это необходимо для того, чтобы матрица автокорреляции была положительно определенной.
Роб Хиндман
1
@Rob: Я считаю, что в формуле Excel CORREL действительно используется n (а не nk). Например, для lag-1 ACF вы получите тот же результат (используя запись Вольфганга), если вы используете COVAR (res [1:49], res [2:50]) / (STDEVP (res [1:49]) * STDEVP (res [2:50])), а функции COVAR и STDEVP являются статистикой "населения".
Галит Шмуэли
@Galit. Даже при использовании COVAR и STDEVP знаменатель в вашем коде будет 49, но предпочтительное определение автокорреляции будет использовать 50.
Роб Хиндман,
1
Точка 1 / n против 1 / (nk) хороша для понимания в дополнение к другим пунктам выше. Но для практических / наблюдаемых чисел это не будет иметь значения, пока оно непротиворечиво, так как этот термин отображается как в числителе, так и в знаменателе, который он отменит. Вы можете получить проблему, если в числителе и знаменателе используются разные дроби.
Грег Сноу