我有一系列数据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数据点的标准偏差,因为有些数据点的标准差比其他数据点大得多,这意味着它们不像其他数据点那样可靠(所以他们可能重量更轻)。如何在上述计算中包含每个数据点的标准差?
谢谢。
答案 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
这具有比在标准差中选择权重更具统计可解释性的优势。