library(forecast)
library(TSA)
##
## Attaching package: 'TSA'
## The following objects are masked from 'package:stats':
##
## acf, arima
## The following object is masked from 'package:utils':
##
## tar
library(urca)
library(ggplot2)
library(foreign)
prodpesquera= read.csv("~/SEPTIMO SEMESTRE/SERIES DE TIEMPO/1ER PARCIAL/prodpesquera.csv")
class(prodpesquera)
## [1] "data.frame"
Enlace en línea
*Fijar la base de datos.
attach(prodpesquera)
*Abrir la base de datos.
View(prodpesquera)
Se declara como “Serie de Tiempo”
pp<-ts(prodpesquera$Dato, frequency = 12, start = c(2002, 1))
class(pp)
## [1] "ts"
autoplot(pp, colors="orange", main= "PRODUCCIÓN PESQUERA EN MÉXICO", ylab="toneladas", xlab= "años")
En la gráfica “PRODUCCIÓN PESQUERA EN MÉXICO”, Se pueden analizar los componentes de la serie de tiempo. Para este caso, la serie presenta estacionalidad y tendencia-ciclo, para poder apreciar mejor este hecho, se analizara la grafica por sus componentes.
En la gráfica de arriba se muestran los datos originales, comprobando la estacionalidad de serie de tiempo y los ciclos que muestra. a continuación se muestran los componentes de la serie:
Fit<-decompose(pp)
library(ggplot2)
plot(Fit, col= "pink")
ggseasonplot(pp, year.labels = TRUE, year.labels.left = TRUE)+ ylab("Toneladas")+ xlab("Años") + ggtitle("PRODUCCIÓN PESQUERA EN MÉXICO")
Se pueden apreciar mejor los meses que tienen estacionalidad, por ejemplo; septiembre y febrero.
ggseasonplot(pp, Main= ("PRODUCCIÓN PESQUERA EN MÉXICO"), polar="TRUE")
Con esta gráfica se puede observar mejor la estacionalidad, mostrando claramente que en febrero, abril y septiembre se tiene una menor producción pesquera en el país.
Transformaciòn Box-Cov
BoxCox.ar(pp)
El intervalo a 95% para \(\lambda\), contiene un valor de \(\lambda=0\) muy cerca de su centro y sugiere una transformación logarítmica.
pplog <- log(pp)
plot(pplog, main="PROD.PESQUERA EN MÉXICO", col="pink", ylab="toneladas", xlab="años", lwd=2, type="o", pch=1)
Para estabilizar la varianza se aplican logarítmos (comprime los datos). sin embambargo la serie sigue teniendo problemas con la media. asi que le quitaremos la tendencia con diferencias.
pplog <- log(pp)
autoplot(pplog, main="PROD.PESQUERA EN MÉXICO", col="pink", ylab="toneladas", xlab="años", lwd=2, type="o", pch=1)
difpp <- diff(pplog)
plot(diff(log(pp)), main='Primera Diferencia de Prod. Pesquera en México')
dif2pp <- diff(pp,difference=2)
plot(diff(pp,difference=2), main='Segúnda Diferencia de Prod. Pesquera en México')
library(gridExtra)
p1<- autoplot (log(pp)) + xlab("años") + ylab("toneladas") + ggtitle("Log. de PROD.PESQUERA EN MÉXICO")
p2<- autoplot (diff(log(pp))) + xlab("años") + ylab("toneladas") + ggtitle("Primera Diferencia de PROD.PESQUERA EN MÉXICO")
p3<- autoplot (diff(pp, difference=2)) + xlab("años") + ylab("toneladas") + ggtitle("Segunda Diferencia de PROD.PESQUERA EN MÉXICO")
grid.arrange(p1, p2, p3)
Ya con las diferencias la media se vuelve estable, alrededor de 0.
*Una diferencia de logaritmos puede ser vista tambien como una tasa de crecimeinto.
tasa<-na.omit((pp-zlag (pp))/ zlag(pp))
plot(x=diff(log(pp))[-1], y=tasa[-1])
La gráfica nos muestra una correlación positiva, ya que la recta es muy cercana a 45 grados, eso quiere decir estan saliendo casi los mismos datos. Y eso lo podemos checar con una correlación.
cor(diff(log(pp))[-1], tasa[-1])
## [1] 0.9893194
La correlación es de 0.98; muy cercana a 1. El coeficiente de correlación comprueba lo ya visto en la gráfica; que la diferencia de los logarímos es practicamente una tasa de crecimiento común.
summary(ur.df(dif2pp, type = "none", selectlags = "AIC"))
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression none
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -112442 -22026 3057 21515 97715
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## z.lag.1 -1.97691 0.12329 -16.04 < 2e-16 ***
## z.diff.lag 0.33578 0.07175 4.68 5.74e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 32690 on 174 degrees of freedom
## Multiple R-squared: 0.7675, Adjusted R-squared: 0.7648
## F-statistic: 287.2 on 2 and 174 DF, p-value: < 2.2e-16
##
##
## Value of test-statistic is: -16.0346
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau1 -2.58 -1.95 -1.62
Para que la serie sea estacionaria: phi tiene que ser menor a 1.
H0=No es estacionaria. H1=Ya es estacionaria.
Al tomar la segunada diferencia, se muestra que la serie ya es estacinaria, ya que el valor estadistico es de -16.0346, es mayor a los valores críticos de Tau.
Una caminata aleatoria no es estacionaria. Un ruido blanco si es estacionario.
Se van a utilizar los datos ya transformados y estacionarios.
ggAcf(dif2pp)
Se propone un MA(1)…
ggPacf(dif2pp)
Se propone un AR(2)…
eacf(dif2pp)
## AR/MA
## 0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 x o o o o o o x x o o x o o
## 1 x o o o o o o x o o o x o o
## 2 x x x o o o o o o o o x o o
## 3 x o x o o o o o o o o x o o
## 4 x x x o x o o o o o o x o o
## 5 x o x o x o o o o o o x o o
## 6 x o x o o o o o o o o x o o
## 7 o x x x o x x x o o o x o o
Esta gráfica no es clara para esta serie, así que no ayuda mucho…
ggtsdisplay(dif2pp)
Se observan las opciones de MA(1) y AR(2).
res <- armasubsets(y=dif2pp,nar=10,nma=10,y.name='test',ar.method='ols')
plot(res)
La gráfica muestra que puede ser un AR(1) o un MA(1).
propuesta1<-arima(dif2pp,order = c(2,0,0))
propuesta1
##
## Call:
## arima(x = dif2pp, order = c(2, 0, 0))
##
## Coefficients:
## ar1 ar2 intercept
## -0.6380 -0.3321 33.5283
## s.e. 0.0708 0.0705 1234.6905
##
## sigma^2 estimated as 1.045e+09: log likelihood = -2101.14, aic = 4208.28
El criterio de akaike es muy alto.
propuesta2<-arima(dif2pp,order = c(0,0,1))
propuesta2
##
## Call:
## arima(x = dif2pp, order = c(0, 0, 1))
##
## Coefficients:
## ma1 intercept
## -1.000 -4.2035
## s.e. 0.014 37.6272
##
## sigma^2 estimated as 674354740: log likelihood = -2064.47, aic = 4132.93
El criterio de akaike nos dice que mejoró el modelo al disminuir el criterio de akaike.
ANALIZAR LOS RESIDUOS…
ggAcf(residuals(arima((dif2pp),order=c(2,0,0))))
Los residuos muestran que existe estacionalidad, por tal motivo un modelo sólo No estacionario no es suficiente para demostrar el comportamiento de la serie que se pretende modelar.
ggAcf(residuals(arima((dif2pp),order=c(0,0,1))))
Las gráficas de los residuos para el caso de ambas propuestas muestran que la serie tiene estacionalidad por lo que…
checkresiduals(propuesta1)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(2,0,0) with non-zero mean
## Q* = 159.33, df = 21, p-value < 2.2e-16
##
## Model df: 3. Total lags used: 24
checkresiduals(propuesta2)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(0,0,1) with non-zero mean
## Q* = 116.02, df = 22, p-value = 9.104e-15
##
## Model df: 2. Total lags used: 24
Al parecer el modelo es un ARIMA estacional. Por lo que el modelado se modelará otra vez..
Un modelo ARIMA ESTACIONAL se forma:
\((p,d,q)\) No Estacional. \((P,D,Q)_s\) Estacional.
La diferencia estacional del periodo \(s\) para la serie \({Y_t}\) se denota \(\nabla_s\) \(Y_t=Y_t-Y_{t-s}\)
Existe un pequeño aumento en la varianza, así que se tomaran logarítmos para estabilizar la varianza.
pplog <- log(pp)
autoplot(pplog)+ylab('log(Toneladas)')+xlab('años')+ggtitle('Prod. Pesquera en México')
ggtsdisplay(difpp, main= ("Primer Dif Tipica del Log de Prod. Pesquera"))
Existe un pequeño aumento en la varianza, así que se tomaran logarítmos para estabilizar la varianza.
ggtsdisplay(dif2pp, main= ("Segunda Dif Tipica del Log de Prod. Pesquera"))
Existe un alto componente estacional por lo que se aplica diferencia estacional.
ggtsdisplay(diff(pplog, 12), main= ("Primer Dif estacional del Log de Prod. Pesquera"))
El pico significativo en el rezago 1 del PACF sugiere un componente AR(1) no estacional, y el pico significativo en el rezago 12 sugiere un componente estacional AR(1) En los gráficos de la diferencia estacionaria, hay patrones parecidos en AFC y PACF en los rezagos 1, 12, y vecinos.
Esto sugiere iniciar con un modelo ARIMA (1,0,1)(1,1,1)
fit1<- arima(pplog, order=c(1,0,1), seasonal=c(1,1,1))
fit1
##
## Call:
## arima(x = pplog, order = c(1, 0, 1), seasonal = c(1, 1, 1))
##
## Coefficients:
## ar1 ma1 sar1 sma1
## 0.7428 -0.2946 0.0684 -0.8273
## s.e. 0.1000 0.1504 0.1136 0.0970
##
## sigma^2 estimated as 0.0175: log likelihood = 95.05, aic = -182.09
Ahora se propondrá con un modelo ARIMA (2,0,1)(1,1,2)
fit2<- arima(pplog, order=c(2,0,1), seasonal=c(1,1,2))
fit2
##
## Call:
## arima(x = pplog, order = c(2, 0, 1), seasonal = c(1, 1, 2))
##
## Coefficients:
## ar1 ar2 ma1 sar1 sma1 sma2
## 1.2936 -0.3357 -0.8239 -0.5031 -0.2752 -0.4394
## s.e. 0.1642 0.1265 0.1283 0.9619 0.9483 0.7401
##
## sigma^2 estimated as 0.01734: log likelihood = 96.01, aic = -180.01
Se mostraran los residuos para validar confirmar la validación del modelo.
fit1<- arima(pplog, order=c(1,0,1), seasonal=c(1,1,1))
fit1
##
## Call:
## arima(x = pplog, order = c(1, 0, 1), seasonal = c(1, 1, 1))
##
## Coefficients:
## ar1 ma1 sar1 sma1
## 0.7428 -0.2946 0.0684 -0.8273
## s.e. 0.1000 0.1504 0.1136 0.0970
##
## sigma^2 estimated as 0.0175: log likelihood = 95.05, aic = -182.09
checkresiduals(fit1)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(1,0,1)(1,1,1)[12]
## Q* = 11.164, df = 20, p-value = 0.9419
##
## Model df: 4. Total lags used: 24
Con el valor “P-VALUE” se comprueba la hipotesis de los residuos agrupados. H0:(+0.05) No correlación en los residuos grupales.
H1:(-0.05) Hay correlación serial en los residuos.
En la primer propuesta se obtiene un p-value=0.94, lo que indíca que no hay correlación serial.
fit2<- arima(pplog, order=c(2,0,1), seasonal=c(1,1,2))
fit2
##
## Call:
## arima(x = pplog, order = c(2, 0, 1), seasonal = c(1, 1, 2))
##
## Coefficients:
## ar1 ar2 ma1 sar1 sma1 sma2
## 1.2936 -0.3357 -0.8239 -0.5031 -0.2752 -0.4394
## s.e. 0.1642 0.1265 0.1283 0.9619 0.9483 0.7401
##
## sigma^2 estimated as 0.01734: log likelihood = 96.01, aic = -180.01
checkresiduals(fit2)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(2,0,1)(1,1,2)[12]
## Q* = 11.183, df = 18, p-value = 0.8864
##
## Model df: 6. Total lags used: 24
H0:(+0.05) No correlación en los residuos grupales.
H1:(-0.05) Hay correlación serial en los residuos.
En la primer propuesta se obtiene un p-value=0.88, lo que indíca que no hay correlación serial. Tambien se acepta la Hipotesis nula.
En conclusión es evidente que los residuos individuales y grupales quedaron mucho mejor con la propuesta ARIMA #1, ya que el criterio de akaike es menor, en la prueba de Ljung-Box es de mayor valor y lo mejor es que los residuos individuales y grupales ya no tienen correlación.
propuesta.arima<-auto.arima(pp, stepwise = FALSE, approximation = FALSE)
propuesta.arima
## Series: pp
## ARIMA(2,0,1)(0,1,1)[12]
##
## Coefficients:
## ar1 ar2 ma1 sma1
## 1.3213 -0.3539 -0.8575 -0.8010
## s.e. 0.1329 0.1071 0.0961 0.0746
##
## sigma^2 estimated as 333244907: log likelihood=-1890.8
## AIC=3791.6 AICc=3791.97 BIC=3807.22
A continuación se le aplicará la prueba Ljung-Box y se graficaran los residuos de la propuesta arrojada por “Auto.arima”
Propuesta.arima <- arima(pp, order=c(2,0,1), seasonal=c(0,1,1))
Propuesta.arima
##
## Call:
## arima(x = pp, order = c(2, 0, 1), seasonal = c(0, 1, 1))
##
## Coefficients:
## ar1 ar2 ma1 sma1
## 1.3213 -0.3539 -0.8575 -0.8010
## s.e. 0.1329 0.1071 0.0961 0.0746
##
## sigma^2 estimated as 325309282: log likelihood = -1890.8, aic = 3789.6
checkresiduals(Propuesta.arima)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(2,0,1)(0,1,1)[12]
## Q* = 14.447, df = 20, p-value = 0.8071
##
## Model df: 4. Total lags used: 24
Al parecer con la prueba Ljung-Box el valor de p-value es de 0.80, así que esta aceptando que no hay correlación en los residuos agrupados. Sin embargo la gráfica de los residuos muestra que aun hay un pico fuera de estacionalidad.
lo que comprueba que Auto.arima no siempre escoge el mejor modelo.
\[ Y_t=\phi Y_{t-1}- \theta Y_{t-1}+ \Phi Y_{t-12}- \Theta Y_{t-12}+ e_t \]
\[ Y_t=0.7428 Y_{t-1}- 0.2946 Y_{t-1}+ 0.0684 Y_{t-12}- 0.8273 Y_{t-12} \]
Concluyendo así que la mejor propuesta de modelado de la producción pesquera en México, es un ARIMA (1,0,1)(1,1,1). Mostrando que el modelo tiene una diferencia estacional y componentes estacionales y no estacionales AR(1) Y MA(1).