Uma amostra grátis de autocorrelação

11

Considere um vetor unidimensional e com valor real x que representa observações de algum processo medido em intervalos igualmente espaçados ao longo do tempo. Chamamos x de uma série temporal .

Vamos n denotar o comprimento de X e X denotam a média aritmética dos x . A função de autocovariância de amostra é definida como

autocovariância

para todos - n < h < n . Isso mede a dependência linear entre dois pontos da mesma série observada em momentos diferentes.

A função de autocorrelação de amostra , ou ACF, é definida como

autocorrelação

Isso mede a previsibilidade linear da série x no tempo t , que denotamos x t , usando apenas o valor x t + h .

Observe que essas estimativas amostrais não correspondem aos cálculos ingênuos com base nas propriedades teóricas. Ou seja, a função de autocorrelação da amostra não é igual ao coeficiente de correlação de Pearson de x com o intervalo h- passo de x .

Tarefa

Dada uma matriz x e um número inteiro não negativo h , imprima ou retorne as primeiras autocorrelações h +1 de atraso de x , começando com o lag 0. As autocorrelações de atraso são aquelas que correspondem a entradas negativas nas fórmulas acima.

Você pode assumir que 0 < h < n , onde n é o comprimento de x , e que 2 < n <256.

A saída deve estar correta dentro de 1E-4. Não há restrições quanto ao uso de funções internas ou ao tempo de execução.

Exemplos

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

Respostas:

4

Gelatina, 26 25 24 23 20 bytes

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

Experimente online!

Como 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
fonte
6

R, 3 31 25 bytes

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

Uso (retorna uma matriz com as autocorrelações)

(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

Fundo:

A solução de 31 bytes com base no original acfincorporado

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

Observe que a opção de 3 bytes acfé o original que será plotado (e impresso em 3 dígitos), retornando a correlação automática necessária como um elemento em uma lista.

uso

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

resultado:

#    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 

Se quisermos que as correlações sejam exibidas com mais de três casas decimais, 28 bytes o farão (ou 31, se quisermos suprimir o 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
fonte
Este é provavelmente o truque mais inteligente que eu já vi. Eu não tinha ideia de que alguém poderia fazer isso. Estamos tentando selecionar R como o idioma do mês. Você pode aprovar essa meta resposta para que isso aconteça.
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 solução provavelmente vai ser jogada ainda mais, é apenas um começo.

Você pode chamá-lo com:

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

MATL , 20 bytes

tYm-tPX+tX>/GnqiQ:+)

EDIT (20 de maio de 2016): a partir da versão 18.0.0 do idioma, use em Y+vez de X+. O link inclui essa alteração.

Experimente online!

A correlação está intimamente relacionada à convolução. Normalizamos subtraindo a média e, em seguida, envolvemos, normalizamos novamente dividindo pelo valor máximo e, em seguida, selecionamos os atrasos desejados.

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

Mathematica, 27 bytes

Agradecemos a LegionMammal978 por economizar 1 byte.

Poderíamos vencer o Jelly se os nomes das funções não fossem tão longos.

#2~CorrelationFunction~{#}&

Caso de teste

%[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
fonte
Eu estava prestes a postar isso antes da minha Internet cair ... Você pode salvar um byte #2~CorrelationFunction~{#}&.
LegionMammal978 17/02
1

Oitava, 47 37 bytes

@(h,x)xcov(x,'coeff')(numel(x)+(0:h))
Rainer P.
fonte
@Rainer Você pode talvez economizar alguns bytes usando uma função anônima (e, nesse caso, eu acho que você pode ignorar disp, porque você está returnig uma saída de função)
Luis Mendo
@LuisMendo Você está certo. Salva 10 bytes, mesmo sem contar o disp.
Rainer P.