7 ago 2024

Simulación, calibración y estimación: ejemplos en AR(1) en R

 Las palabras simular, estimar, calibrar e identificar, aparecen de forma recurrente en la economía aplicada. Estas representan una extensión de la forma de pensar y el desarrollo de aplicaciones teóricas.  Es frecuente que la identificación y calibración se tomen como sub conjuntos de la estimación. Suponga observamos una serie y(t), sobre la que suponemos sigue un proceso ar(1). Por ejemplo:

 y(t)=phi_1* y(t-1)+ e(t)  e(t)~N(0,sigma)

Podemos a partir de ciertos supuestos simular una serie que cumpla con estas características, con el objetivo de estudiar sus propiedades o su comportamiento bajo ciertas modificaciones. Un caso distinto es intentar recuperar los coeficientes phi_1 y sigma de un AR(1), aquí entra la estimación, que permite obtenerlos a partir de algún procedimiento estadístico como el de Mínimo Cuadrados Ordinarios (MCO) o máxima verosimilitud (mle). Mientras que la calibración, también pretende recuperar los coeficientes del modelo, pero a partir de suposiciones o conocimientos previos, buscando que el valor calibrado permita obtener una variable y*(t) parecida al valor observado. 

 1.       Simular

 En la siguiente entrada se simula en R un autoregresivo ar(1):

 y(t)=0.8* y(t-1)+ e(t)  e(t)~N(0,1)

 Se muestra que la simulación de series temporales, y entre calibrar y estimar un modelo. “Simular datos implica generar una serie temporal sintética a partir de un modelo AR(1) con parámetros conocidos” (ChatGPT, 2024).

 # Cargar las librerías necesarias

library(ggplot2)
library(dplyr)
library(tidyr)
library(stats4)
 
# Simular ---------------------
# Parámetros del modelo AR(1)
phi <- 0.8
sigma <- 1
n <- 100
 
# Simular la serie temporal
set.seed(2)
y <- numeric(n)
y[1] <- rnorm(1, mean = 0, sd = sigma)
 
for (t in 2:n) {
  y[t] <-  phi * y[t-1] + rnorm(1, mean = 0, sd = sigma)
}
 
# Crear una secuencia de fechas
fechas <- seq.Date(from = as.Date("2000-01-01"), by = "days", length.out = n)
 
# Crear un data frame con la serie temporal simulada
data <- data.frame(fecha = fechas, y = y)
 
ggplot(data, aes(fechas, y)) +
  geom_line() +
  theme_minimal()

2.       Calibrar

“Calibrar un modelo implica ajustar los parámetros del modelo basándose en conocimientos previos o estimaciones empíricas sin realizar un proceso formal de estimación. Es una forma de "ajustar" el modelo para que sea razonable para la situación específica. La calibración se refiere ajustar los parámetros del modelo basándose en conocimientos previos o estimaciones empíricas sin un proceso formal de estimación. Utiliza datos observados pero no sigue un método estadístico forma” (ChatGPT, 2024).

En la práctica, consiste en seleccionar un conjunto de parámetros de preferencia a partir de las referencias disponibles en la teoría económica, con la intención de que los modelos imiten alguna característica histórica de los datos (Hoover, 1995). Es decir, “La calibración se realiza con mayor frecuencia probando distintos valores para los parámetros hasta que el modelo logre predicciones con la menor desviación posible de los datos o reproduzca otras características empíricas” (Stackexchange, 2020). Los modelos calibrados son una herramienta importante de la investigación económica, esta herramienta ha surgido como evolución y extensión de la capacidad de los economistas para teorizar (Cooley, 1997).

# Serie temporal observada (ejemplo)
y_obs <- y
 
# Calibración: Asumir un valor razonable para phi
phi_calibrado <- 0.8
 
phi_calibrado <- 0.8
y_calibrado <- numeric(n)
y_calibrado[1] <- y[1]
 
for (t in 2:n) {
  y_calibrado[t] <- phi_calibrado * y_calibrado[t-1] + rnorm(1, mean = 0, sd = sigma)
}
 
