Librerias a usar

library(foreign) library(stargazer), library(aTSA), library(tseries), library(xts), library(zoo), library(forecast), library(lmtest), library(car), library(dynlm), library(orcutt), library(prais), library(ggplot2)

Funciones de Autocovarianzas y Autocorrelaciones

# Importamos datos y graficamos 
gas <- scan('http://verso.mat.uam.es/~joser.berrendero/datos/gas6677.dat')
plot(gas)

# Indicamos formato de serie temporal
gas.ts = ts(gas, start = c(1966,1), frequency = 12)
plot(gas.ts)

Estabilización de la varianza:

x = log(gas.ts)
plot(x)

Eliminación de la tendencia:

dif1.x = diff(x)
plot(dif1.x)

Eliminación de la estacionalidad:

dif12.dif1.x = diff(dif1.x, lag=12)
plot(dif12.dif1.x)

# renombramos serie y vemos sus datos panel (longitudinales)
serie_estacionaria<-dif12.dif1.x
serie_estacionaria
##                Jan           Feb           Mar           Apr           May
## 1967               -0.0344811884  0.0731454538 -0.1542394309  0.1446936163
## 1968  0.0555961687 -0.0221263599 -0.1265477459  0.2142504234 -0.1641868773
## 1969 -0.0148106737 -0.0045772790  0.0314341409 -0.0297421539  0.0381998394
## 1970 -0.0450647710  0.0421297888  0.0173530496 -0.0971071043  0.0131956704
## 1971 -0.0473569784  0.0046006122  0.0305246645  0.0569402883 -0.0904194419
## 1972  0.0336177909  0.0322383272 -0.0652523154 -0.0275566673  0.1213630425
## 1973  0.0293500157 -0.0509657752  0.0367741897  0.0206122704 -0.1035080285
## 1974 -0.2676219897  0.0739791720 -0.1786670175  0.0530047432  0.0109364718
## 1975  0.2773557553 -0.0898335262  0.1788157306 -0.1361089302  0.0859417343
## 1976 -0.0141266343  0.0133184648 -0.0905190829  0.1006979500 -0.0907460854
## 1977 -0.0093041201 -0.0074903660  0.0080671542  0.0276327759 -0.0157407798
##                Jun           Jul           Aug           Sep           Oct
## 1967 -0.0755538673 -0.0011401681 -0.0308697430  0.0246399254  0.0020886991
## 1968  0.0435156838  0.0245301429 -0.0027090247 -0.0440679016  0.0849384973
## 1969 -0.0225586713  0.0145545561 -0.0179032978  0.0315548501 -0.0394060819
## 1970  0.0476963640 -0.0188699372 -0.0007526337 -0.0120514229  0.0052858665
## 1971  0.0323136736 -0.0222299516 -0.0199599067  0.0271975852 -0.0027395151
## 1972 -0.1133949399  0.0257171006  0.0220793979 -0.0176400653 -0.0030969582
## 1973  0.1337361406 -0.1066076351  0.0479109907 -0.0277880907  0.0608988784
## 1974 -0.0772947394  0.0916088309 -0.0407047961 -0.0154721708  0.0110803066
## 1975 -0.0368788722  0.0137123563 -0.0431364721  0.0716385191 -0.0730742792
## 1976  0.0787754761 -0.0729245413  0.0120134457 -0.0405776708  0.0263500802
## 1977 -0.0184523652  0.0636461513 -0.0584999207                            
##                Nov           Dec
## 1967 -0.0120456734 -0.0164173052
## 1968 -0.0217143730 -0.0200223522
## 1969 -0.0279042518  0.0904883948
## 1970  0.0181618356 -0.0410753940
## 1971  0.0486881384 -0.0256221785
## 1972 -0.0091441603  0.0336139812
## 1973 -0.0331995036  0.1866907294
## 1974  0.0288246422 -0.2143536023
## 1975 -0.0202701027  0.0719969907
## 1976  0.0748543521 -0.0736269369
## 1977

Función de Autocovarianza

Función de Autocorrelación

