Formula per l'autocorrelazione in R vs. Excel


13

Sto cercando di capire come R calcola l'autocorrelazione lag-k (apparentemente, è la stessa formula utilizzata da Minitab e SAS), in modo da poterlo confrontare con la funzione CORREL di Excel applicata alla serie e alla sua versione con ritardo k. R ed Excel (usando CORREL) forniscono valori di autocorrelazione leggermente diversi.

Sarei anche interessato a scoprire se un calcolo è più corretto dell'altro.


RLa formula viene ulteriormente analizzata e spiegata su stats.stackexchange.com/questions/81754/… .
whuber

Risposte:


17

L'equazione esatta è data in: Venables, WN e Ripley, BD (2002) Modern Applied Statistics con S. Fourth Edition. Springer-Verlag. Ti faccio un esempio:

### 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 così via (ad esempio, res[1:47]e res[4:50]per il ritardo 3).


Grazie Wolfgang! Questo e 'esattamente quello che stavo cercando. Ora posso provare a replicarlo in Excel (per i miei studenti che usano solo Excel).
Galit Shmueli,

11

Il modo ingenuo per calcolare la correlazione automatica (e possibilmente ciò che utilizza Excel) è creare 2 copie del vettore quindi rimuovere i primi n elementi dalla prima copia e gli ultimi n elementi dalla seconda copia (dove n è il ritardo stanno calcolando da). Quindi passare quei 2 vettori alla funzione per calcolare la correlazione. Questo metodo è OK e fornirà una risposta ragionevole, ma ignora il fatto che i 2 vettori che vengono confrontati sono in realtà misure della stessa cosa.

La versione migliorata (come mostrato da Wolfgang) è una funzione simile alla correlazione regolare, tranne per il fatto che utilizza l'intero vettore per calcolare la media e la varianza.


3
L'altra differenza è il fattore 1 / n invece di 1 / (nk) dove n è la lunghezza della serie e k il numero di ritardi. Questo per garantire che la matrice di autocorrelazione sia definita positiva.
Rob Hyndman,

1
@Rob: credo che la formula CORREL di Excel utilizzi n (anziché nk). Ad esempio, per ACF lag-1 ottieni lo stesso risultato (usando la notazione di Wolfgang) se usi COVAR (res [1:49], res [2:50]) / (STDEVP (res [1:49]) * STDEVP (res [2:50])) e le funzioni COVAR e STDEVP sono statistiche di "popolazione".
Galit Shmueli,

@Galit. Anche usando COVAR e STDEVP, il denominatore nel tuo codice sarebbe 49, ma la definizione preferita di autocorrelazione utilizzerà 50.
Rob Hyndman,

1
Il punto 1 / n vs 1 / (nk) è buono per la comprensione oltre agli altri punti sopra. Ma per i numeri pratici / osservati non importerà finché sarà coerente, poiché quel termine appare sia nel numeratore che nel denominatore che cancellerà. Potresti avere un problema se nel numeratore e nel denominatore fossero utilizzate frazioni diverse.
Greg Snow,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.