将参数传递给使用 dplyr R 的函数内的回归模型
Passing an argument to a regression model inside a function that uses dplyr R
我写了一个函数来 运行 过滤数据集的单变量回归。该函数将用于过滤的值和回归模型的预测变量的名称作为参数。如您所见,我正在为数据屏蔽和评估而苦苦挣扎。如何在回归模型中直接使用 .pred 参数?谢谢!
pacman::p_load(tidyverse, purrr, broom)
data("mtcars")
# my function
regr_func <- function(.cyl, .pred){
mtcars %>%
filter(cyl == .cyl) %>% # cars with .cyl cylinders
mutate(x = .data[[.pred]]) %>% # this is a bit of a hack :(
lm(mpg ~ x, data = .) %>%
tidy() %>%
mutate(predictor = .pred,
cylinders = .cyl)
}
regr_func(4, "hp")
#> # A tibble: 2 × 7
#> term estimate std.error statistic p.value predictor cylinders
#> <chr> <dbl> <dbl> <dbl> <dbl> <chr> <dbl>
#> 1 (Intercept) 36.0 5.20 6.92 0.0000693 hp 4
#> 2 x -0.113 0.0612 -1.84 0.0984 hp 4
Created on 2021-10-26 by the reprex package (v2.0.1)
更新
感谢 Jon 的提示,我可以重写函数以将 .pred 参数直接传递给 lm(),但现在我无法将数据传输到 lm(),所以我不得不创建一个新的数据集在函数内部。
regr_func1 <- function(.cyl, .pred){
tmp <- mtcars %>% filter(cyl == .cyl)
xsym <- rlang::ensym(.pred)
rlang::inject( lm(mpg ~ !!xsym, data = tmp) ) %>%
tidy() %>%
mutate(cylinders = .cyl)
}
替代方法,使用 glue
库:
regr_func <- function(.cyl, .pred){
require(glue)
o <- 'mpg ~ {.pred}' %>% glue
lm(o, data = mtcars %>% subset(cyl == .cyl))
}
您可以使用 as.formula
或 reformulate
即时创建公式,而无需破坏管道。
library(dplyr)
library(broom)
regr_func <- function(.cyl, .pred){
mtcars %>%
filter(cyl == .cyl) %>%
lm(reformulate(.pred, 'mpg'), data = .) %>%
tidy() %>%
mutate(predictor = .pred,
cylinders = .cyl)
}
regr_func(4, "hp")
# term estimate std.error statistic p.value predictor cylinders
# <chr> <dbl> <dbl> <dbl> <dbl> <chr> <dbl>
#1 (Intercept) 36.0 5.20 6.92 0.0000693 hp 4
#2 hp -0.113 0.0612 -1.84 0.0984 hp 4
我写了一个函数来 运行 过滤数据集的单变量回归。该函数将用于过滤的值和回归模型的预测变量的名称作为参数。如您所见,我正在为数据屏蔽和评估而苦苦挣扎。如何在回归模型中直接使用 .pred 参数?谢谢!
pacman::p_load(tidyverse, purrr, broom)
data("mtcars")
# my function
regr_func <- function(.cyl, .pred){
mtcars %>%
filter(cyl == .cyl) %>% # cars with .cyl cylinders
mutate(x = .data[[.pred]]) %>% # this is a bit of a hack :(
lm(mpg ~ x, data = .) %>%
tidy() %>%
mutate(predictor = .pred,
cylinders = .cyl)
}
regr_func(4, "hp")
#> # A tibble: 2 × 7
#> term estimate std.error statistic p.value predictor cylinders
#> <chr> <dbl> <dbl> <dbl> <dbl> <chr> <dbl>
#> 1 (Intercept) 36.0 5.20 6.92 0.0000693 hp 4
#> 2 x -0.113 0.0612 -1.84 0.0984 hp 4
Created on 2021-10-26 by the reprex package (v2.0.1)
更新
感谢 Jon 的提示,我可以重写函数以将 .pred 参数直接传递给 lm(),但现在我无法将数据传输到 lm(),所以我不得不创建一个新的数据集在函数内部。
regr_func1 <- function(.cyl, .pred){
tmp <- mtcars %>% filter(cyl == .cyl)
xsym <- rlang::ensym(.pred)
rlang::inject( lm(mpg ~ !!xsym, data = tmp) ) %>%
tidy() %>%
mutate(cylinders = .cyl)
}
替代方法,使用 glue
库:
regr_func <- function(.cyl, .pred){
require(glue)
o <- 'mpg ~ {.pred}' %>% glue
lm(o, data = mtcars %>% subset(cyl == .cyl))
}
您可以使用 as.formula
或 reformulate
即时创建公式,而无需破坏管道。
library(dplyr)
library(broom)
regr_func <- function(.cyl, .pred){
mtcars %>%
filter(cyl == .cyl) %>%
lm(reformulate(.pred, 'mpg'), data = .) %>%
tidy() %>%
mutate(predictor = .pred,
cylinders = .cyl)
}
regr_func(4, "hp")
# term estimate std.error statistic p.value predictor cylinders
# <chr> <dbl> <dbl> <dbl> <dbl> <chr> <dbl>
#1 (Intercept) 36.0 5.20 6.92 0.0000693 hp 4
#2 hp -0.113 0.0612 -1.84 0.0984 hp 4