Está en la página 1de 8

Modelos Dinamicos:

1) INSTALL LIBRARIES (ONLY ONCE):


install.packages('here')
install.packages("urca")
install.packages("readxl")

2) CLEAN MEMORY:
rm(list=ls())

3) SET WORKING DIRECTORY:

setwd(here::here()) #sets the script folder as default

4) EXTRACT FROM DATA FRAME AND CONVERT TO TIME SERIES:

y = ts(data=dat[,1],start=1,frequency=1)

5) plot(y) -> Me da el grafico de residuos

#+ Autocorrelation

6) acf(y) -> Me da el grafico de Autocorrelacion

Modelling
7) CENTER STATIONARY SERIES:

u = y - mean(y) -> Centro la serie

Selección del modelo:


Viendo el grafico de Autocorrelación, me doy cuenta que tengo dos autocorrelaciones
significativas, ya que superan la línea punteada.
Nunca voy a poder seleccionar un Ma(1) ya que tengo dos autocorrelaciones
significativas, no me serviría, tampoco me serviría un Ma(3).
Si me sirve un Ma(2), así como también un Ar(1), Ar(2, ARMA (1,1).

8) ARIMA MODELLING:

-> Comienzo con un modelo posible que es el MA(2)

mod <- arima(u,order=c(0,0,2),include.mean=F) # (Ma(2))

#order=c(p,d,q)

P=Orden autoregresivo(Ma no lo tienen )


Q=Orden de media móvil (Ar no lo tienen)
9) EXTRACT RESULTS:
mod

Respuesta:

Call:
arima(x = u, order = c(0, 0, 2), include.mean = F)

Coefficients:
ma1 ma2
-0.3193 0.3020
s.e. 0.1159 0.1232

sigma^2 estimated as 114.4: log likelihood = -265.35, aic = 536.71

Acá extraigo los tita y los phi, yo se que en un modelo Ar -> Phi
Modelo Ma -> Tita

phi = mod$model$phi
p = length(phi[phi!=0])
theta = mod$model$theta
q = length(theta[theta!=0])

10) PARAMETER SIGNIFICANCE:

param <- sprintf("%1.3f",mod$coef)


tstat <- mod$coef/sqrt(diag(mod$var.coef))
pvalue <- 2*(1-pnorm(abs(tstat))); pvalue <- sprintf("%1.3f",pvalue)
cbind(param,tstat,pvalue)

Respuesta:

param tstat pvalue


ma1 "-0.319" "-2.75424935262777" "0.006"
ma2 "0.302" "2.45038989044122" "0.014"

Ensayo de Wald:

Como los pvalue son menores o iguales que p(0.05) -> Se cumple CR, son significativos

Cr) pvalue <= 0.05

11) SACO LAS RAÍCES:

zma = polyroot(c(1,theta));Mod(zma)

[1] 1.819765 1.819765

Como las raíces son >1 -> El modelo es invertible.

12) DINAMICA RESIDUAL:

Para ver si tienen dinámica residual, me fijo de la siguiente manera:

plot(mod$residuals/sqrt(mod$sigma2))#errores que comete el modelo cuando pronostico


estos 70 datos
acf(mod$residuals) #funcion de autocorrelación de los residuos.
Según este grafico no habría problema, nos hace confiar y vemos que no hay
autocorrelación, pero nosotros tenemos que verificarlo con el ensayo de LJUNG AND BOX:

LJUNG & BOX


i=1; H0=NA; Q=NA; df=NA; pval=NA
for (i in (p+q+1):(p+q+11)) {LB <- Box.test(mod$residuals,lag=i,type="Ljung-
Box",fitdf=p+q)
;H0[i]=paste("r1=...=r",toString(i),"=0",sep="")
;Q[i]=LB$statistic; df[i]=LB$parameter; pval[i]=LB$p.value}
tab <- cbind(H0,Q,df,sprintf("%1.4f",pval)); colnames(tab)[4]<-"p-val"
print(tab,quote=F)

Respuesta:
H0 Q df p-val
[1,] <NA> <NA> <NA> NA
[2,] <NA> <NA> <NA> NA
[3,] r1=...=r3=0 1.37050182900522 1 0.2417
[4,] r1=...=r4=0 1.38121821203936 2 0.5013
[5,] r1=...=r5=0 1.97263358145614 3 0.5781
[6,] r1=...=r6=0 2.29620510125929 4 0.6815
[7,] r1=...=r7=0 2.4697890164916 5 0.7810
[8,] r1=...=r8=0 2.74843991270973 6 0.8397
[9,] r1=...=r9=0 2.92540002427335 7 0.8918
[10,] r1=...=r10=0 3.55557089281086 8 0.8948
[11,] r1=...=r11=0 4.37805651347603 9 0.8848
[12,] r1=...=r12=0 4.46509931867859 10 0.9239
[13,] r1=...=r13=0 5.21915565155016 11 0.9201

Obtenemos una tabla con las hipótesis de LJUNG & BOX, para varios h

GL = h-p

Como todos los pvalue> 0.05

No rechazo ninguna de las hipótesis, No rechazo el modelo.

(cuando se rechaza el ensayo de LJUNG & BOX se descarta el modelo, no es válido)

13) EVALUATION: SCHWARZ INDICATOR:

BIC(mod)

Respuesta:

#[1] 543.4521
-> Comienzo con otro modelo posible que es el AR(1)

mod <- arima(u,order=c(1,0,0),include.mean=F) # (AR(1))

#order=c(p,d,q)

P=Orden autoregresivo(Ma no lo tienen )


Q=Orden de media móvil (Ar no lo tienen)

1) EXTRACT RESULTS:
mod

Respuesta:

Coefficients:
ar1
-0.4184
s.e. 0.1128

sigma^2 estimated as 116.6: log likelihood = -265.99, aic = 535.98

Acá extraigo los tita y los phi, yo se que en un modelo Ar -> Phi
Modelo Ma -> Tita

phi = mod$model$phi
p = length(phi[phi!=0])
theta = mod$model$theta
q = length(theta[theta!=0])

Respuesta:

Phi1 = -0,4184

2) PARAMETER SIGNIFICANCE:

param <- sprintf("%1.3f",mod$coef)


tstat <- mod$coef/sqrt(diag(mod$var.coef))
pvalue <- 2*(1-pnorm(abs(tstat))); pvalue <- sprintf("%1.3f",pvalue)
cbind(param,tstat,pvalue)

Respuesta:

param tstat pvalue


ar1 "-0.418" "-3.70981654145207" "0.000"

Ensayo de Wald:

Como el pvalue es menor o igual que p(0.05) -> Se cumple CR, es significativo

Cr) pvalue <= 0.05

3) SACO LAS RAÍCES:

zar = polyroot(c(1,-phi));Mod(zar)

No es necesario fijarme las raíces por ser un Ar(1), a partir del Ar(2) Si.
Al ser un modelo Ar(1) solamente alcanza con fijarme Phi1=-0.418

-1 < Phi1 < 1 -> El modelo es invertible.

4) DINAMICA RESIDUAL:

Para ver si tienen dinámica residual, me fijo de la siguiente manera:

plot(mod$residuals/sqrt(mod$sigma2))#errores que comete el modelo cuando pronostico


estos 70 datos
acf(mod$residuals) #funcion de autocorrelación de los residuos.
Según este grafico no habría problema, nos hace confiar y vemos que no hay
autocorrelación, pero nosotros tenemos que verificarlo con el ensayo de LJUNG AND BOX:

LJUNG & BOX


