我有一个带有年度回报的data.table和25个不同股票投资组合的2个解释变量。我想为25个投资组合中的每一个估计相同的lm
模型,其中标准误差是NeweyWest校正的。到目前为止,我正在使用group_by
中的dplyr
在每个投资组合上运行该模型,然后使用coeftest
包中的lmtest
和NeweyWest
更正标准错误来自sandwich
包,使用tidy
包中的broom
进行汇总:
library(dplyr)
library(broom)
library(lmtest)
library(sandwich)
regressions <- data %>%
group_by(Portfolio) %>%
do({fit = lm(Portfolio_return ~ x1 + x2, data = .)
tidy(coeftest(fit, vcov. = NeweyWest(fit, prewhite = FALSE)))
})
我的问题:
1.代码给出了系数加上p-avlues,但是如何在NeweyWest调整之后获得所有其他模型的所有其他摘要统计数据,如r2,F-test等?我喜欢来自tidy
软件包的glance
,augment
和broom
但是当我运行regressions %>% glance(fit)
时,我得到致命错误和R崩溃。
2.如何在一个data.table
或data.frame
中汇总所有25个模型的所有统计数据(如系数,p值,R2)?
非常感谢!
答案 0 :(得分:0)
我认为使用dplyr
,tidyr
和purrr
现在可以满足您的需求,下面我使用了一个示例数据集:
library(dplyr)
library(broom)
library(lmtest)
library(sandwich)
library(tidyr)
library(purrr)
data(Investment)
set.seed(999)
data = rbind(
data.frame(Investment + matrix(rnorm(140),20,7),set="A"),
data.frame(Investment + matrix(rnorm(140),20,7),set="B")
)
我们在dplyr中执行了类似于do()
的操作,只是将数据嵌套在data
列中,拟合并存储结果,然后应用glance
和tidy
:
regressions <-data %>%
nest(data=c("GNP","Investment","Price","Interest","RealGNP","RealInv","RealInt")) %>%
mutate(fit=map(data,~lm(RealInv ~ RealGNP + RealInt, data = .))) %>%
mutate(
glance = map(fit,glance),
tidy = map(fit,~tidy(coeftest(., vcov. = NeweyWest(., prewhite = FALSE))))
)
您可以提取tidy
和glance
的结果
regressions %>% unnest(tidy)
# A tibble: 6 x 9
set data fit glance term estimate std.error statistic p.value
<fct> <list> <list> <list> <chr> <dbl> <dbl> <dbl> <dbl>
1 A <tibble … <lm> <tibble [… (Inte… -15.8 18.1 -0.871 3.97e-1
2 A <tibble … <lm> <tibble [… RealG… 0.172 0.0174 9.88 3.24e-8
3 A <tibble … <lm> <tibble [… RealI… -2.55 3.25 -0.785 4.44e-1
4 B <tibble … <lm> <tibble [… (Inte… -5.03 19.7 -0.256 8.01e-1
5 B <tibble … <lm> <tibble [… RealG… 0.161 0.0185 8.71 1.80e-7
6 B <tibble … <lm> <tibble [… RealI… 0.662 2.40 0.275 7.86e-1
regressions %>% unnest(glance)
# A tibble: 2 x 15
set data fit tidy r.squared adj.r.squared sigma statistic p.value df
<fct> <lis> <lis> <lis> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
1 A <tib… <lm> <tib… 0.830 0.809 16.5 39.0 7.02e-7 3
2 B <tib… <lm> <tib… 0.801 0.776 17.6 32.2 2.47e-6 3
# … with 5 more variables: logLik <dbl>, AIC <dbl>, BIC <dbl>, deviance <dbl>,
# df.residual <int>