Recordemos que en este caso estimamos la tendencia calculando el promedio por año:
^μj=11212∑k=1xj,k, j=1,…,r
es decir, fijamos un año y el promedio corre sobre el ciclo estacional k. De forma similar estimamos la componente estacional como
^sk=1r12∑j=1(xj,k−^μj), k=1,…,r
es decir, fijamos el ciclo estacional k y corremos el promedio sobre los años, donde en este promedio quitamos la parte de la tendencia para cada respectivo año. Finalmente, para la parte aleatoria quitaremos la parte d ela tendencia y de la componente estacional.
Utilizaremos los datos de USAccDeaths
(muertes accidentales en EU)
# Cargamos la librería necesaria
library(forecast)
# guardamos los datos
xt = USAccDeaths
# vemos la gráfica de la ST
plot(xt)
notamos que el ciclo se repite cada año y los datos abarcan 6 años (j=1,…,6). Así, utilizando el método S1 estimamos la componente de la tendencia (^μj) como sigue:
sum( xt[1:12] ) / 12
sum( xt[12 + 1:12] ) / 12
donde recordemos que la primer fila de la ST es de la forma x1,x2,…,x12 y la segunda fila x13,x14,…,x24, de ahí que hayamos colocado xt[12 + 1:12]
para acceder a estos datos de la ST. De forma general
# creamos un vector vacío para que almacene los valores
mj = c()
# usamos un for para recorrer todos los años de los datos de la ST
for(j in 1:6){
mj[j] = sum( xt[12*(j-1)+1:12] ) / 12
}
mj
## [1] 9651.750 8718.500 8588.583 8395.083 8576.833 8802.000
Hacemos lo mismo para estimar la componente estacional
# vector vacío
sk = c()
# usamos un for para recorrer todos los meses
for(k in 1:12){
sk[k] = sum( xt[(0:5)*12+k]-mj ) / 6
}
donde xt[(0:5)*12+k]-mj
nos permite acceder a los datos de la ST con índice 1,13,25,37,49,61 para k=1 (Enero), etcétera.
Finalmente estimamos la parte aleatoria
aleatorio = xt - rep(mj, each = 12) - rep(sk, times = 6)
donde, como los datos de la ST son de 6 años con periodo de 12 meses, entonces podemos pensar a los datos como una tabla de 6 filas por 12 columnas. De tal manera, a la ST xt
le restaremos entrada por entrada los valores obtenido es mj
y sk
.
Podemos ver graficamente la parte aleatoria obtenida y la gráfica de la ST
par(mfrow=c(2,1))
plot(xt)
plot(aleatorio)
asimismo, podemos graficar, en azul, la estimación de la componente de la tendencia junto con la estimación de la componente estacional
# compenente estacional y de tendencia (estimación)
compon = rep(mj, each = 12) + rep(sk, times = 6)
# lo adecuamos a los datos de la ST
compon = ts(compon, start=start(xt), frequency=12)
# graficamos
plot(xt)
lines(compon,col="blue")
Recordemos que para este caso debemos identificar primero el periodo de la parte estacional, de modo que en este caso d=12; además, dado que la ST abarca 6 años, tenemos que k=6. De tal manera, n=k⋅d=6⋅12=72. En efecto
length(xt)
## [1] 72
Ahora, dado que d es par, tenemos entonces $12 =2q $, de donde q=6. Luego
d = 12
k = 6
n = 72
q = 6
tenemos entonces que el estimador de la tendencia está dado por:
# Definimos una ST sólo con entradas "NA" de acuerdo al número de
# entradas de la ST original
mt = ts(rep(NA, n), start = start(xt), frequency = frequency(xt))
# Realizamos la suma
for(t in (q+1):(n-q)){
mt[t] = (0.5 * xt[t - q] + sum( xt[(t-q+1):(t+q-1)] ) + 0.5 * xt[t + q]) / d
}
donde recordemos que q+1≤t≤n−q y además la fórmula para estimar la tendencia es
^mt=0.5xt−q+xt−q+1+⋯+xt+q−1+0.5xt+qd
dado que en las primeras q entradas de la ST no estamos obteniendo esta estimación de la tendnecia, y dado que tampoco estamos realizando esta estimación para los últimos datos (i.e t>n−q), hacemos que en ambos casos la tendencia sea constante
mt[1:q] = mt[q+1]
mt[(n-q+1):n] = mt[n-q]
Lo que sigue es quitar la tendencia a la serie original (zt=xt−^μt)
zt = xt - mt
Después, a la ST auxiliar zt crearemos un ciclo promedio (wk, k=1,…,12) que estimará la parte estacional:
wk = rep(NA, 12)
for(k in 1:12){
wk[k] = sum(zt[(0:5)*12 + k], na.rm = TRUE) / 6
}
donde para k=1 tendríamos que promediar los datos z1,z13,z25,z37,z49,z61, etcétera.
Continuamos ajustando el ciclo obtenido en la serie como
^Sk=wk−∑di=1wid, k∈{1,…,12}
# Vec_ciclo:
sk = rep(NA, 12)
for(k in 1:12){
sk[k] = wk[k] - sum(wk) / d
}
Finalmente repetimos el vector Vecciclo tantos ciclos tengamos (a lo cual denominaremos St), en este caso repetiremos el vector sk
6 veces:
# Adaptamos los datos a una serie de tiempo
St = ts(rep(sk, times=6), start=start(xt), frequency=frequency(xt))
Podemos calcular la parte aleatoria como yt=zt−St
aleatorio = zt-St
Finalmente vemos los resultados:
# Componente de la tendencia más componente estacional
compon = mt + St
# Lo adaptamos a una ST
compon = ts(compon, start=start(xt), frequency = 12)
# Graficamos
plot(xt)
lines(compon,col="red")
y finalmente podemos observar la tendencia estimada, el ciclo estimado y la parte aleatoria (respectivamente):
par(mfrow=c(3,1))
plot(mt, col="blue")
plot(St, col="blue")
plot(aleatorio)