i=1; H0=NA; Q=NA; df=NA; pval=NA
for (i in (p+q+1):(p+q+11)) {LB <- Box.test(mod$residuals,lag=i,type="Ljung-
Box",fitdf=p+q)
;H0[i]=paste("r1=...=r",toString(i),"=0",sep="")
;Q[i]=LB$statistic; df[i]=LB$parameter; pval[i]=LB$p.value}
tab <- cbind(H0,Q,df,sprintf("%1.4f",pval)); colnames(tab)[4]<-"p-val"
print(tab,quote=F)

Respuesta:
H0 Q df p-val
[1,] <NA> <NA> <NA> NA
[2,] r1=...=r2=0 2.12628596454262 1 0.1448
[3,] r1=...=r3=0 2.27170129075911 2 0.3211
[4,] r1=...=r4=0 2.42385832691912 3 0.4892
[5,] r1=...=r5=0 3.56907040054391 4 0.4675
[6,] r1=...=r6=0 4.52240319467809 5 0.4769
[7,] r1=...=r7=0 4.54141571214677 6 0.6038
[8,] r1=...=r8=0 4.79920791370132 7 0.6845
[9,] r1=...=r9=0 4.87956946524226 8 0.7704
[10,] r1=...=r10=0 5.61686740236209 9 0.7776
[11,] r1=...=r11=0 6.83832047982265 10 0.7406
[12,] r1=...=r12=0 6.89749695621039 11 0.8073

Obtenemos una tabla con las hipótesis de LJUNG & BOX, para varios h

GL = h-p

Como todos los pvalue > 0.05

No rechazo ninguna de las hipótesis, No rechazo el modelo.

(cuando se rechaza el ensayo de LJUNG & BOX se descarta el modelo, no es válido)

5) EVALUATION: SCHWARZ INDICATOR:

BIC(mod)

Respuesta:

[1] 540.4774

Cuanto menor es el BIC, mejor es, ósea uso el menor.


-> Comienzo con otro modelo posible que es el AR(2)

mod <- arima(u,order=c(2,0,0),include.mean=F) # (AR(2))

#order=c(p,d,q)

P=Orden autoregresivo(Ma no lo tienen )


Q=Orden de media móvil (Ar no lo tienen)

1) EXTRACT RESULTS:
mod

Respuesta:

Coefficients:
ar1 ar2
-0.3401 0.1878
s.e. 0.1216 0.1222

sigma^2 estimated as 112.7: log likelihood = -264.83, aic = 535.67

Acá extraigo los tita y los phi, yo se que en un modelo Ar -> Phi
Modelo Ma -> Tita

phi = mod$model$phi
p = length(phi[phi!=0])
theta = mod$model$theta
q = length(theta[theta!=0])

Respuesta:

Phi1 = -0,3401
Phi1 = 0,1878

2) PARAMETER SIGNIFICANCE:

param <- sprintf("%1.3f",mod$coef)


tstat <- mod$coef/sqrt(diag(mod$var.coef))
pvalue <- 2*(1-pnorm(abs(tstat))); pvalue <- sprintf("%1.3f",pvalue)
cbind(param,tstat,pvalue)

Respuesta:
param tstat pvalue
ar1 "-0.340" "-2.79560749645711" "0.005"
ar2 "0.188" "1.53659665190323" "0.124"

Ensayo de Wald:

Como el pvalue1 es menor o igual que p(0.05) -> Se cumple CR, es significativo
Como el pvalue2 es mayor que 0.05 -> No esta aportando mucho

Cr) pvalue <= 0.05

3) SACO LAS RAÍCES:

Aca si tengo que sacar las raíces, por ser un Ar(2)

zar = polyroot(c(1,-phi));Mod(zar)

Respuesta:

[1] 1.573432 3.384427

Los módulos de las raíces son >1 (Recordar que es condición para que sea invertible)
4) DINAMICA RESIDUAL:

Para ver si tienen dinámica residual, me fijo de la siguiente manera:

plot(mod$residuals/sqrt(mod$sigma2))#errores que comete el modelo cuando pronostico


estos 70 datos
acf(mod$residuals) #funcion de autocorrelación de los residuos.

Según este grafico no habría problema, nos hace confiar y vemos que no hay
autocorrelación, pero nosotros tenemos que verificarlo con el ensayo de LJUNG AND BOX:

LJUNG & BOX


