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 “multi-step” con broom y dplyr en R.

Estoy buscando una forma de realizar una regresión “multietapa” con broom y dplyr en R. Uso “multietapa” como marcador para análisis de regresión en los que se integran en el modelo de regresión final elementos de modelos de regresión anteriores, como el ajuste o los residuos. Un ejemplo de tal regresión “multietapa” sería el enfoque 2SLS para la regresión de variables instrumentales (IV).

Mis datos (agrupados) 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 y group son identificadores, y es la variable dependiente, mientras que x, z1 y z2 son predictores. En un contexto de IV, x sería un predictor endógeno.

Aquí hay un ejemplo de una regresión “multietapa”:

library(tidyverse)
library(broom)

# Anidar el marco de datos
df_nested <- df %>% 
  group_by(group) %>% 
  nest()

# Ejecutar la regresión de la primera etapa y obtener los residuos
df_fit <- df_nested %>% 
  mutate(
    fit1 = map(data, ~ lm(x ~ z1 + z2, data = .x)),
    resids = map(fit1, residuals) 
  )

# Ejecutar la segunda etapa con los residuos como variable de control
df_fit %>% 
  mutate(
    fit2 = map2(data, resids, ~ tidy(lm(y ~ x + z2 + .y["resids"], data = .x)))
  ) %>% 
  unnest(fit2)

Esto produce un error que indica que .x y .y tienen longitudes diferentes. ¿Cuál es la solución para integrar los residuos, en este caso .y["resids"], en la segunda regresión como variable de control?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para integrar los residuos en la segunda regresión, primero necesitas extraerlos del data frame anidado usando la función unnest(). Luego, puedes fusionar los residuos con el data frame original utilizando la función left_join(). Finalmente, puedes ejecutar la regresión de la segunda etapa utilizando el data frame fusionado de la siguiente manera:

    library(tidyverse)
    library(broom)
    
    # Anidar el data frame
    df_nested <- df %>% 
      group_by(group) %>% 
      nest()
    
    # Ejecutar la regresión de la primera etapa y obtener los residuos
    df_fit <- df_nested %>% 
      mutate(
        fit1 = map(data, ~ lm(x ~ z1 + z2, data = .x)),
        resids = map(fit1, residuals) 
      )
    
    # Desanidar los residuos
    df_resids <- df_fit %>% 
      select(group, resids) %>% 
      unnest(resids)
    
    # Fusionar los residuos con el data frame original
    df_merged <- left_join(df, df_resids)
    
    # Ejecutar la segunda etapa con los residuos como variable de control
    df_fit2 <- df_merged %>% 
      group_by(group) %>% 
      do(tidy(lm(y ~ x + z2 + resids, data = .)))
    
    # Ver los resultados
    df_fit2
    

    Este código primero extraerá los residuos del data frame df_fit y creará un nuevo data frame df_resids que solo contiene las columnas de grupo y residuos. Luego, fusionará esto con el data frame original usando la función left_join(). Finalmente, ejecutará la regresión de la segunda etapa utilizando el data frame fusionado e incluirá los residuos como variable de control. El data frame resultante df_fit2 contiene los coeficientes de regresión y los errores estándar para cada grupo.

Comments are closed.