# autocovarinza 
autocovarianza<-acf(serie_estacionaria, type ="covariance", plot = FALSE)
autocovarianza
## 
## Autocovariances of series 'serie_estacionaria', by lag
## 
##     0.0000     0.0833     0.1667     0.2500     0.3333     0.4167     0.5000 
##  0.0058469 -0.0040379  0.0020699 -0.0011671  0.0007565 -0.0009283  0.0009611 
##     0.5833     0.6667     0.7500     0.8333     0.9167     1.0000     1.0833 
## -0.0007994  0.0005771 -0.0000672 -0.0007991  0.0022112 -0.0032836  0.0025501 
##     1.1667     1.2500     1.3333     1.4167     1.5000     1.5833     1.6667 
## -0.0018310  0.0014730 -0.0012500  0.0014503 -0.0017144  0.0015329 -0.0011042 
##     1.7500 
##  0.0007332
plot(autocovarianza)

  1. Interpretación de la función de autocorrelación (ACF): El eje vertical del correlograma representa los valores de autocorrelación, mientras que el eje horizontal muestra los rezagos. Observa la altura de las barras o puntos en el gráfico para determinar la magnitud de la autocorrelación. Si los puntos están cerca de 1 o -1, indica una fuerte autocorrelación positiva o negativa, respectivamente. Si los puntos están cerca de cero, indica una autocorrelación débil o nula.

  2. Identificación de patrones significativos: Busca patrones significativos en el correlograma. Los rezagos con barras o puntos fuera del intervalo de confianza, a menudo indicado por bandas de sombreado en el gráfico, pueden ser estadísticamente significativos y sugieren autocorrelación significativa en esos rezagos.

  3. Determinación del orden de un posible modelo: Observa los rezagos que están por encima del intervalo de confianza para identificar los rezagos más significativos. Estos rezagos pueden indicar la estructura de dependencia temporal en los datos y ayudar a determinar el orden de un posible modelo autorregresivo (AR) o de media móvil (MA).

  4. Interpretación de la función de autocorrelación parcial (PACF): Si el correlograma también muestra la función de autocorrelación parcial (PACF), analiza los valores de autocorrelación parcial en cada rezago. La PACF ayuda a identificar la correlación directa entre la serie y cada rezago específico, después de eliminar la influencia de los rezagos intermedios. Los rezagos con valores significativos de autocorrelación parcial pueden ser útiles para determinar el orden de un modelo AR.

#autocorrelacion simple
autocorrelacion<-acf(serie_estacionaria, type ="correlation", plot = FALSE)
autocorrelacion
## 
## Autocorrelations of series 'serie_estacionaria', by lag
## 
## 0.0000 0.0833 0.1667 0.2500 0.3333 0.4167 0.5000 0.5833 0.6667 0.7500 0.8333 
##  1.000 -0.691  0.354 -0.200  0.129 -0.159  0.164 -0.137  0.099 -0.011 -0.137 
## 0.9167 1.0000 1.0833 1.1667 1.2500 1.3333 1.4167 1.5000 1.5833 1.6667 1.7500 
##  0.378 -0.562  0.436 -0.313  0.252 -0.214  0.248 -0.293  0.262 -0.189  0.125
plot(autocorrelacion)

#autocorrelacion parcial
autocorrelacion_parcial <-acf(serie_estacionaria, type="partial", plot = FALSE)
autocorrelacion_parcial
## 
## Partial autocorrelations of series 'serie_estacionaria', by lag
## 
## 0.0833 0.1667 0.2500 0.3333 0.4167 0.5000 0.5833 0.6667 0.7500 0.8333 0.9167 
## -0.691 -0.235 -0.121 -0.022 -0.162 -0.045 -0.040 -0.026  0.094 -0.201  0.379 
## 1.0000 1.0833 1.1667 1.2500 1.3333 1.4167 1.5000 1.5833 1.6667 1.7500 
## -0.258 -0.203 -0.201 -0.042 -0.007 -0.028 -0.098 -0.119  0.037  0.031
plot(autocorrelacion_parcial)

1 ) Un coeficiente de autocorrelación parcial cercano a 1 o -1 indica una correlación fuerte positiva o negativa entre la variable y el rezago correspondiente después de eliminar la influencia de los rezagos intermedios.

  1. Un coeficiente de autocorrelación parcial cercano a 0 indica una correlación débil o nula después de eliminar la influencia de los rezagos intermedios.

Prubeas de estacionariedad

#Dickey - Fuller Aumentada:
adf.test(serie_estacionaria)
## Warning in adf.test(serie_estacionaria): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  serie_estacionaria
## Dickey-Fuller = -6.0686, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary
#Phillips - Perron:
pp.test(serie_estacionaria)
## Warning in pp.test(serie_estacionaria): p-value smaller than printed p-value
## 
##  Phillips-Perron Unit Root Test
## 
## data:  serie_estacionaria
## Dickey-Fuller Z(alpha) = -198.52, Truncation lag parameter = 4, p-value
## = 0.01
## alternative hypothesis: stationary

