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

calculate monthly mean, 90th and 99th percentile of time series

我正在阅读这篇关于风速趋势的文章,他们在他们的方法中指定他们试图确定风速的月平均值、第 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 个元素向量以上(以及您对平均值的计算)。