【问题标题】:applying a regression model to each column using mutate across使用 mutate across 将回归模型应用于每一列
【发布时间】:2021-01-04 17:28:35
【问题描述】:

这是我在here 发布的问题的后续问题

解决方案是使用以下代码:

groups <- c("group2", "group3", "group4")
dataGroups <- groups %>%
  purrr::map_dfr(~ data %>%
        filter(grp == "group1" | grp == .x) %>%
        mutate(!!.x := normaliseData(Y)))

使用这个,我现在有一个看起来像这样的数据框:

   grp    date                id              Y group2 group3 group4
   <chr>  <dttm>              <chr>       <dbl>  <dbl>  <dbl>  <dbl>
 1 group1 2020-09-01 00:00:00 04003      17039. 0.424      NA     NA
 2 group1 2020-09-01 00:00:00 04006      13233. 0.247      NA     NA
 3 group1 2020-09-01 00:00:00 04011_AM    7918. 0          NA     NA
 4 group1 2020-09-01 00:00:00 0401301_AD 22586. 0.682      NA     NA
 5 group1 2020-09-01 00:00:00 0401303    20527. 0.586      NA     NA
 6 group1 2020-09-01 00:00:00 0401305    29422. 1          NA     NA
 7 group2 2020-09-01 00:00:00 22017_AM    7088. 0.0554     NA     NA
 8 group2 2020-09-01 00:00:00 22021_AM    8134. 0.165      NA     NA
 9 group2 2020-09-01 00:00:00 22039_AM   15842. 0.969      NA     NA
10 group2 2020-09-01 00:00:00 22048      16142. 1          NA     NA

我现在想跨列进行变异并应用线性回归模型。我可以使用以下方法生成数据:

dataGroups2 <- dataGroups %>%
  rowwise %>%
  mutate(
    control = sample(c(0,1), 1),
    treatment = ifelse(grp == "group1", 1, 0),
    did = control * treatment
    )

但我无法将我的回归模型应用于列。

dataGroups2 %>% 
  mutate(across(where(.) %in% groups),  ~lm(log(.x) ~ treatment + control + did ))

唯一改变的是Y 变量。如何映射列并运行回归模型?

数据:

data <- structure(list(grp = c("group1", "group1", "group1", "group1", 
"group1", "group1", "group2", "group2", "group2", "group2", "group2", 
"group2", "group3", "group3", "group3", "group3", "group3", "group3", 
"group4", "group4", "group4", "group4", "group4", "group4"), 
    date = structure(c(1598918400, 1598918400, 1598918400, 1598918400, 
    1598918400, 1598918400, 1598918400, 1598918400, 1598918400, 
    1598918400, 1598918400, 1598918400, 1598918400, 1598918400, 
    1598918400, 1598918400, 1598918400, 1598918400, 1598918400, 
    1598918400, 1598918400, 1598918400, 1598918400, 1598918400
    ), tzone = "UTC", class = c("POSIXct", "POSIXt")), id = c("04003", 
    "04006", "04011_AM", "0401301_AD", "0401303", "0401305", 
    "22017_AM", "22021_AM", "22039_AM", "22048", "22053_AM", 
    "22054_AM", "28002", "28004", "2800501", "2800502", "2800503", 
    "2800504", "31010_AM", "31015_AM", "31016", "31019_AM", "31023", 
    "31029_AM"), Y = c(17039.329, 13232.982, 7917.693, 22585.676, 
    20527.113, 29422.471, 7087.536, 8134.265, 15842.035, 16142.111, 
    11493.981, 6556.387, 22086.768, 11325.882, 53449.067, 83662.101, 
    78508.089, 66107.125, 5095.169, 5590.531, 17796.439, 6028.701, 
    39271.698, 3642.281)), row.names = c(NA, -24L), groups = structure(list(
    grp = c("group1", "group2", "group3", "group4"), .rows = structure(list(
        1:6, 7:12, 13:18, 19:24), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), row.names = c(NA, 4L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))

编辑:

我可以单独运行回归:

dataGroups2 %>% 
  lm(group2 ~ control + did + treatment + did, data = .) %>% 
  summary()

dataGroups2 %>% 
  lm(group3 ~ control + did + treatment + did, data = .) %>% 
  summary()

dataGroups2 %>% 
  lm(group4 ~ control + did + treatment + did, data = .) %>% 
  summary()

唯一改变的是Y 变量。

编辑:

整洁的解决方案:

linearRegFunction <- function(x){
  lm(get(x) ~ control + did + treatment, data = dataGroups)
}

groups %>% 
  map(., ~linearRegFunction(.x))

【问题讨论】:

  • 您希望最终输出是什么?你想改变每个模型的结果,并且每个变量仍然有相同的 3 个预测变量吗?
  • 有点困惑...这是你想做的吗? stats.stackexchange.com/questions/88508/…
  • 我想为每个 groupX 列运行回归。我添加了一些代码的编辑。

标签: r dplyr


【解决方案1】:

虽然使用broompurrr 当然可以提出tidyverse 解决方案,但有时一个简单的解决方案也有其优点。例如:

lapply(groups, function(x) summary(lm(get(x) ~ control + did + treatment, data=dataGroups2)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    相关资源
    最近更新 更多