【发布时间】: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 值等),而不是堆叠行数(即 - 固定数量的列,每个模型按行增加)。 -
我对@987654328@ 循环说了什么?您的代码看起来很长,因为您正在复制/粘贴模型定义。你的代码会更短。你仍然会使用
dplyr,你只需要你的第一个do()来做plm(),调用结果plm_list。然后vcov_list = lapply(plm_list, vcovHC, method = "arrelano")。这已经为您节省了一个额外的模型拟合(因为您的第一个do()两次拟合同一个模型),阅读起来更清晰并且使用的行数更少。