Estimación de la tendencia: ajuste de la curva

Consideremos los siguientes datos, los cuales considera el número de nacidos vivos (en miles) en USA de 1948 a 1979

library(forecast)
library(nortest)
library(lmtest)
# librería necesaria
library(astsa)

plot(birth)

puede notarse un cierto tipo de tendencia polnomial. Podemos notar la presencia de un ciclo que se repite cada 12 meses, donde podemos auxiliarnos de los correlogramas

tsdisplay(birth)

Asimismo, podemos ver los componentes de la serie de tiempo

dec <- decompose(birth, type="additive")
plot(dec)

la cual sigue un modelo aditivo. Continuando con lo visto la clase pasada, podemos ajustar un modelo de regresión que describa la serie, esto es, realizar un ajuste sobre la tendencia de la serie. Para ello, obtenemos los valores correspondientes para el eje horizontal (\(t\)) para tener la asociación \(t-f(t)\)

t = time(birth) - 1947 

lo anterior nos servirá para ajustar la tendencia. Luego, lo siguiente nos ayudará a obtener el ciclo estacional:

M <- factor(cycle(birth))
M
##   [1] 1  2  3  4  5  6  7  8  9  10 11 12 1  2  3  4  5  6  7  8  9  10 11 12 1 
##  [26] 2  3  4  5  6  7  8  9  10 11 12 1  2  3  4  5  6  7  8  9  10 11 12 1  2 
##  [51] 3  4  5  6  7  8  9  10 11 12 1  2  3  4  5  6  7  8  9  10 11 12 1  2  3 
##  [76] 4  5  6  7  8  9  10 11 12 1  2  3  4  5  6  7  8  9  10 11 12 1  2  3  4 
## [101] 5  6  7  8  9  10 11 12 1  2  3  4  5  6  7  8  9  10 11 12 1  2  3  4  5 
## [126] 6  7  8  9  10 11 12 1  2  3  4  5  6  7  8  9  10 11 12 1  2  3  4  5  6 
## [151] 7  8  9  10 11 12 1  2  3  4  5  6  7  8  9  10 11 12 1  2  3  4  5  6  7 
## [176] 8  9  10 11 12 1  2  3  4  5  6  7  8  9  10 11 12 1  2  3  4  5  6  7  8 
## [201] 9  10 11 12 1  2  3  4  5  6  7  8  9  10 11 12 1  2  3  4  5  6  7  8  9 
## [226] 10 11 12 1  2  3  4  5  6  7  8  9  10 11 12 1  2  3  4  5  6  7  8  9  10
## [251] 11 12 1  2  3  4  5  6  7  8  9  10 11 12 1  2  3  4  5  6  7  8  9  10 11
## [276] 12 1  2  3  4  5  6  7  8  9  10 11 12 1  2  3  4  5  6  7  8  9  10 11 12
## [301] 1  2  3  4  5  6  7  8  9  10 11 12 1  2  3  4  5  6  7  8  9  10 11 12 1 
## [326] 2  3  4  5  6  7  8  9  10 11 12 1  2  3  4  5  6  7  8  9  10 11 12 1  2 
## [351] 3  4  5  6  7  8  9  10 11 12 1  2  3  4  5  6  7  8  9  10 11 12 1 
## Levels: 1 2 3 4 5 6 7 8 9 10 11 12

la cual registra la correspondiente parte del periodo en vez de las observaciones.

Ahora bien, como se dijo al inicio, parace que la tendencia sigue un cierto comportamiento polinomial, por lo que

# ajustaremos a un polinomio de grado 5

t2 = t ** 2
t3 = t ** 3
t4 = t ** 4
t5 = t ** 5

reg <- lm( birth ~ 0 + t + t2 + t3 + t4 + t5 + M , na.action=NULL )
summary(reg)
## 
## Call:
## lm(formula = birth ~ 0 + t + t2 + t3 + t4 + t5 + M, na.action = NULL)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -25.300  -6.507  -0.222   5.656  38.933 
## 
## Coefficients:
##       Estimate Std. Error t value Pr(>|t|)    
## t   -6.840e+00  2.976e+00  -2.298   0.0221 *  
## t2   3.208e+00  5.221e-01   6.144 2.15e-09 ***
## t3  -2.765e-01  3.888e-02  -7.112 6.30e-12 ***
## t4   8.506e-03  1.284e-03   6.622 1.31e-10 ***
## t5  -8.774e-05  1.550e-05  -5.661 3.10e-08 ***
## M1   2.933e+02  5.676e+00  51.673  < 2e-16 ***
## M2   2.728e+02  5.672e+00  48.090  < 2e-16 ***
## M3   2.964e+02  5.683e+00  52.158  < 2e-16 ***
## M4   2.759e+02  5.693e+00  48.461  < 2e-16 ***
## M5   2.869e+02  5.703e+00  50.311  < 2e-16 ***
## M6   2.876e+02  5.713e+00  50.334  < 2e-16 ***
## M7   3.138e+02  5.723e+00  54.828  < 2e-16 ***
## M8   3.212e+02  5.732e+00  56.029  < 2e-16 ***
## M9   3.172e+02  5.741e+00  55.238  < 2e-16 ***
## M10  3.107e+02  5.751e+00  54.037  < 2e-16 ***
## M11  2.911e+02  5.759e+00  50.539  < 2e-16 ***
## M12  3.005e+02  5.768e+00  52.097  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 10.38 on 356 degrees of freedom
## Multiple R-squared:  0.999,  Adjusted R-squared:  0.9989 
## F-statistic: 1.993e+04 on 17 and 356 DF,  p-value: < 2.2e-16

