Copyright OpenScience © 2018.
- by Batystuta Rocha, 30 Nov, 2018.
Versão 1.0 novembro 2018.
Introdução: significa a correlação cruzada de um sinal com o ele próprio. É uma ferramenta matemática para encontrar padrões de repetição, tal como a presença de um sinal periódico obscurecidos pelo ruído, ou para identificar a frequência fundamental em falta num sinal implícita pelas suas frequências harmónicas. É frequentemente utilizada no processamento de sinais para a análise de funções ou série de valores, como por exemplo sinais no domínio do tempo. Apesar de ser um fenômeno típico de séries temporais, pode também ocorrer em dados do tipo cross-section, entretanto neste tipo de dado a disposição das informações deve apresentar alguma lógica ou interesse científico para que possamos compreender qualquer decisão sobre a presença ou não de autocorrelação.
Visando tornar o processo mais claro, usarei alguns passos para a nossa Autocorrelação em Python:
1. Importação das Bibliotecas:¶
%matplotlib inline
from __future__ import print_function
import csv
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats.stats import pearsonr
2. Declaração da variável tempo (t) e da variável em análise (y):¶
t = []
y = []
3. Leitura do arquivo '.txt' com os dados:¶
0.0 1.399
0.1 1.990
0.2 1.317
0.3 0.811
0.4 1.550
... ...
... ...
3.0 1.425
3.1 1.718
3.2 1.188
with open('Dados_Correlação.txt', newline='') as inputfile:
for row in csv.reader(inputfile, delimiter=' '):
t.append(float(row[0]))
y.append(float(row[1]))
4. Obtenção dos valores flutuantes através da diferencia do valor registrado 'y' com a sua média:¶
Propriedade descritiva do dado calculado primeiro é o valor médio: $$\large \overline{y}=\frac{1}{N}\sum_{n=1}^{N}y_{n}$$
Propriedade em seguida são os valores flutuantes: $$\large y_{flutuante}=y-\overline{y}$$
y = y - np.mean(y)
5. Função que calcula a Autocorrelação:¶
def correlacao_vetor(vetor_1, vetor_2):
correlacao = []
if len(vetor_1) == len(vetor_2):
cont = len(vetor_1)
for i in range(cont-3):
aux = pearsonr(vetor_1, vetor_2)
# print(np.corrcoef(vetor_1,vetor_2))
# print(aux)
correlacao.append(float(aux[0]))
vetor_1 = vetor_1[:(len(vetor_1) - 1)]
vetor_2 = vetor_2[1:]
return correlacao
Aqui estou plotando os resultados em um gráfico para uma análise visual e também para uma comparação com um sinal harmônico.
t2 = np.arange(0, t[len(t)-3], 0.01)
yt2 = 0.6*np.cos(3*np.pi*(t2/0.5))
plt.plot(t[:(len(t)-3)],correlacao_vetor(y,y), t2, yt2, '-')
plt.show()