繁体   English   中英

通过按 R 中的值过滤列来应用 glm()

[英]Apply glm() by filtering a column by its value in R

我有一个 dataframe,我们称它为因变量、各种自变量(指标)和一个过滤变量。 我的目标是通过过滤我的过滤变量中的不同类别来运行回归。 例如,如果我想对code == "all"运行回归,我将只使用我的 dataframe,过滤代码,然后运行回归:

sample_tib %>%
    filter(code == "all") %>%
    glm(love ~ ., data = ., family = "gaussian")

但是我面临着几个问题:

  1. 在我上面的示例中,我的glm()将采用所有列, code除外。 回归的理想输入是love ~ ind1 + ind2 +... + ind_n
  2. 按代码中的所有code过滤并运行不同的模型是昂贵的,并不是我真正想要的。

也许存在一个 function 过滤 dataframe,然后运行回归并将其结果嵌套在新的 dataframe 或列表中? 我试图弄清楚这一点并遇到了这个问题和美丽的 Dave Gruenewald 的解决方案。 但他的方式只采用一种模式 - x ~ y ,一个因变量和一个自变量。 这显然不是我需要的。

那么,这个问题有没有优雅的解决方案或者具体的封装和功能呢?

数据:

sample_tib <- data.frame(
  code = c(
    "all",
    "all",
    "all",
    "all",
    "all",
    "all",
    "all",
    "all",
    "all",
    "all",
    "all",
    "all",
    "Data Science",
    "Data Science",
    "Data Science",
    "Data Science",
    "Data Science",
    "Data Science",
    "Data Science",
    "Data Science",
    "Data Science",
    "Data Science",
    "Data Science",
    "Data Science",
    "Data Engineer",
    "Data Engineer",
    "Data Engineer",
    "Data Engineer",
    "Data Engineer",
    "Data Engineer",
    "Data Engineer",
    "Data Engineer",
    "Data Engineer",
    "Data Engineer",
    "Data Engineer",
    "Data Engineer"
  ),
  love = runif(36),
  ind1 = runif(36),
  ind2 = runif(36),
  ind3 = runif(36),
  ind4 = runif(36),
  ind5 = runif(36),
  ind6 = runif(36),
  ind7 = runif(36)
)

我们可以使用nest_by中的dplyr

  1. 我们只是使用nest_by进行分组
  2. 只需在mutatelist中创建 model

注意:没有使用除dplyr以外的其他包

library(dplyr)
sample_tib %>%
    nest_by(code) %>%
    mutate(model = list(glm(love ~ ., data = data, family = 'gaussian'))) %>%
    ungroup

-输出

# A tibble: 3 x 3
  code                        data model 
  <chr>         <list<tibble[,8]>> <list>
1 all                     [12 × 8] <glm> 
2 Data Engineer           [12 × 8] <glm> 
3 Data Science            [12 × 8] <glm> 

我们可以拆分数据并将glm分别应用于每个code

library(dplyr)
library(purrr)

sample_tib %>%
  group_split(code) %>%
  map(function(x) glm(love~., data = select(x, -code), family = "gaussian"))

select(x, -code)从数据中删除code列,因此您可以使用love~. .

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM