Как выбрать, какие столбцы использовать в регрессии? - PullRequest
0 голосов
/ 04 сентября 2018

Рассмотрим этот простой пример

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.

Хитрость в том, что я хотел бы указать что-то вроде "использовать в качестве независимых переменных все переменные, которые начинаются с some_string_pattern"

Что-то вроде

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

Я не знаю, как действовать здесь. Есть идеи? Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

С 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 - та же идея, но превращает ее в выражение. expr полезен здесь, потому что вы можете расставлять кавычки, и он превращает весь код в выражение.

Выход:

Call:
lm(formula = expr(!(!dep_var_quo) ~ .), data = .)

Coefficients:
(Intercept)        ind_1        ind_2  
   -0.18063      0.07621     -0.05241 
0 голосов
/ 04 сентября 2018

Вы можете попробовать

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 's 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 
...