簡體   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