Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Serie temporal regresión de datos de pasajeros de aerolíneas

En este ejemplo se muestra cómo analizar datos de series temporales mediante las características estadísticas y machine learning Toolbox™.

Datos de pasajeros aéreos

Primero creamos una serie de recuentos mensuales de pasajeros de aerolíneas, medidos en miles, para el período enero 1949 hasta diciembre 1960.

%   1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 y = [112  115  145  171  196  204  242  284  315  340  360  417    % Jan      118  126  150  180  196  188  233  277  301  318  342  391    % Feb      132  141  178  193  236  235  267  317  356  362  406  419    % Mar      129  135  163  181  235  227  269  313  348  348  396  461    % Apr      121  125  172  183  229  234  270  318  355  363  420  472    % May      135  149  178  218  243  264  315  374  422  435  472  535    % Jun      148  170  199  230  264  302  364  413  465  491  548  622    % Jul      148  170  199  242  272  293  347  405  467  505  559  606    % Aug      136  158  184  209  237  259  312  355  404  404  463  508    % Sep      119  133  162  191  211  229  274  306  347  359  407  461    % Oct      104  114  146  172  180  203  237  271  305  310  362  390    % Nov      118  140  166  194  201  229  278  306  336  337  405  432 ]; % Dec % Source: % Hyndman, R.J., Time Series Data Library, % http://www-personal.buseco.monash.edu.au/~hyndman/TSDL/. % Copied in October, 2005. 

Crear objeto serie temporal

Cuando creamos un objeto de serie temporal, podemos mantener la información de tiempo junto con los valores de datos. Tenemos datos mensuales, por lo que creamos una matriz de fechas y la usamos junto con los datos Y para crear el objeto de serie temporal.

