R 有没有一种方法可以将因变量列表创建为一个自变量的多元回归输出?
我有一个大约500只股票及其回报率的数据集。我想知道是否有一种方法可以产生多元回归输出,一对一的关系,一个因变量到一个独立变量 例如,这里是一个简单的回归输出,其中一只股票MSFT与市场进行比较。有没有办法将500个变量中的每一个都放入公式的Y分量中,并为每个变量生成一个新的输出,而不是像下面那样创建多行?甚至可以把所有这些数据放在一个表中 以下是我试图分组以简化流程的变量:R 有没有一种方法可以将因变量列表创建为一个自变量的多元回归输出?,r,regression,lm,R,Regression,Lm,我有一个大约500只股票及其回报率的数据集。我想知道是否有一种方法可以产生多元回归输出,一对一的关系,一个因变量到一个独立变量 例如,这里是一个简单的回归输出,其中一只股票MSFT与市场进行比较。有没有办法将500个变量中的每一个都放入公式的Y分量中,并为每个变量生成一个新的输出,而不是像下面那样创建多行?甚至可以把所有这些数据放在一个表中 以下是我试图分组以简化流程的变量: regression\u model解决这一问题的一种方法(在某些地方肯定是重复的答案?)是: 将数据重塑为长格式
regression\u model解决这一问题的一种方法(在某些地方肯定是重复的答案?)是:
- 将数据重塑为长格式
- 嵌套数据以创建包含独立值和从属值的TIBLES列
- 运行每个回归并将结果存储在新列中
- 整理回归输出并取消对数据的测试
您的示例数据不可用,因此让我们使用mtcars
。假设我们希望使用disp
、hp
、drat
、wt
和qsec
中的每一种来预测mpg
。首先,我们选择、收集和嵌套:
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]>
# 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
最后,选择我们想要的列并unest
:
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: 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]>
# 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
这一定是一个复制品。。。但现在太懒/太匆忙而无法查找。请提供用户可以复制/粘贴的数据,而不是作为图像。以下是一个示例。这方面有很多变化(许多独立的、独立的、所有单一indep&dep的组合,etcI认为我在下一步迷失了方向。5x2中的数据是否与其他变量(disp、hp等)相关?我现在的想法是,mpg的数据只是“嵌套的”离开,因此它没有显示,你只是给它一个名称?你能解释一下变异步骤吗?我知道你在这里定义模型,但映射函数让我丢失了。谢谢你的帮助,一旦我完全理解它,这将节省我很多时间。第一个嵌套创建了一个32行x 2列的tible,其中列是mpg
和Val
是该行相应变量的值(disp
,hp
等)因此,实际上,我们是按每个感兴趣的自变量对数据进行子集划分。2 x 5 TIBLE是tidy
函数的输出-它是回归输出的摘要。我建议在单个lm
对象上运行tidy
,看看它是如何工作的。map
:基本上第一个映射了每一行n将data
列映射到lm
函数。第二行将model
列中的每一行映射到tidy
函数。这里有很多方法需要消化,这就是我将其分解为多个步骤的原因。慢慢来,您可能会从有关此主题的良好教程或指南中受益。也在还有。我非常感谢你,这真的很棒。我只需要想象一下它在做什么,我认为这样可以更好地理解它。所以tibble(5x2)如果我们分解它,有32个var条目,对吗?但我们正在对它进行子集划分?有32个条目,然后有32个mpg数据观测值,然后是与disp相对应的32个值?然后它会转到hp,其中有32个条目,然后是32个mpg条目,然后是与value相对应的值。基本上,您是在重新计算使用变量标记汽车名称并保持mpg?是的,您正确理解了32 x 2 TIBLES。当运行unnest
时,term
,estimate
,std.error
,statistic
和p.value
列包含您看到的内容,and行(截距)
和Val
-其中Val
是感兴趣变量lm
的系数。将数据
视为包含每个独立/独立组合的数据,模型
包含每个lm,将整理
视为包含每个lm摘要。
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