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?
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ónleft_join()
. Finalmente, puedes ejecutar la regresión de la segunda etapa utilizando el data frame fusionado de la siguiente manera:Este código primero extraerá los residuos del data frame
df_fit
y creará un nuevo data framedf_resids
que solo contiene las columnas de grupo y residuos. Luego, fusionará esto con el data frame original usando la funciónleft_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 resultantedf_fit2
contiene los coeficientes de regresión y los errores estándar para cada grupo.