线性趋势

回到气候数据工具的内容

最小二乘线性回归是最常见的一种类型的分析在地球科学和Matlab的吗left-divide运营商使有效的最小二乘计算是Matlab作者最初人中流行起来的一个重要原因。最小二乘法和矩阵乘法的数学覆盖网络和在许多教科书,所以本教程只涵盖了如何计算力学最小二乘回归使用气候数据为Matlab工具箱。

内容

趋势函数

在这个例子中,我们将做一些随机的数据与一个已知的趋势,然后我们将使用趋势函数以适应一个线性最小二乘回归的数据。首先,生成数据:

x = 1:1000;y = x + 5 * 500 * randn(大小(x)) + 300;

上面,我们实施的趋势y = 5 * x,然后添加了一些噪音和截距为300。这里的数据:

情节(x, y,“o”)

使用polyplot快速绘制一阶最小平方趋势:

持有polyplot (x, y, 1“线宽”,2)

通常在地质,问题是,这条线的斜率是多少?y随x如何?我们知道,斜率应该是y = 5 * x,但是最小二乘说什么呢?使用趋势函数找出:

趋势(y, x)
ans = 5.02

5倍左右。这正是我们期望的答案。

polyfitpolyval功能

趋势功能很方便,因为它很简单,但是你可能想要更多的信息不仅仅是趋势线的斜率。例如,您可能想知道y轴截距或一些高阶最小二乘匹配。在这样的场合,标准的Matlab函数polyfit可能派上用场。

polyfit函数适合任何顺序多项式最小二乘法的数据集。拟合的一阶多项式x, y数据polyfit是这样的:

P = polyfit (x, y, 1)
P = 5.02 - 279.80

上图中,P包含多项式的系数,从最高的秩序。由于这是一个一阶最小二乘,的内容P(P_1 P_0],分别或斜率和截距。所以它是不足为奇的斜率P_1大约是5和拦截P_0大约有300。当我们创建我们实施这些价值观y。如果我们想要得到一个二阶的系数,我们使用

P = polyfit (x, y, 2)
P = -0.00 5.22 246.27

然而,拟合二阶或更高版本不适合这个特定的数据集,我们知道它,因为当我们定义y我们说它有一个斜坡,截距,和噪音,而不是其它。这意味着适应甚至一个二阶多项式y将拟合模型噪声。这是有时被称为过度学习。

为了说明过度拟合,适合25阶多项式y:

P = polyfit (x, y, 25);
警告:多项式是严重的。添加点不同的X值,减少多项式的次数,或者尝试定心和扩展中描述帮助POLYFIT。

现在使用的polyval函数来评估25阶P对于每一个x和情节作为厚黑线:

