【问题标题】:Using map() in a split-apply-combine to run multiple regressions with regression weights在 split-apply-combine 中使用 map() 来运行具有回归权重的多个回归
【发布时间】:2021-01-19 11:41:54
【问题描述】:

假设我有一些看起来像这样的数据:

N <- 200
X <- sample(letters[1:5],N, replace = T)
Y <- rnorm(N)
W <- abs(rnorm(N))

my_data <- tibble(X, Y, W)

我想对X 定义的每个数据子集运行仅截距回归。为此,我使用nest()mutate()map(),如下所示:

my_data %>%
  group_by(X) %>%
  nest() %>%
  mutate(fit = map(data, ~lm(Y ~ 1, data = .x)))

虽然此代码有效,但当我尝试合并回归权重时,如下所示:

my_data %>%
  group_by(X) %>%
  nest() %>%
  mutate(fit = map(data, ~lm(Y ~ 1, data = .x, weights = W)))

我收到以下错误:

Error: Problem with `mutate()` input `fit`.
x missing or negative weights not allowed
ℹ Input `fit` is `map(data, ~lm(Y ~ 1, data = .x, weights = W))`.
ℹ The error occurred in group 1: X = "a".
Run `rlang::last_error()` to see where the error occurred.

我哪里错了?

(免责声明:我是 tidyverse 的新手,所以我可能会做一些愚蠢的事情)

【问题讨论】:

    标签: r dplyr purrr


    【解决方案1】:

    这样写:

    my_data %>%
     group_by(X) %>%
     nest() %>%
     mutate(fit = map(data, ~lm(Y ~ 1, data = .x, weights = .x$W)))
    

    关键是此时 W 不再是现有列。 它仅存在于data 内部。使用map,您正在循环data,此时它是一个数据帧列表。

    因此要调用W,需要通过$调用它

    另外,将 W 定义为:

    W <- abs(rnorm(N))
    

    因为你不能有负权重。


    或者,您可以按以下方式进行:

    my_data %>%
     group_by(X) %>%
     summarise(fit = list(lm(Y ~ 1, weights = W)))
    

    它会给你同样的结果。 [几乎:因为 X 将被排序]

    看看这个:

    fit1 <- my_data %>%
     arrange(X) %>% 
     group_by(X) %>%
     nest() %>%
     mutate(fit = map(data, ~lm(Y ~ 1, data = .x, weights = .x$W))) %>% 
     pull(fit)
    
    fit2 <- my_data %>%
     group_by(X) %>%
     summarise(fit = list(lm(Y ~ 1, weights = W))) %>% 
     pull(fit)
    
    identical(map(fit1, coef), map(fit2, coef))
    #> TRUE
    

    如果你只需要系数,你可以这样做:

    my_data %>%
     group_by(X) %>%
     summarise(fit = coef(lm(Y ~ 1, weights = W)))
    

    【讨论】:

    • 非常感谢!并修正了权重错字。
    • 我进行了编辑以提供另一种解决方案。看看吧
    • 作为替代方案,还有(实验性)dplyr::group_map() 函数。
    • 听起来不错!我想,由于最后需要有一个数据框,dplyr::group_modify 可能更合适。
    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多