主要内容

分析时间序列数据

此示例显示如何使用可视化和分析时间序列数据timeseries对象和回归函数。

航空旅客数据

首先,我们创建了一个从1949年1月到1960年12月的航空乘客月度统计数组,以数千人为单位。

1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960Y = [112 115 145 171 196 204 242 284 315 340 360 417 .% 1月118 126 150 180 196 188 233 277 301 318 342 391% 2月132 141 178 193 236 235 267 317 356 362 406 419% 3月129 135 163 181 235 227 269 313 348 348 396 461% 4月121 125 172 183 229 234 270 318 355 363 420 472% 5135 149 178 218 243 264 315 374 422 435 472 535% 6月148 170 199 230 264 302 364 413 465 491 548 622% 7月148 170 199 242 272 293 347 405 467 505 559 606% 8月136 158 184 209 237 259 312 355 404 404 463 508% 9月119 133 162 191 211 229 274 306 347 359 407 461% 10月104 114 146 172 180 203 237 271 305 310 362 390% 11月118 140 166 194 201 229 278 306 336 337 405 432];% 12月%来源:Hyndman, r.j.,时间序列数据库,% http://www-personal.buseco.monash.edu.au/ hyndman / TSDL /。%复制于2005年10月。

创建时间序列对象

当我们创建一个时间序列对象时,我们可以将时间信息和数据值一起保存。我们有每月数据,因此我们创建一个日期数组,并将其与Y数据一起使用来创建时间序列对象。