*Observamos que el p-value en ambos casos es menor que 0.01, por lo que aseguramos entonces que nuestra serie de tiempo es Estacionaria. Podemos proceder a correr el modelo Autorregresivo (AR).

Modelo Autorregresivo (AR)

AR1 = dynlm(serie_estacionaria ~ L(serie_estacionaria))
summary(AR1)
## 
## Time series regression with "ts" data:
## Start = 1967(3), End = 1977(8)
## 
## Call:
## dynlm(formula = serie_estacionaria ~ L(serie_estacionaria))
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.192625 -0.028417  0.001279  0.037026  0.165394 
## 
## Coefficients:
##                        Estimate Std. Error t value            Pr(>|t|)    
## (Intercept)           -0.001734   0.004969  -0.349               0.728    
## L(serie_estacionaria) -0.693697   0.064866 -10.694 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.05577 on 124 degrees of freedom
## Multiple R-squared:  0.4798, Adjusted R-squared:  0.4756 
## F-statistic: 114.4 on 1 and 124 DF,  p-value: < 0.00000000000000022
Pronostico = predict(AR1)
Pronostico = ts(Pronostico, start = c(1966,1), frequency = 12)
autoplot(Pronostico, col = "Red", ts.linetype = "dashed")
## Warning in ggplot2::geom_line(na.rm = TRUE, ...): Ignoring unknown parameters:
## `ts.linetype`

autoplot(serie_estacionaria, series = "Estacionaria") + autolayer(Pronostico, series = "Estimado") + labs(title = "Observado VS Estimado", subtitle = "Fuente: Calculos propios") + ylab("") + xlab("") 

Prueba de autocorrelacion

#TEST DURBIN-WATSON
dwtest(AR1,alternative="two.sided") #H1: p!=0
## 
##  Durbin-Watson test
## 
## data:  AR1
## DW = 2.3087, p-value = 0.07071
## alternative hypothesis: true autocorrelation is not 0
dwtest(AR1,alternative="greater") #H1: p>0
## 
##  Durbin-Watson test
## 
## data:  AR1
## DW = 2.3087, p-value = 0.9646
## alternative hypothesis: true autocorrelation is greater than 0
dwtest(AR1,alternative="less") #H1: p<0
## 
##  Durbin-Watson test
## 
## data:  AR1
## DW = 2.3087, p-value = 0.03535
## alternative hypothesis: true autocorrelation is less than 0
# TEST DURBIN-WATSON CON EL "P" ESTIMADO
#para saber si hay autocorrelacion positia o negativa
durbinWatsonTest(AR1,alternative="two.sided") #ambas colas
##  lag Autocorrelation D-W Statistic p-value
##    1       -0.157908      2.308671   0.072
##  Alternative hypothesis: rho != 0
durbinWatsonTest(AR1,alternative="positive")# cola derecha
##  lag Autocorrelation D-W Statistic p-value
##    1       -0.157908      2.308671   0.962
##  Alternative hypothesis: rho > 0
durbinWatsonTest(AR1,alternative="negative") #cola izquuierda
##  lag Autocorrelation D-W Statistic p-value
##    1       -0.157908      2.308671   0.033
##  Alternative hypothesis: rho < 0
#PRUEBA DE BREUSCH-DODFREY
# Prueba de Breusch-Godfrey
bgtest(AR1,order = 1)
## 
##  Breusch-Godfrey test for serial correlation of order up to 1
## 
## data:  AR1
## LM test = 6.548, df = 1, p-value = 0.0105

En resumen, basado en los resultados proporcionados, se puede concluir que hay evidencia significativa de autocorrelación serial en los residuos del modelo. Esto implica que el modelo de regresión lineal no cumple con el supuesto de no autocorrelación, y se deberían considerar técnicas adicionales para abordar esta autocorrelación (Econometria 2)

