如何 select 在回归中使用哪些列?
how to select which columns to use in a regression?
考虑这个简单的例子
library(tidyverse)
df <- data_frame(dep_var = c(1,2,3,4,5),
ind_1 = c(23,23,54,54,65),
ind_2 = c(1,4,5,3,2),
dont_touch_this = c(1,2,3,4,4))
> df
# A tibble: 5 x 4
dep_var ind_1 ind_2 dont_touch_this
<dbl> <dbl> <dbl> <dbl>
1 1 23 1 1
2 2 23 4 2
3 3 54 5 3
4 4 54 3 4
5 5 65 2 4
我想写一个 function
来运行 lm
线性回归,我可以在其中指定我想使用的 dependent
变量以及 independent variables
.
诀窍是我想指定类似 "use as indipendent variables all the variables that start with some_string_pattern
"
的内容
类似
myfunc <- function(df, dep_var, 'myregex' ){
cols <- #select columns that start with myregex
y <- lm(dep_var ~ cols)
}
我不知道如何进行这里。有任何想法吗?
谢谢!
你可以试试
myfunc <- function(df, dep_var, cols){
cols <- grep(cols, colnames(df), value = T)
Formula <- as.formula(paste(dep_var,"~",paste(cols, collapse = "+")))
broom::tidy(lm(Formula, data = df))
}
myfunc(df, "dep_var", "ind")
# A tibble: 3 x 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) -0.181 1.15 -0.157 0.890
2 ind_1 0.0762 0.0208 3.66 0.0673
3 ind_2 -0.0524 0.257 -0.204 0.857
使用 grep
搜索名称。也许包括 cols <- grep(dep_var, cols, value = T, invert = T)
以避免因变量也被发现为独立变量。然后创建公式,将右侧的所有变量与 "+"
一起折叠。使用 broom
的 tidy
函数获得不错的输出。
在tidyverse
你可以试试这个类似的方法
foo <- function(df, dep_var, cols ){
df %>%
select(a = quo_name(dep_var), starts_with(cols)) %>%
lm(a ~ ., data = .) %>%
broom::tidy()
}
foo(df, "dep_var", "ind")
# A tibble: 3 x 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) -0.181 1.15 -0.157 0.890
2 ind_1 0.0762 0.0208 3.66 0.0673
3 ind_2 -0.0524 0.257 -0.204 0.857
对于 select
,matches
采用正则表达式,因此您可以直接从函数参数输入任何正则表达式:
library(dplyr)
library(rlang)
myfunc <- function(df, dep_var, regex){
dep_var_quo <- ensym(dep_var)
df %>%
select(!!dep_var_quo, matches(regex)) %>%
lm(expr(!!dep_var_quo ~ .), data = .)
}
myfunc(df, dep_var, "^ind")
ensym
将调用函数时提供的代码转换为符号。然后可以在 select
和 expr
中使用 !!
取消引用。这会启用非标准评估,您可以按原样键入 dep_var
而不是字符串 "dep_var"
。 enquo
是同样的想法,但是把它变成了一个quosure。 expr
在这里很有用,因为您可以取消引用 quosures 并将整个代码转换为表达式。
输出:
Call:
lm(formula = expr(!(!dep_var_quo) ~ .), data = .)
Coefficients:
(Intercept) ind_1 ind_2
-0.18063 0.07621 -0.05241
考虑这个简单的例子
library(tidyverse)
df <- data_frame(dep_var = c(1,2,3,4,5),
ind_1 = c(23,23,54,54,65),
ind_2 = c(1,4,5,3,2),
dont_touch_this = c(1,2,3,4,4))
> df
# A tibble: 5 x 4
dep_var ind_1 ind_2 dont_touch_this
<dbl> <dbl> <dbl> <dbl>
1 1 23 1 1
2 2 23 4 2
3 3 54 5 3
4 4 54 3 4
5 5 65 2 4
我想写一个 function
来运行 lm
线性回归,我可以在其中指定我想使用的 dependent
变量以及 independent variables
.
诀窍是我想指定类似 "use as indipendent variables all the variables that start with some_string_pattern
"
类似
myfunc <- function(df, dep_var, 'myregex' ){
cols <- #select columns that start with myregex
y <- lm(dep_var ~ cols)
}
我不知道如何进行这里。有任何想法吗? 谢谢!
你可以试试
myfunc <- function(df, dep_var, cols){
cols <- grep(cols, colnames(df), value = T)
Formula <- as.formula(paste(dep_var,"~",paste(cols, collapse = "+")))
broom::tidy(lm(Formula, data = df))
}
myfunc(df, "dep_var", "ind")
# A tibble: 3 x 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) -0.181 1.15 -0.157 0.890
2 ind_1 0.0762 0.0208 3.66 0.0673
3 ind_2 -0.0524 0.257 -0.204 0.857
使用 grep
搜索名称。也许包括 cols <- grep(dep_var, cols, value = T, invert = T)
以避免因变量也被发现为独立变量。然后创建公式,将右侧的所有变量与 "+"
一起折叠。使用 broom
的 tidy
函数获得不错的输出。
在tidyverse
你可以试试这个类似的方法
foo <- function(df, dep_var, cols ){
df %>%
select(a = quo_name(dep_var), starts_with(cols)) %>%
lm(a ~ ., data = .) %>%
broom::tidy()
}
foo(df, "dep_var", "ind")
# A tibble: 3 x 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) -0.181 1.15 -0.157 0.890
2 ind_1 0.0762 0.0208 3.66 0.0673
3 ind_2 -0.0524 0.257 -0.204 0.857
对于 select
,matches
采用正则表达式,因此您可以直接从函数参数输入任何正则表达式:
library(dplyr)
library(rlang)
myfunc <- function(df, dep_var, regex){
dep_var_quo <- ensym(dep_var)
df %>%
select(!!dep_var_quo, matches(regex)) %>%
lm(expr(!!dep_var_quo ~ .), data = .)
}
myfunc(df, dep_var, "^ind")
ensym
将调用函数时提供的代码转换为符号。然后可以在 select
和 expr
中使用 !!
取消引用。这会启用非标准评估,您可以按原样键入 dep_var
而不是字符串 "dep_var"
。 enquo
是同样的想法,但是把它变成了一个quosure。 expr
在这里很有用,因为您可以取消引用 quosures 并将整个代码转换为表达式。
输出:
Call:
lm(formula = expr(!(!dep_var_quo) ~ .), data = .)
Coefficients:
(Intercept) ind_1 ind_2
-0.18063 0.07621 -0.05241