Yr = repmat((1949:1960),12,1);Mo = repmat((1:12)',1,12);Time = datestr(datenum(yr(:)),mo(:)));Ts =时间序列(y(:),时间,“名字”“AirlinePassengers”);ts.TimeInfo.Format =“dd-mmm-yyyy”;Tscol = tscollection(ts);情节(ts)

图中包含一个轴对象。标题为Time Series Plot:AirlinePassengers的坐标轴对象包含一个类型为line的对象。

检查趋势和季节性

这个系列似乎有很强的季节性成分,其趋势可能是线性的或二次的。此外,季节变化的幅度随着总水平的增加而增加。也许对数变换会使季节变化更恒定。首先我们要改变轴的比例。

H_gca = gca;h_gca。YScale =“日志”

图中包含一个轴对象。标题为Time Series Plot:AirlinePassengers的坐标轴对象包含一个类型为line的对象。

似乎在对数尺度上对季节成分建模更容易。我们将用对数变换创建一个新的时间序列。

Tscol = addts(Tscol,log(ts.data),“logAirlinePassengers”);logts = tscol. logairlinepassers;

现在让我们把年平均值和月偏差叠加在一起。我们想看看几年之内每月的变化是否保持不变。对于这些将数据视为按月按年格式的矩阵的操作,在原始数据矩阵上操作更方便。

T =重塑(datenum(时间),12,12);Logy = log(y);Ymean = repmat(mean(logy),12,1);Ydiff = logy - ymean;X = yr + (mo-1)/12;情节(x, ymean,“b -”, x, ymean + ydiff,的r -)标题(“年内每月变化”)包含(“年”

图中包含一个轴对象。标题为“Monthly variation within year”的坐标轴对象包含24个类型行对象。

现在,让我们把年份和月份颠倒过来,看看每年的趋势是否每个月都是不变的。

H_gca = gca;h_gca。位置= [0.13 0.58 0.78 0.34];次要情节(2,1,2);T =重塑(datenum(时间),12,12);Mmean = repmat(mean(logy,2),1,12);Mdiff = logy - mmean;X = mo + (yr-min(yr(:)))/12;情节(x, mmean“b -”, x”,(mmean + mdiff)”,的r -)标题(“每月的年度趋势”)包含(“月”

图中包含2个轴对象。轴对象1,标题为month variation within year,包含24个类型行对象。标题为“月内年度趋势”的Axes对象2包含24个类型为line的对象。

模型趋势和季节性

让我们尝试将这个系列建模为线性趋势加上季节成分。

次要情节(1 1 1);X = [dummyvar(mo(:)) logs .time];[b,bint,resid] = return (logs .data,X);tscol = addts(tscol,X*b,“Fit1”
时间序列收集对象:未命名时间向量特征开始日期:01-Jan-1949结束日期:01- 12 -1960成员时间序列对象:AirlinePassengers logAirlinePassengers Fit1
情节(logts)情节(tscol。Fit1,“颜色”“r”)举行传奇(“数据”“健康”“位置”“西北”

图中包含一个轴对象。标题为Time Series Plot:logAirlinePassengers的坐标轴对象包含2个类型为line的对象。这些对象表示数据、适合。

根据这张图,拟合似乎很好。对于我们的目的来说,实际数据和拟合值之间的差异可能足够小。

但是让我们试着进一步研究这个问题。我们希望残差看起来是独立的。如果存在自相关(相邻残差之间的相关性),那么就可能有机会对其进行建模,使我们的拟合更好。让我们从残差中创建一个时间序列并绘制它。

Tscol = addts(Tscol,残留物,“Resid1”);情节(tscol.Resid1)

图中包含一个轴对象。标题为Time Series Plot:Resid1的坐标轴对象包含一个类型为line的对象。

残差看起来并不独立。事实上,相邻残差之间的相关性看起来相当强。我们可以用德宾-沃森测试来正式验证这一点。

[p,dw] = dwtest(tscol.Resid1.data,X)
P = 7.7787e-30
Dw = 0.4256

Durbin-Watson统计值的低p值表明残差随时间相关。假设检验的典型截点是确定p<0.05为显著性。这里非常小的p值给出了残差相关的有力证据。

我们可以尝试改变模型来消除自相关。曲线的一般形状是中间高,末端低。这表明我们应该考虑二次趋势项。然而,在我们加上这一项之后,自相关似乎仍然存在。我们试试吧。

X = [dummyvar(mo(:))日志。时间logts.time。^ 2);[b2,bint,resid2] = return (logs .data,X);Tscol = addts(Tscol,resid2,“Resid2”);情节(tscol.Resid2)

图中包含一个轴对象。标题为Time Series Plot:Resid2的坐标轴对象包含一个类型为line的对象。

[p,dw] = dwtest(tscol.Resid2.data,X)
P = 8.7866e-20
Dw = 0.6487

添加平方项确实消除了原始残差图中的明显曲率,但该图和新的Durbin-Watson检验都表明残差中仍然存在显著相关性。

像这样的自相关可能是X变量中没有包含的其他原因的结果。也许我们可以收集其他数据,帮助我们改进模型,减少相关性。在没有其他数据的情况下,我们可以简单地向模型中添加另一个参数来表示自相关。让我们这样做,去掉平方项,并使用误差的自回归模型。

在自回归过程中,我们有两个阶段:

Y(t) = X(t,:)*b + r(t) %原始数据的回归模型r(t) = rho * r(t-1) + u(t) %残差的自回归模型

不像在通常的回归模型中,我们想要残差序列r (t)为了成为一组独立的值,该模型允许残差遵循具有自己误差项的自回归模型u (t)由独立的值组成。

要创建这个模型,我们需要编写一个匿名函数f计算拟合值Yfit,所以Y-Yfit给出u的值:

Yfit(t) = rho*Y(t-1) + (X(t,:) - rho*X(t-1,:)

在这个匿名函数中我们结合[ρ;b]变成一个参数向量c.由此产生的残差看起来更接近于一个不相关的序列。

R = corr(渣油(1:end-1),渣油(2:end));的初始值X = [dummyvar(mo(:)) logs .time];Y = logs .data;f = @(c,x) [Y(1);c (1) * Y (1: end-1) + (x (2:,:) - c (1) * x (1: end-1,:)) * c(2:结束)];c = nlinfit(X,Y,f,[r;b]);u = Y - f(c,X);Tscol = addts(Tscol,u,“本质”);情节(tscol.ResidU);

图中包含一个轴对象。标题为Time Series Plot:ResidU的坐标轴对象包含一个类型为line的对象。

总结

本示例演示了如何使用MATLAB®时间序列对象以及统计和机器学习工具箱中的功能。的使用很简单ts.data用于提取数据并将其作为输入提供给任何函数的符号。的controlchart函数也直接接受时间序列对象。

通过使用专门为时间序列设计的功能,例如计量经济学工具箱™和系统识别工具箱™中的功能,可以进行更详细的分析。