Experimento Montecarlo

  • El experimento de Montecarlo es una técnica utilizada en estadística y ciencias computacionales para estimar resultados probabilísticos a través de la generación de múltiples muestras aleatorias. Recibe su nombre en referencia a los famosos casinos de Monte Carlo en Mónaco, donde el azar y la probabilidad juegan un papel importante.

  • En un experimento de Montecarlo, se realizan iteraciones repetidas de simulación aleatoria para modelar situaciones en las que los resultados son inciertos o están sujetos a variabilidad. Estas simulaciones se basan en la generación de números aleatorios para representar la incertidumbre en un modelo matemático o en un problema real.

  • El proceso general de un experimento de Montecarlo incluye los siguientes pasos:

  1. Definir el problema: Se establece claramente el problema o la situación que se desea analizar y se identifican las variables relevantes y sus distribuciones de probabilidad.

  2. Generar muestras aleatorias: Se generan múltiples muestras aleatorias de las variables de interés de acuerdo con sus distribuciones de probabilidad establecidas. Esto se hace utilizando algoritmos de generación de números pseudoaleatorios.

  3. Realizar simulaciones: Se llevan a cabo simulaciones o cálculos utilizando las muestras aleatorias generadas. Esto puede implicar la ejecución de modelos matemáticos, simulaciones computacionales o análisis estadísticos.

  4. Analizar los resultados: Se analizan los resultados obtenidos de las simulaciones. Esto puede incluir la estimación de medidas estadísticas, la construcción de intervalos de confianza o la evaluación de probabilidades de ocurrencia de eventos específicos.

  • El experimento de Montecarlo se utiliza en una amplia gama de campos, como la física, la ingeniería, las finanzas, la economía y la toma de decisiones en general. Permite abordar problemas complejos y proporcionar estimaciones aproximadas de resultados en situaciones donde no se dispone de soluciones analíticas o donde los modelos son demasiado complejos para una solución exacta.

  • El experimento de Monte Carlo permite obtener una idea de la distribución de la autocorrelación esperada bajo ciertas condiciones y proporciona una forma de evaluar la autocorrelación en una serie de tiempo de manera simulada. Esto puede ser útil para comprender y analizar el comportamiento de la autocorrelación en diferentes escenarios y explorar cómo se relaciona con otros parámetros o características de interés.

#EXPERIMENTO MONTECARLO

# Generar una semilla para que cada vez que corramos la simulacion obtengamos los mismos resultados
set.seed(101)

#e <- rnorm(observaciones,media,sqrt(desviacion_standard)
e <- rnorm(501,0 ,sqrt(0.09)) #501 observaciones de e ~ N(0,0.09)
head(e)
## [1] -0.09781095  0.16573856 -0.20248315  0.06430784  0.09323077  0.35218989
plot(e,type="l") #plot lineal, dato por datos

#generamos varibales error
u <- 0 #valor inicial 
# for (t in "observacion_2:Ultima_observacion) u[t] <- p* u[t - 1] + e[t]
for (t in 2:501) u[t] <- 0.9 * u[t - 1] + e[t] #hallamos errores desde el moneto t y t-1
head(u)
## [1]  0.00000000  0.16573856 -0.05331845  0.01632123  0.10791987  0.44931777
plot(u,type="l")

# Generación variable del tiempo
# NOTA:
# - Se dejó correr la serie de errores unas 101 observaciones incicialmente para que parezcan más aleatorios los datos de u después de la observación 102
# - Se puede aumentar el tamaño de la muestra para que los coeficientes estimados se acerquen a su verdadero valor

t <- 1:400 # nummero de observaciones a estuduiar (separar los timepos)
base <- as.data.frame(t)
base$u <- u[102:501] # se deseo analizar solo las ultimas 400 obserbaciones ( empezamos una observacion mas adelante para que exista "t-1")
head(base)
##   t         u
## 1 1 0.1381439
## 2 2 0.7643754
## 3 3 1.0397625
## 4 4 1.1598145
## 5 5 0.9746805
## 6 6 0.9035439
base$x = base$t/100 #cremoas valores aleatorios de "X"
base$y = 1 + 0.8*base$x + base$u #cremoas valores aleatorios de "y"


#hacemos regresion

reg <- lm(y~x, data = base)
summary(reg)
## 
## Call:
## lm(formula = y ~ x, data = base)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.69517 -0.45042  0.03173  0.43413  1.39399 
## 
## Coefficients:
##             Estimate Std. Error t value            Pr(>|t|)    
## (Intercept)  1.09608    0.06353   17.25 <0.0000000000000002 ***
## x            0.66491    0.02746   24.21 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6342 on 398 degrees of freedom
## Multiple R-squared:  0.5957, Adjusted R-squared:  0.5946 
## F-statistic: 586.3 on 1 and 398 DF,  p-value: < 0.00000000000000022
  • Ahora usaremos metodos iterativos. Los métodos iterativos son técnicas de resolución de problemas que implican la repetición de un proceso o algoritmo hasta alcanzar una solución deseada o convergencia. En lugar de encontrar una solución directa, los métodos iterativos utilizan aproximaciones sucesivas para acercarse cada vez más a la solución exacta.

  • La regresión Cochrane-Orcutt es un método utilizado para ajustar modelos de regresión lineal cuando se sospecha la presencia de autocorrelación serial en los residuos. Se basa en la estimación de la autocorrelación y utiliza un enfoque iterativo para obtener estimaciones eficientes de los coeficientes del modelo.

  • El método de Prais-Winsten es una técnica de ajuste de regresión que se utiliza cuando se sospecha la presencia de autocorrelación serial en los errores de un modelo de regresión. Es una extensión del método de Cochrane-Orcutt y aborda algunas de sus limitaciones.

  • El método de Prais-Winsten se utiliza en particular cuando la autocorrelación en los errores sigue un proceso de primer orden. A diferencia del método de Cochrane-Orcutt, que asume que el coeficiente de autocorrelación es constante, el método de Prais-Winsten estima un coeficiente de autocorrelación corregido en cada paso iterativo

