Fórmula para autocorrelação em R vs. Excel

13

Estou tentando descobrir como o R calcula a autocorrelação lag-k (aparentemente, é a mesma fórmula usada pelo Minitab e SAS), para que eu possa compará-lo ao uso da função CORREL do Excel aplicada à série e sua versão com atraso k. R e Excel (usando CORREL) fornecem valores de autocorrelação ligeiramente diferentes.

Eu também estaria interessado em descobrir se um cálculo é mais correto que o outro.

Galit Shmueli
fonte
RA fórmula de é analisada e explicada em stats.stackexchange.com/questions/81754/… .
whuber

Respostas:

17

A equação exata é dada em: Venables, WN e Ripley, BD (2002) Modern Applied Statistics with S. Fourth Edition. Springer-Verlag. Vou dar um exemplo:

### 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

E assim por diante (por exemplo, res[1:47]e res[4:50]para o atraso 3).

Wolfgang
fonte
Obrigado Wolfgang! Era exatamente isso que eu estava procurando. Agora eu posso tentar replicá-lo no Excel (somente para meus alunos que usam o Excel).
Galit Shmueli
11

A maneira ingênua de calcular a correlação automática (e possivelmente o que o Excel usa) é criar 2 cópias do vetor e remover o 1º n elementos da primeira cópia e os últimos n elementos da segunda cópia (onde n é o atraso que você estão computando de). Em seguida, passe esses 2 vetores para a função para calcular a correlação. Este método está OK e dará uma resposta razoável, mas ignora o fato de que os 2 vetores comparados são realmente medidas da mesma coisa.

A versão aprimorada (como mostrada por Wolfgang) é uma função semelhante à correlação regular, exceto pelo fato de usar o vetor inteiro para calcular a média e a variância.

Greg Snow
fonte
3
A outra diferença é o fator 1 / n em vez de 1 / (nk) onde n é o comprimento da série ek o número de defasagens. Isso é para garantir que a matriz de autocorrelação seja definitiva positiva.
Rob Hyndman
1
@ Rob: Eu acredito que a fórmula CORREL do Excel usa n (em vez de nk). Por exemplo, para lag-1 ACF, você obtém o mesmo resultado (usando a notação de Wolfgang) se usar COVAR (res [1:49], res [2:50]) / (DESVPAD (res [1:49]) * DESVPADP (res [2:50])) e as funções COVAR e STDEVP são estatísticas de "população".
Galit Shmueli
@Galit. Mesmo usando COVAR e STDEVP, o denominador em seu código seria 49, mas a definição preferida de autocorrelação usará 50.
Rob Hyndman
1
O ponto 1 / n vs 1 / (nk) é bom para entender, além dos outros pontos acima. Mas, para números práticos / observados, isso não importa, desde que seja consistente, pois esse termo aparece no numerador e no denominador que será cancelado. Você poderia obter um problema se frações diferentes fossem usadas no numerador e denominador.
Greg Snow