donde recordamos que la variable categórica M nos auxilia para poder detectar el ciclo en la ST. Del summary() anterior podemos inducir que el mes com mayor número de nacimientos vivos es en Agosto (M8) pues es el que tiene el número mayor en la parte de la estimación de los coeficientes; el mes con menos nacimientos vivos es febrero (M2). Notemos además que el coeficiente de determinación es \(R^{2}=0.999\) por lo que el modelo propuesto es bastante bueno, es decir, la propuesta de que la tendencia sigue el comportamiento de un polinomio de grado 5 es bastante buena. Además notemos que

anova(reg)
## Analysis of Variance Table
## 
## Response: birth
##            Df   Sum Sq  Mean Sq   F value    Pr(>F)    
## t           1 26081421 26081421 242204.16 < 2.2e-16 ***
## t2          1  7437134  7437134  69064.67 < 2.2e-16 ***
## t3          1  1973425  1973425  18326.14 < 2.2e-16 ***
## t4          1   357574   357574   3320.59 < 2.2e-16 ***
## t5          1   233197   233197   2165.57 < 2.2e-16 ***
## M          12   396951    33079    307.19 < 2.2e-16 ***
## Residuals 356    38335      108                        
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

el error cuadrático medio es de 108. Graficamente podemos ver que

plot(birth, type = "o")
lines(fitted(reg), col = 2, lwd = 3)

el modelo ajustado es bastante próximo al modelo original de los datos. El resultado obtenido (la gráfica de color rojo) se obtiene pues en el ajuste del modelo agregamos los valores correspondientes a la t, con los que podemos ajustar la componente de la tendencia, y los valores correspondientes a la M, con los que podemos ajustar la componente del ciclo estacional. Ahora bien, si es sólo de nuestro interés estimar y después ver la componente de la tendencia, quitamos de la regresión a la variable M:

# ajuste sin la componente del ciclo
reg2 <- lm( birth ~ 0 + t + t2 + t3 + t4 + t5, na.action=NULL )

# Graficamos nuevamente
plot(birth, type = "o")
lines(fitted(reg2), col = 2, lwd = 3)

asimismo podemos visualizar sólo el ciclo sin tendencia:

# ajuste sin la componente de la tendencia
reg3 <- lm( birth ~ 0 + M, na.action=NULL )

# Graficamos nuevamente
plot(birth, type = "o")
lines(fitted(reg3), col = 2, lwd = 3)

Ahora, es preciso mencionar que ajustar la componente de la tendencia a un polinomio de grado 5 fue mera intuición, no obstante, tenemos herramientas que nos permiten saber si la estimación fue buena, o si un modelo es “mejor” que otro. Para ello nos auxiliamos del coeficiente de determinación y del error cuadrático medio. Por ejemplo, consideremos el siguiente ajuste

reg4 <- lm( birth ~ 0 + t + t2 + M, na.action=NULL )
summary(reg4)
## 
## Call:
## lm(formula = birth ~ 0 + t + t2 + M, na.action = NULL)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -43.690 -13.672   0.053  12.401  47.269 
## 
## Coefficients:
##      Estimate Std. Error t value Pr(>|t|)    
## t     6.71789    0.43504   15.44   <2e-16 ***
## t2   -0.26596    0.01281  -20.76   <2e-16 ***
## M1  290.45258    4.30469   67.47   <2e-16 ***
## M2  268.73565    4.36146   61.62   <2e-16 ***
## M3  292.47123    4.36517   67.00   <2e-16 ***
## M4  272.08147    4.36879   62.28   <2e-16 ***
## M5  283.24379    4.37233   64.78   <2e-16 ***
## M6  283.99044    4.37578   64.90   <2e-16 ***
## M7  310.32144    4.37914   70.86   <2e-16 ***
## M8  317.84968    4.38242   72.53   <2e-16 ***
## M9  313.96226    4.38561   71.59   <2e-16 ***
## M10 307.69143    4.38871   70.11   <2e-16 ***
## M11 288.16623    4.39173   65.62   <2e-16 ***
## M12 297.74151    4.39467   67.75   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 17.81 on 359 degrees of freedom
## Multiple R-squared:  0.9969, Adjusted R-squared:  0.9968 
## F-statistic:  8196 on 14 and 359 DF,  p-value: < 2.2e-16
anova(reg4)
## Analysis of Variance Table
## 
## Response: birth
##            Df   Sum Sq  Mean Sq  F value    Pr(>F)    
## t           1 26081421 26081421 82209.13 < 2.2e-16 ***
## t2          1  7437134  7437134 23441.99 < 2.2e-16 ***
## M          12  2885587   240466   757.95 < 2.2e-16 ***
## Residuals 359   113895      317                       
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

