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

Matlab 计算时间序列的月平均值、第90百分位和第99百分位,matlab,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 percen

我正在阅读这篇关于风速趋势的文章,他们在他们的方法中明确指出,他们试图确定在所示期间,月平均值、第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百分位(另外,我甚至不确定它是什么)。有人能提供一些信息吗?

使用该功能。您所寻求的是一个阈值,其中超过该阈值的输入数据的比例/百分比为
100%
。例如,如果您查找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个元素向量与上述元素向量(以及您的平均值计算)。

使用该函数。您所寻求的是一个阈值,其中超过该阈值的输入数据的比例/百分比为
100%
。例如,如果您查找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个元素向量与上述元素向量(以及您的平均值计算)。

使用该函数。您所寻求的是一个阈值,其中超过该阈值的输入数据的比例/百分比为
100%
。例如,如果您查找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个元素向量与上述元素向量(以及您的平均值计算)。

使用该函数。您所寻求的是一个阈值,其中超过该阈值的输入数据的比例/百分比为
100%
。例如,如果您查找90%分位数,则您试图在输入数据中找到一个数量,其中10%的数据超过了该数量。对于99%的百分位数,您正在查找数量i