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]

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.

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)

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])

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

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} *)

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 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.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.