2

所以我想构建一个不同月份不同权重的移动时间平均值。例如,请参阅http://www.mathworks.com/help/matlab/data_analysis/filtering-data.html上的过滤器功能,其中 b = 每个月的天数,a = 一年的天数。

但问题是,时间序列是每个月的一系列温度(我想为每组可能的年份构建一个年平均温度,例如,一年可能是从 3 月到 2 月)。使用这种方法,每个窗口中的第一个月将被加权为 31/365,无论第一个月是 1 月还是 6 月。

在这种情况下,标准过滤算法将不起作用。有替代方案吗?

包含闰年的解决方案也很好,但对于初始解决方案不是必需的。

4

1 回答 1

3

加权平均值定义为sum(x .* weights) / sum(weights)。如果你想以移动平均的方式计算这个,我想你可以这样做(未经测试):

moving_sum = @(n, x) filter(ones(1,n), 1, x);
moving_weighted_avg = moving_sum(12, temperature .* days_per_month) ...
    ./ moving_sum(12, days_per_month);

如果temperature是每月温度的向量并days_per_month包含相应月份的实际天数,这甚至应该在闰年的情况下工作。

编辑以回答评论

您可以像这样重建days_per_month

start_year = 2003;
start_month = 10;
nmonth = 130;
month_offset = 0:nmonth - 1;

month = mod(start_month + month_offset - 1, 12) + 1;
year = start_year + floor((start_month + month_offset - 1) / 12);
days_in_month = eomday(year, month);

disp([month_offset; year; month; days_in_month]') %print table to check
于 2013-08-18T22:38:18.783 回答