data$y_calibrado <- y_calibrado
 
ggplot(data) +
  geom_line(aes(fechas, y, color = "Obs")) +
  geom_line(aes(fechas, y_calibrado, color = "Calibrado")) +
  theme_minimal()

 

Algunas recomendaciones identificadas en la literatura:

 ·         No justificar el uso solo porque otros autores lo han utilizado (Cooley, 1997).

 3.       Estimar

 La estimación toma los datos como dados y los utilizan para determinar los parámetros del modelo a partir de un estadístico (que es una función de la muestra), buscando que este sea insesgado, consistente y eficiente. En este procedimiento, el valor de un estadístico se utiliza para estimar un parámetro, por tanto, la estimación “utiliza métodos estadísticos formales (como MLE) para determinar los parámetros del modelo a partir de los datos observados. Es un enfoque más riguroso que la calibración y proporciona estimaciones con propiedades estadísticas deseables” (ChatGPT, 2024). En otras palabras, se utiliza un procedimiento estadístico formal para la estimación de los coeficientes del modelo.

 # Estimación usando MLE
library(stats4)
 
# Log-verosimilitud de un modelo AR(1)
logLik_AR1 <- function(phi, sigma) {
  n <- length(y_obs)
  eps <- numeric(n)
  eps[1] <- y_obs[1] # inicializamos el primer error
 
  for (t in 2:n) {
    eps[t] <- y_obs[t] - phi * y_obs[t-1]
  }
 
  logLik <- -0.5 * n * log(2 * pi * sigma^2) - sum(eps^2) / (2 * sigma^2)
  return(logLik)
}
 
# Función de verosimilitud negativa para optimización
negLogLik_AR1 <- function(phi, sigma) {
  -logLik_AR1(phi, sigma)
}
 
# Optimizar para encontrar los parámetros MLE
mle_fit <- mle(negLogLik_AR1, start = list(phi = 0.5, sigma = 1))
 
# Resultados de la estimación
summary(mle_fit)
 
Maximum likelihood estimation
 
Call:
mle(minuslogl = negLogLik_AR1, start = list(phi = 0.5, sigma = 1))
 
Coefficients:
       Estimate Std. Error
phi   0.7218984 0.06979479
sigma 1.1476188 0.08114858
 
-2 log L: 311.3256

# -------------------------------------------------------------------------------------
# Obtener los parámetros estimados
phi_estimado <- coef(mle_fit)["phi"]
sigma_estimado <- coef(mle_fit)["sigma"]
 
# Generar la serie temporal con los parámetros estimados
y_estimado <- numeric(n)
y_estimado[1] <- y[1]
 
for (t in 2:n) {
  y_estimado[t] <- phi_estimado * y_estimado[t-1] + rnorm(1, mean = 0, sd = sigma_estimado)
}
 
data$y_estimado <- y_estimado
 
# Graficar los datos simulados, calibrados y estimados
data_long <- data %>%
  pivot_longer(cols = c(y, y_calibrado, y_estimado), names_to = "serie", values_to = "valor")
 
ggplot(data_long, aes(x = fecha, y = valor, color = serie)) +
  geom_line(size = 0.7) +
  theme_minimal() +
  labs(title = "Simulación, Calibración y Estimación de un Modelo AR(1)",
       x = "Fecha", y = "Valor",
       color = "Serie") +
scale_color_manual(values = c("y" = "black", "y_calibrado" = "green", "y_estimado" = "red")) +
  theme(plot.title = element_text(hjust = 0.5),
        legend.position = "bottom")

Bibliography

Cooley, T. (1997). Calibrated Models. University of Rochester.

Hoover, K. (1995). Facts and artifacts: calibration and the empirical assessment of real-business-cycle models. Oxford Economic Papers 47 (1), 24-44.

 

Recodificación de variables usando dplyr en R

Una base de datos suele tener diversos tipos de variables del tipo cualitativo y cuantitativo. En función del tipo de variables aplicamos di...