我有大约500只股票及其收益的数据集。我想知道是否有一种方法可以生成一个因变量到一个独立变量的一对一关系的多个回归输出?
例如,这是其中一只MSFT股票与市场相比的简单回归输出。有没有办法像我下面那样创建多行,有没有办法将500个变量中的每一个放入公式的Y分量并为每个变量生成新的输出?甚至可能将所有这些数据都放在一个表中?
这些是我试图分组以简化我的过程的变量:
regression_model <- lm(raw_data$MSFT~raw_data$VFINX, raw_data)
summary(regression_model)
答案 0 :(得分:1)
一种解决方法(一定是某个地方的重复答案?)是
您的示例数据不可用,因此我们使用mtcars
。假设我们要使用mpg
,disp
,hp
,drat
和wt
中的每一个来预测qsec
。首先,我们选择,收集和嵌套:
library(dplyr)
library(tidyr)
library(purrr)
library(broom)
mtcars %>%
select(mpg, disp, hp, drat, wt, qsec) %>%
gather(Var, Val, -mpg) %>%
nest(data = c(mpg, Val))
结果:
# A tibble: 5 x 2
Var data
<chr> <list>
1 disp <tibble [32 x 2]>
2 hp <tibble [32 x 2]>
3 drat <tibble [32 x 2]>
4 wt <tibble [32 x 2]>
5 qsec <tibble [32 x 2]>
现在,我们可以map
将每一行进行回归,并创建经过整理的输出列:
mtcars %>%
select(mpg, disp, hp, drat, wt, qsec) %>%
gather(Var, Val, -mpg) %>%
nest(data = c(mpg, Val)) %>%
mutate(model = map(data, ~lm(mpg ~ Val, data = .)),
tidied = map(model, tidy))
# A tibble: 5 x 4
Var data model tidied
<chr> <list> <list> <list>
1 disp <tibble [32 x 2]> <lm> <tibble [2 x 5]>
2 hp <tibble [32 x 2]> <lm> <tibble [2 x 5]>
3 drat <tibble [32 x 2]> <lm> <tibble [2 x 5]>
4 wt <tibble [32 x 2]> <lm> <tibble [2 x 5]>
5 qsec <tibble [32 x 2]> <lm> <tibble [2 x 5]>
最后,选择我们想要的列和unnest
:
mtcars %>%
select(mpg, disp, hp, drat, wt, qsec) %>%
gather(Var, Val, -mpg) %>%
nest(data = c(mpg, Val)) %>%
mutate(model = map(data, ~lm(mpg ~ Val, data = .)),
tidied = map(model, tidy)) %>%
select(-model, -data) %>%
unnest(cols = c(tidied))
结果:
# A tibble: 10 x 6
Var term estimate std.error statistic p.value
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 disp (Intercept) 29.6 1.23 24.1 3.58e-21
2 disp Val -0.0412 0.00471 -8.75 9.38e-10
3 hp (Intercept) 30.1 1.63 18.4 6.64e-18
4 hp Val -0.0682 0.0101 -6.74 1.79e- 7
5 drat (Intercept) -7.52 5.48 -1.37 1.80e- 1
6 drat Val 7.68 1.51 5.10 1.78e- 5
7 wt (Intercept) 37.3 1.88 19.9 8.24e-19
8 wt Val -5.34 0.559 -9.56 1.29e-10
9 qsec (Intercept) -5.11 10.0 -0.510 6.14e- 1
10 qsec Val 1.41 0.559 2.53 1.71e- 2
您可以从dplyr::filter()
添加过滤器,例如删除“拦截”行或选择p值阈值。
mtcars %>%
select(mpg, disp, hp, drat, wt, qsec) %>%
gather(Var, Val, -mpg) %>%
nest(data = c(mpg, Val)) %>%
mutate(model = map(data, ~lm(mpg ~ Val, data = .)),
tidied = map(model, tidy)) %>%
select(-model, -data) %>%
unnest(cols = c(tidied)) %>%
filter(p.value < 0.01,
term != "(Intercept)")
# A tibble: 5 x 6
Var term estimate std.error statistic p.value
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 disp Val -0.0412 0.00471 -8.75 9.38e-10
2 hp Val -0.0682 0.0101 -6.74 1.79e- 7
3 drat Val 7.68 1.51 5.10 1.78e- 5
4 wt Val -5.34 0.559 -9.56 1.29e-10