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

时间:2015-01-27 15:35:22

标签: matlab

我正在读这篇关于风速趋势的文章,他们在他们的方法中指出他们试图确定风速超过月平均值,第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百分位(加上我甚至不确定它是什么)。任何人都可以提供一些相关信息吗?

1 个答案:

答案 0 :(得分:3)

使用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元素向量(以及你对平均值的计算)。