2016-04-12 12 views
1

Ich versuche die (unbekannten) ursprünglichen Datenpunkte zu schätzen, die in die Berechnung eines (bekannten) gleitenden Durchschnitts einflossen. Allerdings weiß ich einige der ursprünglichen Datenpunkte, und ich bin mir nicht sicher, wie Sie diese Informationen verwenden.Rückwärtsberechnung von Originaldaten von einem bekannten gleitenden Durchschnitt

Ich verwende die Methode in den Antworten hier angegeben: https://stats.stackexchange.com/questions/67907/extract-data-points-from-moving-average, aber in MATLAB (mein Code unten). Diese Methode funktioniert ziemlich gut für große Datenpunkte (> 1000), aber weniger gut mit weniger Datenpunkten, wie Sie es erwarten würden.

window = 3; 
datapoints = 150; 
data = 3*rand(1,datapoints)+50; 
moving_averages = []; 
for i = window:size(data,2) 
    moving_averages(i) = mean(data(i+1-window:i)); 
end 

length = size(moving_averages,2)+(window-1); 
a = (tril(ones(length,length),window-1) - tril(ones(length,length),-1))/window; 
a = a(1:length-(window-1),:); 
ai = pinv(a); 

daily = mtimes(ai,moving_averages'); 

x = 1:size(data,2); 
figure(1) 
hold on 
plot(x,data,'Color','b'); 
plot(x(window:end),moving_averages(window:end),'Linewidth',2,'Color','r'); 
plot(x,daily(window:end),'Color','g'); 
hold off 
axis([0 size(x,2) min(daily(window:end))-1 max(daily(window:end))+1]) 
legend('original data','moving average','back-calculated') 

Jetzt sagen, ich kenne ein paar der ursprünglichen Datenpunkte. Ich habe Probleme herauszufinden, wie ich diese Informationen verwenden könnte, um den Rest genauer zu berechnen. Danke für jede Hilfe.

Antwort

0

Sie sollten in der Lage sein, die Originaldaten genau zu berechnen, wenn Sie zu irgendeinem Zeitpunkt die Daten eines Fensters genau bestimmen können, d. H. In diesem Fall n-1 Abtastwerte in einem Fenster der Länge n. (In Ihrem Fall) Wenn Sie A, B und (A + B + C)/3 kennen, können Sie jetzt lösen und wissen C. Jetzt, wenn Sie (B + C + D)/3 (Ihr gleitender Durchschnitt) haben, können Sie genau für D. lösen. Spülen und wiederholen. Diese Logik funktioniert auch rückwärts. Hier

1

ist ein Beispiel mit den same idea:

% the actual vector of values 
a = cumsum(rand(150,1) - 0.5); 

% compute moving average 
win = 3; % sliding window length 
idx = hankel(1:win, win:numel(a)); 
m = mean(a(idx)); 

% coefficient matrix: m(i) = sum(a(i:i+win-1))/win 
A = repmat([ones(1,win) zeros(1,numel(a)-win)], numel(a)-win+1, 1); 
for i=2:size(A,1) 
    A(i,:) = circshift(A(i-1,:), [0 1]); 
end 
A = A/win; 

% solve linear system 
%x = A \ m(:); 
x = pinv(A) * m(:); 

% plot and compare 
subplot(211), plot(1:numel(a),a, 1:numel(m),m) 
legend({'original','moving average'}) 
title(sprintf('length = %d, window = %d',numel(a),win)) 
subplot(212), plot(1:numel(a),a, 1:numel(a),x) 
legend({'original','reconstructed'}) 
title(sprintf('error = %f',norm(x(:)-a(:)))) 

result

Sie können sehen, die Rekonstruktionsfehler sehr klein sind, auch die Datengrößen in Ihrem Beispiel unter Verwendung von (150 Proben mit einer 3-Proben gleitender Durchschnitt).

Verwandte Themen