移动平均值和错误 - Matlab

时间:2015-07-05 15:07:40

标签: matlab average

我有一系列数据x,y,我正试图找到移动平均线。 x数据是从1到100的整数,而y数据是从0.01到1的数字,并且它们还具有标准偏差y_dev(我们得出这是因为实验重复了几次)。 我试图找到使用20个最近邻居的移动平均线(使用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数据点的标准偏差,因为有些数据点的标准差比其他数据点大得多,这意味着它们不像其他数据点那样可靠(所以他们可能重量更轻)。如何在上述计算中包含每个数据点的标准差?

谢谢。

1 个答案:

答案 0 :(得分: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

这具有比在标准差中选择权重更具统计可解释性的优势。