¿Es posible extraer puntos de datos de datos de promedio móvil?
En otras palabras, si un conjunto de datos solo tiene promedios móviles simples de los 30 puntos anteriores, ¿es posible extraer los puntos de datos originales?
¿Si es así, cómo?
¿Es posible extraer puntos de datos de datos de promedio móvil?
En otras palabras, si un conjunto de datos solo tiene promedios móviles simples de los 30 puntos anteriores, ¿es posible extraer los puntos de datos originales?
¿Si es así, cómo?
Respuestas:
+1 a la respuesta de fabee, que está completa. Solo una nota para traducirlo a R, en función de los paquetes que he encontrado para realizar las operaciones en cuestión. En mi caso, tenía datos que son pronósticos de temperatura NOAA por tres meses: enero-febrero-marzo, febrero-marzo-abril, marzo-abril-mayo, etc., y quería dividirlos en (aproximadamente) valores mensuales, suponiendo que la temperatura de cada período de tres meses es esencialmente un promedio.
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
Lo cual funciona muy bien para mí. Gracias @fabee.
EDITAR: OK, traduciendo mi R a Python, obtengo:
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
(Lo que llevó mucho más tiempo depurar que la versión R. Primero porque no estoy tan familiarizado con Python como con R, pero también porque R es mucho más utilizable de forma interactiva).
Muchos programas numéricos ofrecen pseudo-inversas (por ejemplo, Matlab, numpy en python, etc.).
Aquí estaría el código de Python para generar las señales de mi ejemplo:
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 ayude.