es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Regresión instrumental de ecuación por ecuación (función de control) en R.

Quiero realizar una regresión instrumental (IV) ecuación por ecuación con una función de control en R (usando tidyverse y broom). Quiero implementar esto en base a un marco de datos agrupado con una variable dependiente, y, una variable endógena, x, un instrumento para esta variable endógena, z1, y una variable exógena, z2. Siguiendo un enfoque de Mínimos Cuadrados en Dos Etapas (2SLS), realizaría lo siguiente: (1) Regresar x en z1 y z2, y (2) Regresar y en x, z2 y v (los residuos de (1)). Para más detalles sobre este enfoque, consulte: https://www.irp.wisc.edu/newsevents/workshops/appliedmicroeconometrics/participants/slides/Slides_14.pdf. Desafortunadamente, no puedo realizar la segunda regresión sin un error (ver abajo).

Mis datos se ven así:

df <- data.frame(
  id = sort(rep(seq(1, 20, 1), 5)),
  group = rep(seq(1, 4, 1), 25),
  y = runif(100),
  x = runif(100),
  z1 = runif(100),
  z2 = runif(100)
)

donde id es un identificador para las observaciones, group es un identificador para los grupos y el resto está definido arriba.

library(tidyverse)
library(broom)
Nest the data frame
df_nested <- df %>% 
  group_by(group) %>% 
  nest()
Run first stage regression and retrieve residuals
df_fit <- df_nested %>% 
  mutate(
    fit1 = map(data, ~ lm(x ~ z1 + z2, data = .x)),
    resids = map(fit1, residuals) 
  )

Ahora, quiero realizar la regresión de segunda etapa. He probado dos cosas.

Primero:

df_fit %>%
  group_by(group) %>%
  unnest(c(data, resids)) %>%
  do(lm(y ~ x + z2, data = .x))

Esto produce el error “Error in is.data.frame(data) : object ‘.x’ not found”.

Segundo:

df_fit %>% 
  mutate(
    fit2 = map2(data, resids, ~ lm(y ~ x + z2, data = .x))
  )
df_fit %>% unnest(fit2)

Esto produce el error “Error: Must subset columns with a valid subscript vector.
Subscript has the wrong type ‘grouped_df'”.

¿Cómo se hace esto correctamente?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para ejecutar una regresión instrumental de ecuación por ecuación con una función de control utilizando tidyverse y broom en R, podemos seguir el enfoque de Mínimos Cuadrados en Dos Etapas (2SLS). Los pasos involucrados son:

    1. Regresamos x en z1 y z2 y obtenemos los residuos.
    2. Regresamos y en x, z2 y los residuos del paso 1.

    Aquí hay una implementación basada en el marco de datos de grupo proporcionado:

    “`{r}
    library(tidyverse)
    library(broom)

    Agrupamos el marco de datos

    df_anidado <- df %>%
    group_by(group) %>%
    nest()

    Ejecutamos la regresión de la primera etapa y obtenemos los residuos

    df_fit <- df_anidado %>%
    mutate(
    fit1 = map(data, ~ lm(x ~ z1 + z2, data = .x)),
    residuos = map(fit1, residuals)
    )

    Ejecutamos la regresión de la segunda etapa

    df_fit <- df_fit %>%
    mutate(
    fit2 = map2(data, residuos, ~ lm(y ~ x + z2 + .x, data = .y))
    )

    Obtenemos los coeficientes y las estadísticas

    resultados_limpios <- df_fit %>%
    unnest(fit2) %>%
    tidy()

    resultados_vistazo <- df_fit %>%
    unnest(fit2) %>%
    glance()

    resultados_coef <- df_fit %>%
    unnest(fit2) %>%
    coef()
    “`

    En el primer paso, anidamos el marco de datos por la variable de grupo para realizar la regresión y el cálculo para cada grupo por separado. Utilizamos map() para aplicar la función lm() a cada grupo, obteniendo los residuos con residuals().

    En el segundo paso, utilizamos map2() para aplicar la función lm() a cada grupo, utilizando los residuos obtenidos del paso anterior como una variable adicional. El . en .x se utiliza para indicar que estamos pasando las variables como argumentos separados en lugar de como una lista.

    Finalmente, utilizamos unnest() para extraer los coeficientes, las estadísticas y los residuos. Utilizamos tidy() para obtener los coeficientes y sus estadísticas, glance() para obtener las estadísticas del modelo y coef() para obtener los coeficientes como una matriz.

    Ten en cuenta que utilizamos .y en lugar de .x en el segundo paso con map2() para referirnos al segundo argumento, que son los residuos. También incluimos .x como una variable adicional en la fórmula de regresión utilizando + .x.

Comments are closed.