ajustando la componente de la tendencia a un polinomio de grado 2, tenemos que el coeficiente de determinación ha disminuido, asimismo el error cuadrático medio ha aumentado. Todo lo anterior respecto a la \(R^{2}\) y ECM del modelo con el ajuste al polinomio de grado 5. Como puede intuirse, al realizar el ajuste a un modelo respecto a un polinomio de gradp 3, la \(R^{2}\) aumentará y el ECM disminuirá. Veamos ahora lo que ocurre con un polinomio de grado 6:

t6 = t ** 6

reg5 <- lm( birth ~ 0 + t + t2 + t3 + t4 + t5 + t6 + M, na.action=NULL )
summary(reg5)
## 
## Call:
## lm(formula = birth ~ 0 + t + t2 + t3 + t4 + t5 + t6 + M, na.action = NULL)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -26.950  -6.448  -0.500   5.536  36.506 
## 
## Coefficients:
##       Estimate Std. Error t value Pr(>|t|)    
## t   -2.414e+01  5.343e+00  -4.519 8.47e-06 ***
## t2   7.733e+00  1.277e+00   6.054 3.59e-09 ***
## t3  -7.899e-01  1.381e-01  -5.719 2.28e-08 ***
## t4   3.680e-02  7.425e-03   4.957 1.11e-06 ***
## t5  -8.339e-04  1.935e-04  -4.309 2.13e-05 ***
## t6   7.537e-06  1.949e-06   3.867 0.000131 ***
## M1   3.133e+02  7.595e+00  41.247  < 2e-16 ***
## M2   2.930e+02  7.634e+00  38.375  < 2e-16 ***
## M3   3.166e+02  7.646e+00  41.412  < 2e-16 ***
## M4   2.961e+02  7.656e+00  38.682  < 2e-16 ***
## M5   3.072e+02  7.665e+00  40.078  < 2e-16 ***
## M6   3.078e+02  7.673e+00  40.118  < 2e-16 ***
## M7   3.340e+02  7.681e+00  43.492  < 2e-16 ***
## M8   3.414e+02  7.687e+00  44.418  < 2e-16 ***
## M9   3.374e+02  7.692e+00  43.863  < 2e-16 ***
## M10  3.310e+02  7.697e+00  43.003  < 2e-16 ***
## M11  3.113e+02  7.701e+00  40.426  < 2e-16 ***
## M12  3.207e+02  7.704e+00  41.632  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 10.18 on 355 degrees of freedom
## Multiple R-squared:  0.999,  Adjusted R-squared:  0.9989 
## F-statistic: 1.956e+04 on 18 and 355 DF,  p-value: < 2.2e-16
anova(reg5)
## Analysis of Variance Table
## 
## Response: birth
##            Df   Sum Sq  Mean Sq   F value    Pr(>F)    
## t           1 26081421 26081421 251698.66 < 2.2e-16 ***
## t2          1  7437134  7437134  71772.03 < 2.2e-16 ***
## t3          1  1973425  1973425  19044.53 < 2.2e-16 ***
## t4          1   357574   357574   3450.76 < 2.2e-16 ***
## t5          1   233197   233197   2250.47 < 2.2e-16 ***
## t6          1   133005   133005   1283.57 < 2.2e-16 ***
## M          12   265495    22125    213.51 < 2.2e-16 ***
## Residuals 355    36786      104                        
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

vemos que la \(R^{2}\) se mantiene prácticamente igual y el ECM ha disminuido de 108 a 104. Gráficamente

# ajuste sin la componente del ciclo
reg6 <- lm( birth ~ 0 + t + t2 + t3 + t4 + t5 + t6, na.action=NULL )

# Graficamos nuevamente
plot(birth, type = "o")
lines(fitted(reg6), col = 2, lwd = 3)