Un échantillon gratuit d'autocorrélation

11

Considérons un vecteur x à valeur réelle unidimensionnel qui représente les observations de certains processus mesurés à des intervalles également espacés dans le temps. Nous appelons x une série chronologique .

Soit n la longueur de x et la moyenne arithmétique de x . L' exemple de fonction d' autocovariance est défini comme

autocovariance

pour tous - n < h < n . Cela mesure la dépendance linéaire entre deux points sur la même série observée à des moments différents.

L' exemple de fonction d' autocorrélation , ou ACF, est défini comme

autocorrélation

Cela mesure la prévisibilité linéaire de la série x au temps t , que nous désignons x t , en utilisant uniquement la valeur x t + h .

Notez que ces estimations d'échantillon ne correspondent pas aux calculs naïfs basés sur les propriétés théoriques. C'est-à-dire que la fonction d'autocorrélation de l'échantillon n'est pas égale au coefficient de corrélation de Pearson de x avec le décalage h- step de x .

Tâche

Étant donné un tableau x et un entier non négatif h , affichez ou renvoyez les premières autocorrélations de décalage h +1 de x , en commençant par le décalage 0. Les corrélations de décalage sont celles correspondant aux entrées négatives dans les formules ci-dessus.

Vous pouvez supposer que 0 < h < n , où n est la longueur de x , et que 2 < n <256.

La sortie doit être correcte à 1E-4 près. Il n'y a aucune restriction sur l'utilisation des fonctions intégrées ou le temps d'exécution.

Exemples

h, x -> output
--------------
5, [2.4, 2.4, 2.4, 2.2, 2.1, 1.5, 2.3, 2.3, 2.5, 2] -> [1.00000000,  0.07659298, -0.06007802, -0.51144343, -0.02912874, -0.10468140]
1, [2134, 1863, 1877, 1877, 1492, 1249] -> [1.0000000, 0.3343041]
2, [13067.3, 13130.5, 13198.4] -> [1.0000000000, -0.0002854906, -0.4997145094]
Alex A.
la source

Réponses:

4

Gelée, 26 25 24 23 20 octets

×L_SµḊ;0µƓС׹S€µF÷Ḣ

Essayez-le en ligne!

Comment ça fonctionne

×L_SµḊ;0µƓС׹S€µF÷Ḣ  Main link. Input: x (list) STDIN: h (integer)

×L                    Multiply all items in x by the length of x.
  _S                  Subtract the sum of x from all products.
                      Let's call the result X.
    µ                 Begin a new monadic chain. Argument: t (list)
     Ḋ                Remove the first element of t.
      ;0              Append a 0 to the result.
        µ             Push the previous chain and begin a new one.
                      Argument: X
         Ɠ            Read h from STDIN.
          С          Repeat the Ḋ;0 chain h times, collecting the h+1 intermediate
                      results in a list A.
            ×¹        Multiply the vectors in A by X.
              S€      Compute the sum of each vectorized product.
                µ     Begin a new, monadic chain. Argument: S (sums)
                 F    Flatten S. This does nothing except creating a deep copy.
                   Ḣ  Pop the first element of S.
                  ÷   Divide all elements of the copy by the first element.
Dennis
la source
6

R, 3 31 25 octets

# changes the builtin to only return the acf
body(acf)=body(acf)[1:18]

Utilisation (retourne un tableau avec les autocorrélations)

(acf(c(2.4, 2.4, 2.4, 2.2, 2.1, 1.5, 2.3, 2.3, 2.5, 2),5))
# , , 1
#
#             [,1]
# [1,]  1.00000000
# [2,]  0.07659298
# [3,] -0.06007802
# [4,] -0.51144343
# [5,] -0.02912874
# [6,] -0.10468140

Contexte:

La solution de 31 octets basée sur l'original acfintégré

function(n,h)c(acf(n,h,,F)$acf)

Notez que l'option 3 octets acfest l'original construit dans lequel tracera (et imprimera sur 3 chiffres) tout en renvoyant l'autocorrélation requise en tant qu'élément dans une liste.

usage

 acf(c(2.4, 2.4, 2.4, 2.2, 2.1, 1.5, 2.3, 2.3, 2.5, 2),5)

production:

#    Autocorrelations of series ‘c(2.4, 2.4, 2.4, 2.2, 2.1, 1.5, 2.3, 2.3, 2.5, 2)’, by lag
#
#     0      1      2      3      4      5 
# 1.000  0.077 -0.060 -0.511 -0.029 -0.105 

Si nous voulons que les corrélations s'affichent à plus de 3 décimales, alors 28 octets le feront (ou 31, si nous voulons supprimer le tracé)

# will still plot (28 bytes)
function(n,h)c(acf(n,h)$acf)
# won't plot (31 bytes)
function(n,h)c(acf(n,h,,F)$acf)
mnel
la source
C'est probablement le truc le plus intelligent que j'aie jamais vu. Je n'avais aucune idée que l'on pouvait faire ça. Nous essayons de faire sélectionner R comme Langue du mois - vous pouvez voter pour cette méta-réponse pour que cela se produise.
JayCe
3

Python 3, 147 130 126 120 120 octets

def p(h,x):x=[t-sum(x)/len(x)for t in x];return[sum(s*t for s,t in zip(x[n:],x))/sum(b*b for b in x)for n in range(h+1)]

Cette solution va probablement être étudiée plus loin, ce n'est qu'un début.

Vous pouvez l'appeler avec:

p(5,[2.4, 2.4, 2.4, 2.2, 2.1, 1.5, 2.3, 2.3, 2.5, 2])
Cameron Aavik
la source
2

MATL , 20 octets

tYm-tPX+tX>/GnqiQ:+)

EDIT (20 mai 2016): à partir de la version 18.0.0 de la langue, utilisez à la Y+place de X+. Le lien inclut cette modification.

Essayez-le en ligne!

La corrélation est étroitement liée à la convolution. Nous normalisons en soustrayant la moyenne, puis convolutons, normalisons à nouveau en divisant par la valeur maximale, puis choisissons les décalages souhaités.

tYm-       % implicit input. Duplicate and subtract mean
tPX+       % duplicate, flip, convolve
tX>/       % duplicate, divide by maximum value
Gnq        % length of array, n. Subtract 1
iQ:        % input number h. Generate vector [1,2,...,h+1]
+          % add to obtain vector [n,n+1,...,n+h]
)          % use that vector as an index. Implicitly display
Luis Mendo
la source
1

Mathematica, 27 octets

Merci à LegionMammal978 pour avoir économisé 1 octet.

Nous pourrions battre Jelly si les noms de fonction n'étaient pas si longs.

#2~CorrelationFunction~{#}&

Cas de test

%[5,{2.4,2.4,2.4,2.2,2.1,1.5,2.3,2.3,2.5,2}]
(* {1.,0.076593,-0.060078,-0.511443,-0.0291287,-0.104681} *)
njpipeorgan
la source
J'étais sur le point de publier ceci avant que mon Internet ne tombe en panne ... Vous pouvez enregistrer un octet avec #2~CorrelationFunction~{#}&.
LegionMammal978
1

Octave, 47 37 octets

@(h,x)xcov(x,'coeff')(numel(x)+(0:h))
Rainer P.
la source
@Rainer Vous pouvez peut-être enregistrer quelques octets en utilisant une fonction anonyme (et dans ce cas, je pense que vous pouvez ignorer disp, car vous renvoyez une sortie de fonction)
Luis Mendo
@LuisMendo Vous avez raison. Enregistré 10 octets, même sans compter le disp.
Rainer P.