yr = repmat((1949:1960),12,1); mo = repmat((1:12)',1,12); time = datestr(datenum(yr(:),mo(:),1)); ts = timeseries(y(:),time,'name','AirlinePassengers'); ts.TimeInfo.Format = 'dd-mmm-yyyy'; tscol = tscollection(ts); plot(ts) 

Examine la tendencia y la estacionalidad

Esta serie parece tener un componente estacional fuerte, con una tendencia que puede ser lineal o cuadrática. Además, la magnitud de la variación estacional aumenta a medida que aumenta el nivel general. Tal vez una transformación logaritmo haría que la variación estacional fuera más constante. Primero cambiaremos la escala del eje.

h_gca = gca; h_gca.YScale = 'log'; 

Parece que sería más fácil modelar el componente estacional en la escala logaritmo. Crearemos una nueva serie de tiempo con una transformación de registro.

tscol = addts(tscol, log(ts.data), 'logAirlinePassengers'); logts = tscol.logAirlinePassengers; 

Ahora vamos a trazar los promedios anuales, con desviaciones mensuales superpuestas. Queremos ver si la variación de mes a mes en años parece constante. Para estas manipulaciones que tratan los datos como una matriz en un formato de mes a año, es más conveniente operar en la matriz de datos original.

t = reshape(datenum(time),12,12); logy = log(y); ymean = repmat(mean(logy),12,1); ydiff = logy - ymean; x = yr + (mo-1)/12; plot(x,ymean,'b-',x,ymean+ydiff,'r-') title('Monthly variation within year') xlabel('Year') 

Ahora vamos a revertir los años y los meses, y tratar de ver si la tendencia de año a año es constante para cada mes.

h_gca = gca; h_gca.Position = [0.13   0.58   0.78   0.34]; subplot(2,1,2); t = reshape(datenum(time),12,12); mmean = repmat(mean(logy,2),1,12); mdiff = logy - mmean; x = mo + (yr-min(yr(:)))/12; plot(x',mmean','b-',x',(mmean+mdiff)','r-') title('Yearly trend within month') xlabel('Month') 

Modelo de tendencia y estacionalidad

Intentemos modelar esta serie como una tendencia lineal más un componente estacional.

subplot(1,1,1); X = [dummyvar(mo(:)), logts.time]; [b,bint,resid] = regress(logts.data, X); tscol = addts(tscol,X*b,'Fit1') plot(logts) hold on plot(tscol.Fit1,'Color','r') hold off legend('Data','Fit','location','NW') 
 Time Series Collection Object: unnamed  Time vector characteristics        Start date            01-Jan-1949       End date              01-Dec-1960  Member Time Series Objects:        AirlinePassengers       logAirlinePassengers       Fit1   

Basado en este gráfico, el ajuste parece ser bueno. Las diferencias entre los datos reales y los valores ajustados pueden ser lo suficientemente pequeñas para nuestros propósitos.

Pero intentemos investigar esto un poco más. Nos gustaría que los residuos se vean independientes. Si hay autocorrelación (correlación entre los residuos adyacentes), entonces puede haber una oportunidad de modelar eso y hacer que nuestro ajuste sea mejor. Vamos a crear una serie de tiempo a partir de los residuos y trazar.

tscol = addts(tscol,resid,'Resid1'); plot(tscol.Resid1) 

Los residuos no parecen independientes. De hecho, la correlación entre los residuos adyacentes se ve bastante fuerte. Podemos probar esto formalmente usando una prueba de Durbin-Watson.

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

Un valor p bajo para la estadística de Durbin-Watson es una indicación de que los residuos se correlacionan a lo largo del tiempo. Un corte típico para las pruebas de hipótesis es decidir que p < 0.05 es significativo. Aquí el valor p muy pequeño da una fuerte evidencia de que los residuos están correlacionados.

Podemos intentar cambiar el modelo para eliminar la autocorrelación. La forma general de la curva es alta en el medio y bajo en los extremos. Esto sugiere que debemos permitir un término de tendencia cuadrática. Sin embargo, también parece que la autocorrelación permanecerá después de agregar este término. Probemos.

X = [dummyvar(mo(:)), logts.time, logts.time.^2]; [b2,bint,resid2] = regress(logts.data, X); tscol = addts(tscol,resid2,'Resid2'); plot(tscol.Resid2); [p,dw] = dwtest(tscol.Resid2.data, X) 
 p =     8.7866e-20   dw =      0.6487  

Al agregar el término cuadrado se elimina la curvatura pronunciada en el trazado residual original, pero tanto la gráfica como la nueva prueba de Durbin-Watson muestran que todavía hay una correlación significativa en los residuos.

La autocorrelación como esta podría ser el resultado de otras causas que no se capturan en nuestra variable X. Tal vez podríamos recopilar otros datos que nos ayudarían a mejorar nuestro modelo y reducir la correlación. En ausencia de otros datos, podríamos simplemente agregar otro parámetro al modelo para representar la autocorrelación. Vamos a hacer eso, eliminando el término cuadrado, y usando un modelo autorregresivo para el error.

En un proceso autorregresivo, tenemos dos etapas:

   Y(t) = X(t,:)*b + r(t)       % regression model for original data    r(t) = rho * r(t-1) + u(t)   % autoregressive model for residuals

A diferencia del modelo de regresión habitual, cuando nos gustaría que la serie residual fuera un conjunto de valores independientes, este modelo permite que los residuos sigan un modelo autorregresivo con su propio término de error que consista en valores independientes.r(t)u(t)

Para crear este modelo, queremos escribir una función anónima para computar valores ajustados, de manera que dé los valores u:fYfitY-Yfit

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

En esta función anónima combinamos en un único vector de parámetros.[rho; b]c Los residuos resultantes se ven mucho más cerca de una serie no correlacionada.

r = corr(resid(1:end-1),resid(2:end));  % initial guess for rho X = [dummyvar(mo(:)), logts.time]; Y = logts.data; f = @(c,x) [Y(1); c(1)*Y(1:end-1) + (x(2:end,:)- c(1)*x(1:end-1,:))*c(2:end)]; c = nlinfit(X,Y,f,[r;b]);  u = Y - f(c,X); tscol = addts(tscol,u,'ResidU'); plot(tscol.ResidU); 

Resumen

Este ejemplo proporciona una ilustración de cómo utilizar el objeto de timeseries de MATLAB® junto con las características de la caja de herramientas de estadísticas y aprendizaje automático. Es fácil utilizar la notación para extraer los datos y suministrarlo como entrada a cualquier función.ts.data La función también acepta objetos de serie temporal directamente.controlchart

Los análisis más elaborados son posibles mediante el uso de características diseñadas específicamente para series de tiempo, como las de Econometrics Toolbox™ y System Identification Toolbox™.