Formule d'autocorrélation dans R vs Excel

13

J'essaie de comprendre comment R calcule l'autocorrélation lag-k (apparemment, c'est la même formule utilisée par Minitab et SAS), afin de pouvoir le comparer à l'utilisation de la fonction CORREL d'Excel appliquée à la série et à sa version k-lagged. R et Excel (en utilisant CORREL) donnent des valeurs d'autocorrélation légèrement différentes.

Je serais également intéressé de savoir si un calcul est plus correct que l'autre.

Galit Shmueli
la source
RLa formule est analysée plus en détail et expliquée sur stats.stackexchange.com/questions/81754/… .
whuber

Réponses:

17

L'équation exacte est donnée dans: Venables, WN et Ripley, BD (2002) Modern Applied Statistics with S. Fourth Edition. Springer-Verlag. Je vais vous donner un exemple:

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

Et ainsi de suite (par exemple, res[1:47]et res[4:50]pour le décalage 3).

Wolfgang
la source
Merci Wolfgang! Ceci est exactement ce que je cherchais. Maintenant, je peux essayer de le répliquer dans Excel (pour mes étudiants qui utilisent Excel uniquement).
Galit Shmueli
11

La manière naïve de calculer la corrélation automatique (et éventuellement ce qu'Excel utilise) est de créer 2 copies du vecteur puis de supprimer les 1ers n éléments de la première copie et les n derniers éléments de la deuxième copie (où n est le décalage que vous calculent à partir de). Passez ensuite ces 2 vecteurs à la fonction pour calculer la corrélation. Cette méthode est OK et donnera une réponse raisonnable, mais elle ignore le fait que les 2 vecteurs comparés sont vraiment des mesures de la même chose.

La version améliorée (comme le montre Wolfgang) est une fonction similaire à la corrélation régulière, sauf qu'elle utilise le vecteur entier pour calculer la moyenne et la variance.

Greg Snow
la source
3
L'autre différence est le facteur 1 / n au lieu de 1 / (nk) où n est la longueur de la série et k le nombre de retards. Il s'agit de s'assurer que la matrice d'autocorrélation est définie positive.
Rob Hyndman
1
@Rob: Je crois que la formule CORREL d'Excel utilise n (plutôt que nk). Par exemple, pour lag-1 ACF, vous obtenez le même résultat (en utilisant la notation de Wolfgang) si vous utilisez COVAR (res [1:49], res [2:50]) / (STDEVP (res [1:49]) * STDEVP (res [2:50])) et les fonctions COVAR et STDEVP sont des statistiques "population".
Galit Shmueli
@Galit. Même en utilisant COVAR et STDEVP, le dénominateur dans votre code serait 49, mais la définition préférée de l'autocorrélation utilisera 50.
Rob Hyndman
1
Le point 1 / n vs 1 / (nk) est bon pour la compréhension en plus des autres points ci-dessus. Mais pour les nombres pratiques / observés, cela n'aura pas d'importance tant qu'il est cohérent, car ce terme apparaît à la fois au numérateur et au dénominateur qu'il annulera. Vous pourriez avoir un problème si différentes fractions étaient utilisées dans le numérateur et le dénominateur.
Greg Snow