É possível extrair pontos de dados da movimentação de dados médios?
Em outras palavras, se um conjunto de dados tiver apenas médias móveis simples dos 30 pontos anteriores, é possível extrair os pontos de dados originais?
Se sim, como?
É possível extrair pontos de dados da movimentação de dados médios?
Em outras palavras, se um conjunto de dados tiver apenas médias móveis simples dos 30 pontos anteriores, é possível extrair os pontos de dados originais?
Se sim, como?
Respostas:
+1 na resposta da fabee, que está completa. Apenas uma nota para traduzi-lo para R, com base nos pacotes que encontrei para executar as operações em mãos. No meu caso, eu tinha dados que são previsões de temperatura da NOAA em uma base de três meses: jan-fev-mar, fev-mar-abr, mar-abr-maio, etc., e queria dividi-los em (aproximado) mensais, assumindo que a temperatura de cada período de três meses seja essencialmente uma média.
library (Matrix)
library (matrixcalc)
# Feb-Mar-Apr through Nov-Dec-Jan temperature forecasts:
qtemps <- c(46.0, 56.4, 65.8, 73.4, 77.4, 76.2, 69.5, 60.1, 49.5, 41.2)
# Thus I need a 10x12 matrix, which is a band matrix but with the first
# and last rows removed so that each row contains 3 1's, for three months.
# Yeah, the as.matrix and all is a bit obfuscated, but the results of
# band are not what svd.inverse wants.
a <- as.matrix (band (matrix (1, nrow=12, ncol=12), -1, 1)[-c(1, 12),])
ai <- svd.inverse (a)
mtemps <- t(qtemps) %*% t(ai) * 3
O que funciona muito bem para mim. Obrigado @fabee.
EDIT: OK, traduzindo meu R para Python, recebo:
from numpy import *
from numpy.linalg import *
qtemps = transpose ([[46.0, 56.4, 65.8, 73.4, 77.4, 76.2, 69.5, 60.1, 49.5, 41.2]])
a = tril (ones ((12, 12)), 2) - tril (ones ((12, 12)), -1)
a = a[0:10,:]
ai = pinv (a)
mtemps = dot (ai, qtemps) * 3
(O que demorou muito mais para depurar do que a versão R. Primeiro, porque eu não estou tão familiarizado com Python quanto com R, mas também porque R é muito mais utilizável interativamente.)
Eu tento colocar o que o whuber disse em resposta. Digamos que você tenha um vetor grande com n = 2000 entradas. Se você calcular uma média móvel com uma janela de comprimento ℓ = 30 , poderá escrever isso como uma multiplicação da matriz vetorial y = A x do vetor x com a matriz
que possui que são deslocados à medida que você avança pelas linhas até que os 30 atinjam o final da matriz. Aqui, o vetor médio y tem dimensões de 1970. A matriz tem 1970 linhas e colunas. Portanto, não é invertível.
(consulte a Wikipedia ).
através do pseudo-inverso.
Muitos programas numéricos oferecem pseudo-inversos (por exemplo, Matlab, numpy em python, etc.).
Aqui seria o código python para gerar os sinais do meu exemplo:
from numpy import *
from numpy.linalg import *
from matplotlib.pyplot import *
# get A and its inverse
A = (tril(ones((2000,2000)),-1) - tril(ones((2000,2000)),-31))/30.
A = A[30:,:]
pA = pinv(A) #pseudo inverse
# get x
x = random.randn(2000) + 5
y = dot(A,x)
# reconstruct
x2 = dot(pA,y)
plot(x,label='original x')
plot(y,label='averaged x')
plot(x2,label='reconstructed x')
legend()
show()
Espero que ajude.