y_overfit = polyval (P (x);情节(x, y_overfit,“k”,“线宽”2)传说(“原始数据”,' 1 ^{圣}订购适合的,“25 ^ {th}订购适合的,“位置”,“西北”)

大气二氧化碳的趋势

现在,让我们使用上面的方法来评估大气二氧化碳的变化测量在莫纳罗亚山,夏威夷。首先加载数据和绘图:

负载mlo_daily_c02.mat图绘制(t,二氧化碳)轴datetick (“x”,“keeplimits”)%格式x蜱虫日期ylabel (“大气二氧化碳(ppm)”)

在这时间的测量,以什么速度大气二氧化碳增加了吗?发现使用趋势功能:

趋势(二氧化碳、t)
ans =南

不是一个数字。这是因为二氧化碳数据集包含了一些值。这是常见的在真实数据集,有时有缺口或缺失的数据,但有一个简单的方法来解决它。确定哪些元素二氧化碳数据集是有限的,只有分析。

%确定co2指数不是南:安全部队= isfinite (co2);%计算趋势有限值:趋势(二氧化碳(安全部队)、t(安全部队))
ans = 0.00

对零的趋势似乎并不喜欢的趋势。但是请注意,趋势函数计算二氧化碳每单位时间内的变化和时间单位是datenum天。(阅读更多关于日期格式本教程)。所以毫不奇怪,这一趋势在二氧化碳(ppm)每天接近于零。一个更有意义的措施可能会每十年的趋势。

将二氧化碳趋势从ppm /天ppm /十年,每年只乘以365.25天,然后乘以每十年十年:

趋势(二氧化碳(安全部队)、t(安全部队))* 365.25 * 10
ans = 17.43

大气二氧化碳大约17 ppm的趋势在这个数据集每十年。使用polyplot展示图上的趋势线:

持有polyplot (t,二氧化碳,1)

在上面的图中,我们可以看到,一阶的17 ppm每十年的总体趋势相匹配,但它没有完全涵盖长期曲线的形状。这里可能是适当的使用高阶。让我们显示二阶配合:

polyplot (t,二氧化碳,2)传说(“原始数据”,' 1 ^{圣}订购适合的,' 2 ^{和}订购适合的,“位置”,“西北”)

相应的多项式常数可以找到的polyfit功能:

P = polyfit (t(安全部队),二氧化碳(安全部队),2);
警告:多项式是严重的。添加点不同的X值,减少多项式的次数,或者尝试定心和扩展中描述帮助POLYFIT。

警告消息发生因为的单位t(datenum)非常不同于二氧化碳的单位(ppm)。你看,t的值比二氧化碳的价值非常大。为了说明这一点,看的第一个元素t:

t (1)
ans = 720626.00

这是一个非常大的数字。它的天数自新年以来0。一种快速而简单的方法来处理这个巨大的数字转换成十进制年使用机灵功能:

年=机灵(t)“decimalyear”);

现在第一次约会是这样的:

年(1)
ans = 1973.01

这号码是足够小,我们可以适应一个多项式和二氧化碳数据。分10得到多项式相对于几十年而不是几年:

P = polyfit(年/ 10(安全部队),二氧化碳(安全部队),2)
P = 1.26 -486.24 47162.38

第一个元素的积极价值P告诉我们一些我们已经知道:大气二氧化碳不仅仅是增加,加速。

三维数据集

上面的示例看着一维数组,每个代表一个时间序列。在气候科学中,我们常常使用成千上万的这些时间序列,以网格的形式的数据。在这些类型的3 d网格,前两个维度通常空间,像经度和latude,第三维对应于时间。每个网格单元格包含自己的时间序列,使用这些时间序列的方法之一是遍历每个网格单元,执行1 d分析时间序列的每个网格单元。我们将讨论这个方法有点更远一点的地方,在本教程中,但首先,我们将使用趋势函数来计算三维数据集的趋势。

首先加载数据

负载pacific_sst纬度风场t%显示变量的大小
类属性名称大小字节纬度60 x1 480双经度55 x1 440海温60双x55x802 21172800双t 802 x1 6416双

pacific_sst样本数据集包含每月802海洋表面温度在60 x55网格。网格分辨率很粗,它仅覆盖太平洋的一部分,但是值得注意的是,即使这个小数据集包含60 x55 = 3300个人时间序列。虽然想要遍历每个网格单元,计算每个网格单元的时间序列的趋势,我们应该想到这种方法作为最后的手段,因为它是一个强大的缓慢的处事。所以每当你可以尽量避免循环和只运行一次。

趋势整个操作函数。如何使用它:

%计算每年的趋势,每年12样本(月度数据):tr =趋势(sst、12);%绘制线性趋势:图imagescn(经度、纬度、tr) cb = colorbar;ylabel (cb、“SST趋势(\ circC年^ {1})”)cmocean (“平衡”,“主”)%设置colormap中间为零

趋势计算上面是快,因为它只计算一次,而不是3300次。(它使用cube2rect重塑对海温数据集,然后执行的最小二乘法,然后使用rect2cube“un-reshape”结果。)

在一个3 d数据集处理nan

在某些情况下,您可能别无选择,只能使用循环计算3 d网格数据集的趋势。例如,如果有一些分散值的数据。在这种情况下,遍历每行和每列的3 d数据集,确定哪些时间指数是有限的在每个网格单元,并计算相应的趋势。别忘了preallocate开始前循环。

% Preallocate:sst_trend =南(60,55岁);%循环每一行:行=一60%循环每一列:坳= 55分%得到有限的时间指标数据在网格单元:印第安纳州= isfinite (sst(行,坳,:));%只计算趋势如果至少有两个有限指标:如果总和(印第安纳州)> = 2 sst_trend(行,坳)=趋势(挤压(sst(行,坳,印第安纳))、t(印第安纳州))* 365.25;结束结束结束

注意挤压上面的命令,将1 x1xn数组转换为资料片数组。

现在情节sst_trend就是我们计算per-grid-cell基础上,只是确认匹配使用的结果趋势对整个数据集:

图imagescn(经度、纬度、sst_trend) cb = colorbar;ylabel (cb、“SST趋势(\ circC年^ {1})”)cmocean (“平衡”,“主”)%设置colormap中间为零

作者信息

本教程是由乍得a·格林的气候数据为Matlab工具箱,2019年2月。