【问题标题】:moving average and errors - Matlab移动平均线和误差 - Matlab
【发布时间】:2015-07-05 15:07:39
【问题描述】:

我有一系列数据 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 数据点的标准差,因为某些数据点的标准差比其他数据点大得多,这意味着它们不如其他数据点可靠(所以它们的重量可能更轻)。如何在上述计算中包含每个数据点的标准差?

谢谢。

【问题讨论】:

  • 移动平均还是移动中位数?关于“我如何在上述计算中包含每个数据点的标准偏差”这个问题,这取决于您想要做什么。您应该首先决定(这不是编程问题)。一个建议:你不能为每个x 使用整个数据集(而不仅仅是平均值和标准差)并从中计算平均值/中位数吗?
  • @LuisMendo 我想做移动平均线(我编辑了代码以反映这一点)。数据集是一个时间序列实验,它已经重复了几次(这就是我对每个点都有标准偏差的方式)。我想在计算移动平均值时使用每个点的标准差,因为我希望标准差较小的点比标准差较大的点权重。

标签: matlab average


【解决方案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

与选择权重作为标准差的函数相比,这具有更易于统计解释的优势。

【讨论】:

  • 谢谢。这正是我想要的!它对我的数据非常有效。
猜你喜欢
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 2022-01-26
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多