【问题标题】:how to select which columns to use in a regression?如何选择在回归中使用哪些列?
【发布时间】:2019-02-09 14:17:36
【问题描述】:

考虑这个简单的例子

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

我想编写一个运行lm 线性回归的function,我可以在其中指定我想使用的dependent 变量以及independent variables

诀窍是我想指定类似“使用以some_string_pattern开头的所有变量作为独立变量”

类似

myfunc <- function(df, dep_var, 'myregex' ){
  cols <- #select columns that start with myregex
  y <- lm(dep_var ~ cols)
}

我不知道如何继续。有任何想法吗? 谢谢!

【问题讨论】:

    标签: r dplyr lm


    【解决方案1】:

    你可以试试

    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 &lt;- 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 
    

    【讨论】:

      【解决方案2】:

      使用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 
      

      【讨论】:

      • 不错!你能解释一下ensymquo_text在这里做什么吗?为什么我需要这些?
      • 谢谢!我必须把它交给 Jimbou,因为他是第一个,但你的解决方案也很好
      • @ℕʘʘḆḽḘ 实际上我发现了一个更简单的方法,使用expr。查看我的更新。
      • @ℕʘʘḆḽḘ 好吧,我们的解决方案不同
      • @ℕʘʘḆḽḘ 不是真的。我的允许select 的非标准评估和正则表达式。即使他们是。我在他编辑他的版本之前发布了我的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      • 2014-08-18
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      相关资源
      最近更新 更多