【问题标题】:Is there a way to catch both Coefficient and R-squared using Broom?有没有办法使用扫帚同时捕捉系数和 R 平方?
【发布时间】:2017-07-27 14:42:05
【问题描述】:

我正在循环通过几个回归,旨在获得具有不同模型的最终结果,它们各自的系数和统计数据,以及一些一般结果,如调整后的 r 平方、AIC 等。这个循环是在考虑到一些子组的情况下完成的数据库。

当我使用 plm 来估计结果时,broom 包会产生一些不错的结果,以便将所有内容打包到一个整洁的数据库中。但是,他们的选择有点限制。或者您是否获得系数及其统计数据(使用 tidy - 提供 p 值、t 统计等),或者您获得整体模型统计数据(使用 Glance - 提供 R 平方、调整后的 R 平方、AIC 等)。

-有没有办法在不重新计算回归的情况下同时拥有两个数据?

我知道我可以合并最终结果,但这需要对每个回归进行双重计算,而且计算成本很高。我知道最终结果会重复每行系数的汇总统计信息,但我不介意。

-还看到我的代码会重复每个回归的估计以提供可靠的估计,有人知道解决方法吗?

MWE 如下:

library(dplyr)
library(broom)
library(plm)
library(lmtest)
library(magrittr)


data("Grunfeld")

#To generate coefficients by model
reg<- mutate(Grunfeld,
             group = ifelse(firm<6,1,2)) %>%
      group_by(., group) %>%
  do(
     tidy(
          coeftest(plm(as.formula(inv ~ value + capital)
                       ,data= .
                       ,model = "pooling"
                       )
                   ,vcov.= vcovHC(plm(as.formula(inv ~ value + capital)
                                      ,data= .
                                      ,model = "pooling"
                                      )
                                  ,method= "arellano"
                                  )
                  )
       )
  )

#To generate r-squared by model
reg<- mutate(Grunfeld,
             group = ifelse(firm<6,1,2)) %>%
  group_by(., group) %>%
  do(
    glance(
      plm(as.formula(inv ~ value + capital)
          ,data= .
          ,model = "pooling"
      )
    )
  )

【问题讨论】:

  • 不使用glance()tidy()“重新计算回归”。您的问题是您的代码非常努力地不保存中间对象。这会导致您复制/粘贴大量代码(很难在没有错误的情况下进行修改)并重新运行相同的回归(效率极低)。只需创建一个模型列表,然后您就可以lapply(model_list, glance)lapply(model_list, tidy) 做任何其他事情。
  • 至于你的另一个问题(最好一次做一个问题,不要合并问题),有一个whole CRAN task view on robust estimation
  • 我理解您关于不保存中间输出的观点。问题是我期望的输出是指大约 200 种不同的回归。使用列表和“for”循环来计算一切——plms、vcovs,然后应用glance等会非常难看,并且会使代码大小增加三倍。此外,我还必须跟踪每个模型的标识,这不会被回归保存。
  • @Gregor lapply(model_list, tidy) 的输出也不可行,因为它为每个模型堆叠列(例如,每个模型有 6 列,重复系数,p 值等),而不是堆叠行数(即 - 固定数量的列,每个模型按行增加)。
  • 我对@9​​87654328@ 循环说了什么?您的代码看起来很长,因为您正在复制/粘贴模型定义。你的代码会更短。你仍然会使用dplyr,你只需要你的第一个do() 来做plm(),调用结果plm_list。然后vcov_list = lapply(plm_list, vcovHC, method = "arrelano")。这已经为您节省了一个额外的模型拟合(因为您的第一个 do() 两次拟合同一个模型),阅读起来更清晰并且使用的行数更少。

标签: r plm broom


【解决方案1】:

使用来自@Gregor 的输入,我可以为我的问题创建一个令人满意的答案。

这是 MWE:

library(dplyr)
library(broom)
library(plm)
library(lmtest)
library(magrittr)


data("Grunfeld")

plm_reg<- mutate(Grunfeld,
             group = ifelse(firm<6,1,2)) %>%
  group_by(., group) %>%
  do(reg=
      plm(as.formula(inv ~ value + capital)
          ,data= .
          ,model = "pooling"
      )
    )

robust_est <- function(x){
  return(tidy(coeftest(x, vcov.= vcovHC(x, method= "arellano"))))
}

robust_coef <- bind_rows(lapply(plm_reg[[2]], robust_est), .id = "group")
r_squared <-   bind_rows(lapply(plm_reg[[2]], glance), .id = "group")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 2013-05-21
    相关资源
    最近更新 更多