计算时间序列的月均值、第 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
.
中
在你的例子中,v
和 d
是你想要找到每月百分位数的数据,因此你可以像这样修改你的 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));
以上代码的作用是,对于每个唯一的月份,您将分别计算 v
和 d
的 90% 和 99% 分位数。具体来说,monthly_v_90
和 monthly_v_99
将为您提供 v
独特年份中每个月的 90% 和 99% 分位数,而 monthly_d_90
和 monthly_d_99
将为您提供您是 d
.
独特年份中每个月的 90% 和 99% 分位数
在您对 datevec
的调用中,您生成了从 1981 年 1 月到 2010 年 12 月的月份。因为中间有 30 年,一年有 12 个月,所以您应该有 360 个元素向量以上(以及您对平均值的计算)。
我正在阅读这篇关于风速趋势的文章,他们在他们的方法中指定他们试图确定风速的月平均值、第 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
.
在你的例子中,v
和 d
是你想要找到每月百分位数的数据,因此你可以像这样修改你的 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));
以上代码的作用是,对于每个唯一的月份,您将分别计算 v
和 d
的 90% 和 99% 分位数。具体来说,monthly_v_90
和 monthly_v_99
将为您提供 v
独特年份中每个月的 90% 和 99% 分位数,而 monthly_d_90
和 monthly_d_99
将为您提供您是 d
.
在您对 datevec
的调用中,您生成了从 1981 年 1 月到 2010 年 12 月的月份。因为中间有 30 年,一年有 12 个月,所以您应该有 360 个元素向量以上(以及您对平均值的计算)。