i=1; H0=NA; Q=NA; df=NA; pval=NA
for (i in (p+q+1):(p+q+11)) {LB <- Box.test(mod$residuals,lag=i,type="Ljung-
Box",fitdf=p+q)
;H0[i]=paste("r1=...=r",toString(i),"=0",sep="")
;Q[i]=LB$statistic; df[i]=LB$parameter; pval[i]=LB$p.value}
tab <- cbind(H0,Q,df,sprintf("%1.4f",pval)); colnames(tab)[4]<-"p-val"
print(tab,quote=F)

Respuesta:
H0 Q df p-val
[1,] <NA> <NA> <NA> NA
[2,] <NA> <NA> <NA> NA
[3,] r1=...=r3=0 0.0362284907614311 1 0.8490
[4,] r1=...=r4=0 0.292859073237921 2 0.8638
[5,] r1=...=r5=0 0.978945863520713 3 0.8063
[6,] r1=...=r6=0 1.87132484284915 4 0.7594
[7,] r1=...=r7=0 2.18002404171661 5 0.8237
[8,] r1=...=r8=0 2.50005297919435 6 0.8685
[9,] r1=...=r9=0 2.74286236267376 7 0.9077
[10,] r1=...=r10=0 3.6944148030301 8 0.8836
[11,] r1=...=r11=0 4.42142878811323 9 0.8816
[12,] r1=...=r12=0 4.45368125997938 10 0.9246
[13,] r1=...=r13=0 6.3659455184602 11 0.8479

Obtenemos una tabla con las hipótesis de LJUNG & BOX, para varios h

GL = h-p

Como todos los pvalue > 0.05

No rechazo ninguna de las hipótesis, No rechazo el modelo.

(cuando se rechaza el ensayo de LJUNG & BOX se descarta el modelo, no es válido)

5) EVALUATION: SCHWARZ INDICATOR:

BIC(mod)

Respuesta:

[1] 542.4107
#++ Validation of model stationarity & invertibility
#+ Characteristic equation roots (modulus)
zar = polyroot(c(1,-phi)); Mod(zar)
zma = polyroot(c(1,theta)); Mod(zma)

#++ Validation of residual dynamics


#+ Residuals
plot(mod$residuals/sqrt(mod$sigma2))
acf(mod$residuals)
#+ Ljung & Box
i=1; H0=NA; Q=NA; df=NA; pval=NA
for (i in (p+q+1):(p+q+11)) {LB <- Box.test(mod$residuals,lag=i,type="Ljung-
Box",fitdf=p+q)
;H0[i]=paste("r1=...=r",toString(i),"=0",sep="")
;Q[i]=LB$statistic; df[i]=LB$parameter; pval[i]=LB$p.value}
tab <- cbind(H0,Q,df,sprintf("%1.4f",pval)); colnames(tab)[4]<-"p-val"
print(tab,quote=F)

#++ Evaluation: Schwarz indicator


BIC(mod)

#+++ Deterministic trend


t = 0:(length(y)-1)
#+ Static model on time
mstat <- lm(y~t)
#+ Static model on time and season
#mstat = lm(y~t+m01+m02+m03+m04+m05+m07+m08+m09+m10+m11+m12, dat)
summary(mstat)
plot(y,col='red')
lines(t,predict(mstat),col='blue')
#+ Eliminate deterministic trend
u = ts(mstat$resid,start=1,frequency=1)
plot(u)

#+++ Stochastic trend (cycles, random walk)


#+ Dickey & Fuller: H0) y(t) has a unit root
require(urca)
summary(ur.df(y,type="drift",selectlags='BIC')) #D&F: type=none|drift|trend
#+ Eliminate stochastic trend
u = diff(y)
plot(u)
summary(ur.df(u,type="none",selectlags='BIC')) #check more unit roots

#+++++ Appendix +++++

#+++ Deflact
# Import price index (same time as y)
cpiusa <- readxl::read_xls("CPI USA.xls")
cpi = cpiusa$cpi
cpi = cpi/cpi[length(cpi)]
y = y / cpi
plot(y)

También podría gustarte