21 oct 2014

Ejercicios de simulación de series de tiempo en Stata

1.1. Ruido Blanco

clear all
*Generar un Ruido Blanco
set obs 100
gen obs=_n
tsset  obs

generate normal=invnorm(uniform())
line normal obs


1.2.    Paseo aleatorio

*----------------------------------------------------------------
*RANDOM WALKS

forvalues i=1(1)3 {
    gen random_walk_`i'=100
}

*Initial condition: y(0) = 100
*N(0,1) *N(0,5) *N(0,10)
       replace random_walk_1= random_walk_1[_n-1] +    normal if _n>=2
       replace random_walk_2= random_walk_2[_n-1] +  5*normal if _n>=2
       replace random_walk_3= random_walk_3[_n-1] + 10*normal if _n>=2

Se gráfican las series generadas

twoway line random_walk_1 obs ||line random_walk_2 obs ||line // random_walk_3 obs, ylabel(, nogrid)

Una vez obtenidas las series se calculan las funciones de autocorrelación simple y parcial del proceso son:

ac  random_walk_2, saving(Random_Walks_ac, replace)
pac random_walk_2, saving(Random_Walks_pac, replace)

gr combine Random_Walks_ac.gph Random_Walks_pac.gph

Modificando el código anterior se puede generar caminatas aleatorias partiendo del cero.

*RANDOM WALKS (Around zero)
*Initial condition: y(0) = 0
  gen random_walk00 = 0
      replace random_walk00 = random_walk00[_n-1] +  5*normal if _n>=2

line random_walk00 obs

1.3. Proceso autoregresivo

forvalues i=1(1)3 {
    gen AR_`i'=0
}

* AR-coef: ,99 * AR-coef: ,90 *AR-coef: ,30
       replace AR_1 = (0.99*AR_1[_n-1]) +  5*normal if _n>=2
       replace AR_2 = (0.90*AR_2[_n-1]) +  5*normal if _n>=2
       replace AR_3 = (0.30*AR_3[_n-1]) +  5*normal if _n>=2

twoway line AR_1 obs ||line AR_2 obs ||line AR_3 obs, ylabel(, nogrid)

Las funciones de autocorrelación simple y parcial se obtienen en el siguiente comando, observando como a medida que el parámetro se acerca a 1, este se aleja de la estacinariedad.

*Funciones ACS y ACP
ac  AR_3, saving(AR_ac30, replace)
pac AR_3, saving(AR_pac30, replace)
gr combine AR_ac30.gph AR_pac30.gph

*Funciones ACS y ACP
ac  AR_1, saving(AR_ac99, replace)
pac AR_1, saving(AR_pac99, replace)
gr combine AR_ac99.gph AR_pac99.gph

Las series anteriores podrían incluir una una constante, simplemente modificando las lineas de comando donde generamos las series.

*---------------------------------------------
local alpha=5

forvalues i=1(1)3 {
    gen AR_`i'`i'=0
}

AR-coef: ,99 * AR-coef: ,90 *AR-coef: ,30
      replace AR_11 = `alpha'+(0.99*AR_1[_n-1]) +  5*normal if _n>=2
      replace AR_22 = `alpha'+(0.90*AR_2[_n-1]) +  5*normal if _n>=2
      replace AR_33 = `alpha'+(0.30*AR_3[_n-1]) +  5*normal if _n>=2

twoway line AR_11 obs ||line AR_22 obs ||line AR_33 obs, ylabel(, nogrid) saving(AR, replace)

1.4. Ruido Blanco con constante

Continuando el primer apartado.  un camino aleatorio puede tener una constante, A la innovación, se le suman constante iguales a 4 o 5. Estos pueden tener media no nula.

gen ruido_noise_drift3 = 3+normal
gen ruido_noise_drift5 = 5+normal
twoway line ruido_noise_drift3 obs ||line ruido_noise_drift5 obs

Las funciones de autocorrelación simple y parcial del proceso se representan por:

*Funciones ACS y ACP
ac  ruido_noise_drift3, saving(ruido_noise_drift3ac, replace)
pac ruido_noise_drift3, saving(ruido_noise_drift3pac, replace)
gr combine ruido_noise_drift3ac.gph ruido_noise_drift3pac.gph

1.5. Ruido Blanco con  deriva

Sumar una constante a un camino aleatoria, se genera una tendencia, No determinista. No se parece a una tendencia determinista, aunque parecería

T(t)= alpha+t(t-1)+e(t)

*WHITE NOISE with drift

forvalues i=1(1)2 {
    gen random_walk_drift_`i'=100
}

*Initial condition: y(0) = 100
 *N(0,5)
       replace random_walk_drift_1 = random_walk_drift_1[_n-1]+ 1 +  5*normal if _n>=2
       replace random_walk_drift_2 = random_walk_drift_2[_n-1]+ 5 +  5*normal if _n>=2

twoway line random_walk_drift_1 obs ||line random_walk_drift_1 obs

1.6. Proceso autoregresivo con tendencia estocástica y deterministica

*----------------------------------------------------------------
*AUTOREGRESSIVE PROCESSES with tendencia estocastica y deterministica

gen AR_det_1 = 150
gen AR_est_1 = 150

local alpha=10
*AR-coef: ,99
       replace AR_est_1 = `alpha'+(0.9*AR_est_1[_n-1]) +  0.5*normal if _n>=2
       replace AR_det_1 = `alpha'+(0.9*AR_det_1[_n-1])               if _n>=2

twoway line AR_est_1 obs ||line AR_det_1 obs

         1.7. Proceso autoregresivo de orden dos AR(2) (Estacionarios y no)

*AUTOREGRESSIVE PROCESSES AR(2)
*stationary
 
       gen AR_sta_2 = 100
          replace AR_sta_2 = 100+normal if _n==2
          replace AR_sta_2 = `alpha'+ 0.6*AR_sta_2[_n-1] +  0.3*AR_sta_2[_n-2] + normal if _n>=3
   
   twoway line AR_sta_2 obs    

Ahora se genera un proceso no estacionario de orden 2.

No estacionario

*Nostationary
      gen AR_nsta_2 = 100
          replace AR_nsta_2 = 100+normal if _n==2
          replace AR_nsta_2 = 1.5*AR_nsta_2[_n-1] -  0.5*AR_nsta_2[_n-2] + normal if _n>=3
   
   twoway line AR_nsta_2 obs   ||  line AR_sta_2 obs  

   1.8. Proceso media móvil, MA(1)

Creando variables por grupos en dplyr (group_by + mutate)

  Simulemos una base de hogares, donde se identifica el hogar, el sexo (1 mujer) y provincia y edad para cada miembro.   # Definir la lista ...