计算时间序列的每月平均值、第 90 个和第 99 个百分位数



我正在阅读这篇关于风速趋势的文章,他们在方法中指定他们试图确定在所示时间段内风速的月平均值、第 90 和第 99 个百分位值的时间序列中是否存在趋势。如何实现这一目标?此外,第 90 和第 99 个百分位数是什么意思?我的例子:

v = datenum(1981, 1, 1):datenum(2010, 11, 31); % time vector
d = rand(1,length(v)); % data vector
% calculate mean, 90th and 99th percentile values
dateV = datevec(v); % date vector
[~,~,b] = unique(dateV(:,1:2),'rows');
monthly_v = accumarray(b,v,[],@mean);
monthly_d = accumarray(b,d,[],@mean);

我可以通过上面显示的方法计算每月平均值,但不确定如何计算第 90 和第 99 个百分位数(另外我什至不确定它是什么)。任何人都可以提供一些这方面的信息吗?

使用 prctile 函数。 您正在寻找的是一个阈值,其中超过此阈值的输入数据的比例/百分比100% - percentile 。 例如,如果您寻求 90% 分位数,则您正在尝试在输入数据中查找 10% 的数据超过此数量的数量。 对于 99% 百分位数,您将在输入数据中查找 1% 的数据超过此阈值的数量。 您可以通过以下方式简单地拨打prctile

Y = prctile(X, P);

X是以矢量形式存储的数据,P是列出所需百分位数的矢量或单个数字。 输出将是我们刚刚谈到的那些阈值,存储在 Y .

在您的情况下,vd是您想要查找每月百分位数的数据,因此您将像这样修改您的accumarray调用:

monthly_v_90 = accumarray(b,v,[],@(x) prctile(x, 90));
monthly_v_99 = accumarray(b,v,[],@(x) prctile(x, 99));
monthly_d_90 = accumarray(b,d,[],@(x) prctile(x, 90));
monthly_d_99 = accumarray(b,d,[],@(x) prctile(x, 99));

上面的代码将做的是,对于每个唯一的月份,您将分别计算vd的 90% 和 99% 分位数。 具体来说,monthly_v_90monthly_v_99 将为您提供唯一年份中每个月v的 90% 和 99% 分位数,而 monthly_d_90monthly_d_99 将为您提供唯一年份中每个月d 的 90% 和 99% 分位数。

在调用 datevec 中,您生成的月份是从 1981 年 1 月到 2010 年 12 月。 因为中间有 30 年,一年有 12 个月,所以你应该有 360 个元素向量(以及你的平均值计算)。

相关内容

最新更新