R中的方程式工具变量回归(控制函数)

Posted

技术标签:

【中文标题】R中的方程式工具变量回归(控制函数)【英文标题】:Equation-by-equation instrumental variable regression (control function) in R 【发布时间】:2022-01-11 21:04:28 【问题描述】:

我想用 R 中的控制函数(使用 @987654323 @ 和 broom)。我想基于具有因变量y、内生变量x、此内生变量z1 的工具和外生变量z2 的分组数据框来实现这一点。遵循两阶段最小二乘法 (2SLS) 方法,我将运行:(1) 在 z1z2 上回归 x 和 (2) 在 x 上回归 yz2v(来自 (1) 的残差)。有关此方法的更多详细信息,请参阅: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&lt; 。如果您要处理更大的数据集,则第二种方法甚至会遇到存储问题。

这是如何正确完成的?

【问题讨论】:

我以更一般的方式重新表述了上述问题(重点是在最终回归中包含来自先前回归的元素)。你可以在这里找到它:***.com/questions/70287136/…. 【参考方案1】:

broom 包已加载,但tidy 未应用于lm 输出。此外,OP 的代码有一些拼写错误,即在mutateing 创建fit2 之后,对象'df_fit' 没有更新(&lt;-),因此df_fit %&gt;% 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   

【讨论】:

谢谢。这解决了问题。 我有一个后续问题:你不应该将 .y["resids"] 包含到 fit2 = map2(data, resids, ~ tidy(lm(y ~ x + z2 + .y ["resids"], data = .x)) 以便在回归公式中考虑残差向量? @timm 您可能必须使用paste 或使用reformulate 构造公式。你能问一个新问题吗

以上是关于R中的方程式工具变量回归(控制函数)的主要内容,如果未能解决你的问题,请参考以下文章

急!MATLAB中用cftool工具数据拟合之后,拟合结果好坏判断

R语言 逻辑回归

spss 怎么用最小二乘估计求回归方程

回归函数(回归方程)到底是啥函数?条件期望函数还是直接以x为自变量y为因变量的函数?

最小二乘法求线性回归方程

什么是线性回归模型