Datos previos

## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
## 
## Attaching package: 'TSA'
## The following objects are masked from 'package:stats':
## 
##     acf, arima
## The following object is masked from 'package:utils':
## 
##     tar

Método de medias móviles

Recordemos que una forma de detectar la tendencia de una serie dada es mediante el método de medias móviles. Dicho método lo podremos invocar a través de la función ma de R. Para cumplir con las especificaciones dadas en el archivo de tareas, primero mostremos las medias móviles con una ventana a 3, 5, 7 y 9, respectivamente.

#plot data
base_plot <- autoplot( ts_mes, series="Accidentes registrados" ) + ylab('# accidentes') + 
    xlab("Año") + ggtitle("Accidentes carreteros mensuales")

grid.arrange(
    base_plot + autolayer( ma(ts_mes, order=3, centre=T ), series="3-MA"),
    base_plot + autolayer( ma(ts_mes, order=5, centre=T ), series="5-MA"),
    base_plot + autolayer( ma(ts_mes, order=7, centre=T ), series="7-MA"),
    base_plot + autolayer( ma(ts_mes, order=9, centre=T ), series="9-MA")
)

Sin embargo, como se puede observar en la gráfica anterior, el resultado no es exactamente el esperado, así que intentemos esta vez con una ventana de 12, representando los 12 meses o muestras que se tienen durante el año:

autoplot( ts_mes, series="Accidentes registrados" ) + 
    autolayer( ma(ts_mes, order=12, centre=T ), series="12-MA") +
    ylab('# accidentes') + xlab("Año") + ggtitle("Accidentes carreteros mensuales")

Regresión no paramétrica

Pero… ¡Oh cielos! Todavía no es un modelo lo suficientemente bueno para considerarlo. Entonces, probemos con el método de estimación de tendencia por polinomios locales, que es un método de regresión no-paramétrica.

ts_mes.pts <- time(ts_mes)
loc.fit <- loess(ts_mes ~ ts_mes.pts )
ts_mes.loc.fit <- ts(fitted(loc.fit), start=2015, frequency=12)

Veamos, pues, los resultados que obtenemos

autoplot(ts_mes, series="Original") + autolayer( ts_mes.loc.fit, series="LPTE" ) + xlab('# accidentes') + ylab('Año') + ggtitle('Tendencia de los accidentes carreteros por método Loc. Pol. Trend. Est.')

Removiendo la tendencia

Mucho mejor, ¿No es así? La mayor ventaja que se puede observar es que no se tienen puntos vacíos a los extremos de la serie, por lo que es extremadamente fácil ahora remover la tendencia de nuestra serie original, quedando así sólo los residuos y el componente estacional:

ts_mes.trend <- ts_mes.loc.fit
ts_mes.no_trend <- ts_mes - ts_mes.trend
autoplot( ts_mes.no_trend ) + ggtitle("Serie sin tendencia") + xlab('# Accidentes') + ylab('Año')

Descomposición

Finalmente, descompongamos los factores mediante las funciones que nos da el propio lenguaje. Recordemos que podemos hacer una descomposición aditiva o multiplicativa; sin embargo, observando la serie, se nota que a medida que la estacionalidad aumenta, la tendencia no lo hace así de forma drástica, por lo que podemos analiarlo mediante una descomposición clásica aditiva. Esto lo haremos ejecutando los siguientes comandos:

decomposed_accidents <- decompose(ts_mes, type='additive')
adjusted_accidents <- ts_mes - decomposed_accidents$seasonal
adjusted <- autoplot(adjusted_accidents) + ggtitle('Temporalidad ajustada por método aditivo') + ylab('# Accidentes') + xlab('Año')



grid.arrange(autoplot(ts_mes) + ylab('# accidentes') + xlab("Año") + ggtitle("Accidentes carreteros mensuales"), 
    adjusted, 
    autoplot(decomposed_accidents$trend) + ggtitle('Tendencia') + ylab('# accidentes') + xlab("Año")
)