R中的逐方程工具变量回归(控制函数)
Equation-by-equation instrumental variable regression (control function) in R
我想用控制函数做一个逐方程工具变量(IV)回归 R(使用 tidyverse
和 broom
)。我想基于具有因变量 y
、内生变量 x
、该内生变量的工具 z1
和外生变量的分组数据框来实现这一点, z2
。按照 两阶段最小二乘法 (2SLS) 方法,我会 运行:(1) 在 z1
和 z2
上回归 x
(2) 对 x
、z2
和 v
(来自 (1) 的残差)进行回归 y
。有关此方法的更多详细信息,请参阅:https://www.irp.wisc.edu/newsevents/workshops/appliedmicroeconometrics/participants/slides/Slides_14.pdf。不幸的是,我无法 运行 第二次回归而没有错误(见下文)。
我的数据是这样的:
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)
)
其中 id
是观察的标识符,group
是组的标识符,其余的在上面定义。
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)
)
现在,我要运行第二阶段回归。我试过两件事。
第一个:
df_fit %>%
group_by(group) %>%
unnest(c(data, resids)) %>%
do(lm(y ~ x + z2, data = .x))
这会产生 Error in is.data.frame(data) : object '.x' not found
。
第二个:
df_fit %>%
mutate(
fit2 = map2(data, resids, ~ lm(y ~ x + z2, data = .x))
)
df_fit %>% unnest(fit2)
这会产生:Error: Must subset columns with a valid subscript vector. x Subscript has the wrong type `grouped_df<
。如果您要处理更大的数据集,第二种方法甚至会 运行 出现存储问题。
这是如何正确完成的?
broom
包已加载,但没有 tidy
应用于 lm
输出。此外,OP 的代码有一些拼写错误,即在 mutate
创建 fit2
之后,对象 'df_fit' 没有更新(<-
),因此 df_fit %>% unnest(fit2)
无法工作,因为找不到该列
library(dplyr)
library(purrr)
library(broom)
library(tidyr)
df_fit %>%
ungroup %>%
mutate(
fit2 = map2(data, resids, ~ tidy(lm(y ~ x + z2, data = .x))
)) %>%
unnest(fit2)
-输出
# A tibble: 12 × 9
group data fit1 resids term estimate std.error statistic p.value
<dbl> <list> <list> <list> <chr> <dbl> <dbl> <dbl> <dbl>
1 1 <tibble [25 × 5]> <lm> <dbl [25]> (Intercept) 0.357 0.126 2.82 0.00987
2 1 <tibble [25 × 5]> <lm> <dbl [25]> x -0.0290 0.173 -0.168 0.868
3 1 <tibble [25 × 5]> <lm> <dbl [25]> z2 0.204 0.183 1.11 0.278
4 2 <tibble [25 × 5]> <lm> <dbl [25]> (Intercept) 0.470 0.139 3.38 0.00272
5 2 <tibble [25 × 5]> <lm> <dbl [25]> x 0.168 0.206 0.816 0.423
6 2 <tibble [25 × 5]> <lm> <dbl [25]> z2 0.00615 0.176 0.0350 0.972
7 3 <tibble [25 × 5]> <lm> <dbl [25]> (Intercept) 0.625 0.147 4.25 0.000325
8 3 <tibble [25 × 5]> <lm> <dbl [25]> x 0.209 0.255 0.818 0.422
9 3 <tibble [25 × 5]> <lm> <dbl [25]> z2 -0.398 0.183 -2.18 0.0406
10 4 <tibble [25 × 5]> <lm> <dbl [25]> (Intercept) 0.511 0.235 2.17 0.0407
11 4 <tibble [25 × 5]> <lm> <dbl [25]> x 0.0468 0.247 0.189 0.851
12 4 <tibble [25 × 5]> <lm> <dbl [25]> z2 -0.0246 0.271 -0.0908 0.929
我想用控制函数做一个逐方程工具变量(IV)回归 R(使用 tidyverse
和 broom
)。我想基于具有因变量 y
、内生变量 x
、该内生变量的工具 z1
和外生变量的分组数据框来实现这一点, z2
。按照 两阶段最小二乘法 (2SLS) 方法,我会 运行:(1) 在 z1
和 z2
上回归 x
(2) 对 x
、z2
和 v
(来自 (1) 的残差)进行回归 y
。有关此方法的更多详细信息,请参阅:https://www.irp.wisc.edu/newsevents/workshops/appliedmicroeconometrics/participants/slides/Slides_14.pdf。不幸的是,我无法 运行 第二次回归而没有错误(见下文)。
我的数据是这样的:
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)
)
其中 id
是观察的标识符,group
是组的标识符,其余的在上面定义。
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)
)
现在,我要运行第二阶段回归。我试过两件事。
第一个:
df_fit %>%
group_by(group) %>%
unnest(c(data, resids)) %>%
do(lm(y ~ x + z2, data = .x))
这会产生 Error in is.data.frame(data) : object '.x' not found
。
第二个:
df_fit %>%
mutate(
fit2 = map2(data, resids, ~ lm(y ~ x + z2, data = .x))
)
df_fit %>% unnest(fit2)
这会产生:Error: Must subset columns with a valid subscript vector. x Subscript has the wrong type `grouped_df<
。如果您要处理更大的数据集,第二种方法甚至会 运行 出现存储问题。
这是如何正确完成的?
broom
包已加载,但没有 tidy
应用于 lm
输出。此外,OP 的代码有一些拼写错误,即在 mutate
创建 fit2
之后,对象 'df_fit' 没有更新(<-
),因此 df_fit %>% unnest(fit2)
无法工作,因为找不到该列
library(dplyr)
library(purrr)
library(broom)
library(tidyr)
df_fit %>%
ungroup %>%
mutate(
fit2 = map2(data, resids, ~ tidy(lm(y ~ x + z2, data = .x))
)) %>%
unnest(fit2)
-输出
# A tibble: 12 × 9
group data fit1 resids term estimate std.error statistic p.value
<dbl> <list> <list> <list> <chr> <dbl> <dbl> <dbl> <dbl>
1 1 <tibble [25 × 5]> <lm> <dbl [25]> (Intercept) 0.357 0.126 2.82 0.00987
2 1 <tibble [25 × 5]> <lm> <dbl [25]> x -0.0290 0.173 -0.168 0.868
3 1 <tibble [25 × 5]> <lm> <dbl [25]> z2 0.204 0.183 1.11 0.278
4 2 <tibble [25 × 5]> <lm> <dbl [25]> (Intercept) 0.470 0.139 3.38 0.00272
5 2 <tibble [25 × 5]> <lm> <dbl [25]> x 0.168 0.206 0.816 0.423
6 2 <tibble [25 × 5]> <lm> <dbl [25]> z2 0.00615 0.176 0.0350 0.972
7 3 <tibble [25 × 5]> <lm> <dbl [25]> (Intercept) 0.625 0.147 4.25 0.000325
8 3 <tibble [25 × 5]> <lm> <dbl [25]> x 0.209 0.255 0.818 0.422
9 3 <tibble [25 × 5]> <lm> <dbl [25]> z2 -0.398 0.183 -2.18 0.0406
10 4 <tibble [25 × 5]> <lm> <dbl [25]> (Intercept) 0.511 0.235 2.17 0.0407
11 4 <tibble [25 × 5]> <lm> <dbl [25]> x 0.0468 0.247 0.189 0.851
12 4 <tibble [25 × 5]> <lm> <dbl [25]> z2 -0.0246 0.271 -0.0908 0.929