#Regresion Cochrane Orcutt
reg_coch <- cochrane.orcutt(reg)
reg_coch
## Cochrane-orcutt estimation for first order autocorrelation 
##  
## Call:
## lm(formula = y ~ x, data = base)
## 
##  number of interaction: 3
##  rho 0.891056
## 
## Durbin-Watson statistic 
## (original):    0.22477 , p-value: 1.509e-71
## (transformed): 1.89239 , p-value: 1.297e-01
##  
##  coefficients: 
## (Intercept)           x 
##    1.143777    0.630122
summary(reg_coch)
## Call:
## lm(formula = y ~ x, data = base)
## 
##             Estimate Std. Error t value     Pr(>|t|)    
## (Intercept)  1.14378    0.27913   4.098 0.0000506089 ***
## x            0.63012    0.11689   5.391 0.0000001207 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.293 on 397 degrees of freedom
## Multiple R-squared:  0.0682 ,  Adjusted R-squared:  0.0659
## F-statistic: 29.1 on 1 and 397 DF,  p-value: < 1.207e-07
## 
## Durbin-Watson statistic 
## (original):    0.22477 , p-value: 1.509e-71
## (transformed): 1.89239 , p-value: 1.297e-01
# Regresion Prais-Winsten
reg_prais <- prais_winsten(y~x, data=base, index = "t")
## Iteration 0: rho = 0
## Iteration 1: rho = 0.891
## Iteration 2: rho = 0.8911
## Iteration 3: rho = 0.8911
reg_prais
## 
## Call:
## prais_winsten(formula = y ~ x, data = base, index = "t")
## 
## Coefficients:
## (Intercept)            x  
##      1.1432       0.6303  
## 
## AR(1) coefficient rho: 0.8911
summary(reg_prais)
## 
## Call:
## prais_winsten(formula = y ~ x, data = base, index = "t")
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.61507 -0.42623  0.03084  0.44188  1.43919 
## 
## AR(1) coefficient rho after 3 iterations: 0.8911
## 
## Coefficients:
##             Estimate Std. Error t value     Pr(>|t|)    
## (Intercept)   1.1432     0.2560   4.465 0.0000104375 ***
## x             0.6303     0.1095   5.756 0.0000000173 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2926 on 398 degrees of freedom
## Multiple R-squared:  0.06982,    Adjusted R-squared:  0.06748 
## F-statistic: 29.87 on 1 and 398 DF,  p-value: 0.00000008149
## 
## Durbin-Watson statistic (original): 0.2248 
## Durbin-Watson statistic (transformed): 1.904
# Regresion Prais-Winsten, una sola iteracion
summary(prais_winsten(y~x, twostep=TRUE,data=base, index = "t"))
## Iteration 0: rho = 0
## Iteration 1: rho = 0.891
## 
## Call:
## prais_winsten(formula = y ~ x, data = base, index = "t", twostep = TRUE)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.61512 -0.42621  0.03084  0.44186  1.43916 
## 
## AR(1) coefficient rho after 1 iterations: 0.891
## 
## Coefficients:
##             Estimate Std. Error t value     Pr(>|t|)    
## (Intercept)   1.1431     0.2559   4.468 0.0000103109 ***
## x             0.6304     0.1095   5.759 0.0000000169 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2926 on 398 degrees of freedom
## Multiple R-squared:  0.06991,    Adjusted R-squared:  0.06757 
## F-statistic: 29.92 on 1 and 398 DF,  p-value: 0.00000007987
## 
## Durbin-Watson statistic (original): 0.2248 
## Durbin-Watson statistic (transformed): 1.904