Una muestra gratis de autocorrelación

11

Considere un vector x unidimensional de valor real que representa observaciones de algún proceso medido a intervalos igualmente espaciados a lo largo del tiempo. Llamamos x una serie de tiempo .

Supongamos que n denota la longitud de x y denota la media aritmética de x . La función de autocovarianza de muestra se define como

autocovarianza

para todos - n < h < n . Esto mide la dependencia lineal entre dos puntos en la misma serie observada en diferentes momentos.

La función de autocorrelación de muestra , o ACF, se define como

autocorrelación

Esto mide la predictibilidad lineal de la serie x en el tiempo t , que denotamos x t , usando solo el valor x t + h .

Tenga en cuenta que estas estimaciones de muestra no coinciden con los cálculos ingenuos basados ​​en las propiedades teóricas. Es decir, la función de autocorrelación de la muestra no es igual al coeficiente de correlación de Pearson de x con el h -step lag de x .

Tarea

Dada una matriz xy un número entero no negativo h , imprime o devuelve las primeras autocorrelaciones de retraso h +1 de x , comenzando con el retraso 0. Las autocorrelaciones de retraso son las correspondientes a entradas negativas en las fórmulas anteriores.

Puede suponer que 0 < h < n , donde n es la longitud de x , y que 2 < n <256.

La salida debe ser correcta dentro de 1E-4. No hay restricciones sobre el uso de funciones integradas o el tiempo de ejecución.

Ejemplos

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.
fuente

Respuestas:

4

Jalea, 26 25 24 23 20 bytes

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

Pruébalo en línea!

Cómo funciona

×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
fuente
6

R, 3 31 25 bytes

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

Uso (devuelve una matriz con las autocorrelaciones)

(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

Antecedentes:

La solución de 31 bytes basada en el original acfincorporado

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

Tenga en cuenta que la opción de 3 bytes acfes el original incorporado que trazará (e imprimirá a 3 dígitos) mientras devuelve la autocorrelación requerida como un elemento en una lista.

uso

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

salida:

#    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 queremos que las correlaciones se muestren con más de 3 decimales, entonces 28 bytes lo harán (o 31, si queremos suprimir el gráfico)

# 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
fuente
Este es probablemente el truco más inteligente que he visto. No tenía idea de que alguien pudiera hacer eso. Estamos tratando de que R sea seleccionado como Idioma del mes; puede votar esta meta respuesta para que suceda.
JayCe
3

Python 3, 147 130 126 120 bytes

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

Esta solución probablemente se vaya a jugar más, es solo un comienzo.

Puedes llamarlo con:

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

MATL , 20 bytes

tYm-tPX+tX>/GnqiQ:+)

EDITAR (20 de mayo de 2016): a partir de la versión 18.0.0 del lenguaje, use en Y+lugar de X+. El enlace incluye este cambio.

Pruébalo en línea!

La correlación está estrechamente relacionada con la convolución. Normalizamos restando la media, luego convolucionamos, normalizamos nuevamente dividiendo entre el valor máximo y luego seleccionamos los rezagos deseados.

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
fuente
1

Mathematica, 27 bytes

Gracias a LegionMammal978 por guardar 1 byte.

Podríamos vencer a Jelly si los nombres de las funciones no fueran tan largos.

#2~CorrelationFunction~{#}&

Caso de prueba

%[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
fuente
Estaba a punto de publicar esto antes de que mi Internet se cayera ... Puede guardar un byte con #2~CorrelationFunction~{#}&.
LegionMammal978
1

Octava, 47 37 bytes

@(h,x)xcov(x,'coeff')(numel(x)+(0:h))
Rainer P.
fuente
@Rainer Quizás pueda guardar algunos bytes usando una función anónima (y en ese caso creo que puede omitir disp, porque está devolviendo una salida de función)
Luis Mendo
@LuisMendo Tienes razón. Guardado 10 bytes, incluso sin contar el disp.
Rainer P.