2015-07-05 65 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

谢谢。这正是我所期待的!它对我的数据非常有用。 –