如何 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) 以避免因变量也被发现为独立变量。然后创建公式,将右侧的所有变量与 "+" 一起折叠。使用 broomtidy 函数获得不错的输出。

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 

对于 selectmatches 采用正则表达式,因此您可以直接从函数参数输入任何正则表达式:

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 将调用函数时提供的代码转换为符号。然后可以在 selectexpr 中使用 !! 取消引用。这会启用非标准评估,您可以按原样键入 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