5 Simulación

En este capítulo se muestra como simular datos que sigan un modelo o estructura dada. Aprender a simular datos es de mucha utilidad para comprender la naturaleza de los datos y para poner a prueba algunos procedimientos de modelos de regresión.

Preguntas sobre simulación en StackOverFlow

Una de las preguntas más frecuente que hacen los usuarios en StackOverFlow es: “How to simulate linear models in R?”. Muchas respuestas se han dado para ayudar a esos usuarios que necesitan simular datos con una estructura dada.

A continuación se muestran algunas de esas preguntas/respuestas hechas en StackOverFlow, invito a lector para que visite los enlaces y explore las respuestas dadas.

Las respuestas a cómo simular datos de un modelo lineal son muy variadas, algunas sencillas, otras un poco más complejas, y por esa razón en la siguiente sección se mostrará como simular datos de una forma didáctica.

Simulando datos de un modelo lineal

Para simular de forma exitosa datos de un modelo lineal, se recomienda tener el modelo escrito en forma simbólica ya que eso facilita identificar la variable respuesta, su distribución y los parámetros que van a depender de las variables independientes.

A continuación se muestra un ejemplo de como simular observaciones de un modelo lineal.

Ejemplo

Crear una función que simule n observaciones del siguiente modelo que tiene el vector de parámetros \(\boldsymbol{\Theta}=(\beta_0=4, \beta_1=-6, \sigma=4)^\top\).

\[\begin{align*} y_i &\sim N(\mu_i, \sigma^2) \\ \mu_i &= 4 - 6 x_i \\ x_i &\sim U(-5, 6) \\ \sigma^2 &= 16 \end{align*}\]

Solución

Todo modelo en lenguaje simbólico se lee de arriba hacia abajo \(\Downarrow\) pero al escribirlo en R se hace de abajo hacia arriba \(\Uparrow\).

A continuación se muestra la función solicitada la cual sólo tiene un argumento y que entrega como resultado un marco de datos con la información. Estimado lector, mire con detalle el modelo simbólico e identifique todos esos elementos en el código de abajo.

gen_dat <- function(n) {
  varianza <- 16
  x <- runif(n=n, min=-5, max=6)
  media <- 4 - 6 * x
  y <- rnorm(n=n, mean=media, sd=sqrt(varianza))
  marco_datos <- data.frame(y=y, x=x)
  return(marco_datos)
}

Vamos a poner a prueba la función para simular 5 observaciones de la siguiente manera.

datos <- gen_dat(n=5)
datos
##            y          x
## 1  -1.950118  1.4745156
## 2 -30.885322  4.8185096
## 3  27.385065 -3.6382560
## 4   2.167666  0.6463992
## 5 -12.361785  2.3000424

Vamos ahora a simular 200 observaciones, a dibujar un diagrama de dispersión y a estimar el vector de parámetros \(\boldsymbol{\Theta}=(\beta_0=4, \beta_1=-6, \sigma=4)^\top\).

datos <- gen_dat(n=200)

library(ggplot2)
ggplot(datos, aes(x=x, y=y)) +
  geom_point() + theme_light()

De la figura anterior se observa que la nube tiene pendiente negativa y eso se debe a \(\beta_1=-6\); la nube tiene la misma dispersión y eso de debe a que \(\sigma\) es constante e igual a 4.

Para estimar \(\boldsymbol{\Theta}=(\beta_0=4, \beta_1=-6, \sigma=4)^\top\) podemos usar el siguiente código.

mod <- lm(y ~ x, data=datos)
theta_hat <- c(coef(mod), sigma=summary(mod)$sigma)
theta_hat
## (Intercept)           x       sigma 
##    3.966018   -6.080078    3.941736

De la salida anterior vemos que el vector estimado \(\hat{\boldsymbol{\Theta}}\) está muy cerca del vector de parámetros \(\boldsymbol{\Theta}\)

El código usado en este ejemplo para simular datos de un modelo lineal es un código sencillo y didáctico. Este código busca que el lector aprenda a escribir de una forma sencilla las relaciones entre la variable respuesta, las variables independientes y la influencia de los parámetros.

Este código NO es un código óptimo desde el punto de vista computacional. Muy seguramente usa muchos recursos de memoria y puede demorar un poco para simular datos. Sin embargo, es un código FÁCIL de entender.

Función simulate

La función simulate del paquete básico stats permite simular respuestas a partir de un modelo de clase lm o glm. La estructura de la función es la siguiente:

simulate(object, nsim = 1, seed = NULL, ...)

Ejemplo

Use las 5 primeras observaciones base de datos cars y con esos ajuste un modelo lineal para explicar la distancia promedio para detener el vehículo en función de la velocidad a la cual estaba el vehículo cuando se presionaron los frenos. Luego use ese modelo para simular distancias de frenado.

Solución

datos <- cars[1:5, ]
mod <- lm(dist ~ speed, data=datos)
simulate(object=mod, nsim=1, seed=1234)
##       sim_1
## 1 -3.769550
## 2  8.175135
## 3 21.954305
## 4 -5.645603
## 5 19.110007

Otras herramientas para simular

Abajo una lista de herramientas para simular datos a partir de un modelo.

Videos sugeridos

A continuación se muestran algunos videos que muestran cómo simular datos de un modelo lineal usando R.