2015-07-05 64 views
0

我有一系列的數據x,y和我試圖找到移動平均線。 x數據編號是從1到100的整數,而y數據是從0.01到1的數字,並且它們也有標準偏差y_dev(由於實驗重複幾次而得出)。 我想用20個最近的鄰居(利用Matlab)來找到移動平均線:移動平均線和錯誤 - Matlab

num_data=length(x) 
mov_average=y 
for i=11,num_data-10 % we leave the data in the edges the same 
ind1(i)=i-10 
ind2(i)=i+10 
mov_average(i)=mean(y(ind1(i):ind2(i))); 
end 

上述方式導出均線,但我不知道如何使用標準偏差,我對每個Y數據點,因爲一些數據點比其他數據點有更大的標準偏差,這意味着它們不如其他數據可靠(因此它們可能重量更輕)。如何在上述計算中包含每個數據點的標準偏差?

謝謝。

+0

移動_average_或移動_median_?關於「如何在上述計算中包含每個數據點的標準偏差」這個問題,這取決於你想要做什麼。你應該先決定(這不是一個編程問題)。一個建議:你不能使用每個'x'的整套數據(而不僅僅是平均值和標準偏差),並從中計算平均值/中值? –

+0

@LuisMendo我想做移動平均線(我編輯了代碼來反映這一點)。數據集是一個時間序列實驗,它已經重複了好幾次(這是我對每個點的標準偏差)。我想在計算移動平均線時使用每個點的標準偏差,因爲我希望標準偏差較小的點比標準偏差較大的點多。 –

回答

1

假設你有一個向量a。那麼另一種編寫mean(a)作爲加權平均的方式是a*wts',其中wts = ones(1,numel(a))/numel(a)。在你的情況下,你有a = y(ind1(i):ind2(i))

這聽起來像你想要使用的是一個加權移動平均值,其中你的權重wts不再相同,但是使用相應值的標準偏差來選擇。

假設矢量sd持有的標準偏差,這裏是這樣做的一種方法:

num_data=length(x) 
mov_average=y 
for i=11,num_data-10 
    ind1(i)=i-10 
    ind2(i)=i+10 
    sds = 1./sd(ind1(i):ind2(i)); % smaller sd -> larger weight 
    wts = sds./sum(sds); % weights should sum to 1 
    mov_average(i) = y*wts'; 
end 

這裏,較小的標準偏差值將有助於更大的權重。

另一種想法是計算y和標準偏差sd的簡單移動平均值,然後將它們並排繪製在一起。

wts = ones(1,10)/10; 
y_mean = conv(y, wts, 'valid'); % moving avg of y 
y_lb = y + conv(sd, wts, 'valid'); % moving avg of lower bound on y 
y_ub = y - conv(sd, wts, 'valid'); % moving avg of upper bound on y 

這比選擇權重作爲標準偏差的函數更具統計可解釋性的優點。

+0

謝謝。這正是我所期待的!它對我的數據非常有用。 –