gpt4 book ai didi

r - 使用 dplyr() 检索通过 group_by() 和 do() 创建的模型对象

转载 作者:行者123 更新时间:2023-12-02 03:41:20 26 4
gpt4 key购买 nike

我正在尝试使用dplyr和管道运算符(%>%)来检索存储在数据框中的模型对象。

带有示例数据

library(dplyr)

set.seed(256)
dat <-
data.frame(x = rnorm(100),
y = rnorm(100, 10),
spec = sample(c("1", "2"), 100, TRUE)) %>%
group_by(spec) %>%
do(lm = lm(y ~ x, data = .))

我可以子集并检索实际的模型对象

> dat$lm[dat$spec == "1"][[1]]

Call:
lm(formula = y ~ x, data = .)

Coefficients:
(Intercept) x
9.8171 -0.2292

> dat$lm[dat$spec == "1"][[1]] %>% class()
[1] "lm

但我认为这是检索其中包含的 lm() 模型对象的一种不优雅的方式,特别是考虑到我的代码的其余部分采用“dplyr”方式构建”。我想使用 dplyr,但我不知道如何使用。例如,使用

dat %>% filter(spec == "1") %>% select(lm) 

返回时不起作用

Source: local data frame [1 x 1]
Groups: <by row>

# A tibble: 1 x 1
lm
<list>
1 <S3: lm>

dat %>% filter(spec == "1") %>% .$lm

仅让我到达列表中的第一个对象,例如

> dat %>% filter(spec == "1") %>% .$lm
[[1]]

Call:
lm(formula = y ~ x, data = .)

Coefficients:
(Intercept) x
10.01495 -0.07438

我无法找到使用 dplyr 获取 dat 中实际模型对象的方法。当然,我可以使用 broomtidy() 来压缩所有内容

library(broom)
tidy(dat, lm)

但这仍然不会返回实际的模型对象:

> tidy(dat, lm)
# A tibble: 4 x 6
# Groups: spec [2]
spec term estimate std.error statistic p.value
<fct> <chr> <dbl> <dbl> <dbl> <dbl>
1 1 (Intercept) 10.0 0.120 83.3 1.91e-54
2 1 x - 0.0744 0.111 - 0.671 5.05e- 1
3 2 (Intercept) 9.86 0.131 75.0 1.42e-50
4 2 x - 0.0793 0.148 - 0.535 5.95e- 1

我什至可以使用dplyrsummarise()来自do()调用的输出并从模型中检索系数,但是这仍然没有给我模型对象本身:

dat %>% 
select(spec) %>%
bind_cols(dat %>%
summarize(lm_i = coefficients(lm)[[1]],
lm_s = coefficients(lm)[[2]]))

是否有一种 dplyr 方法可以从使用 do() 创建的模型中检索实际模型对象?

最佳答案

do 返回一个列表列,因此要提取其各个元素,您需要使用列表子集。有多种方法可以做到这一点,但在 tidyverse 中,purrr::pluck 是提取单个[可能深度嵌套]元素的不错选择:

library(tidyverse)

dat %>% pluck('lm', 1)
#>
#> Call:
#> lm(formula = y ~ x, data = .)
#>
#> Coefficients:
#> (Intercept) x
#> 10.01495 -0.07438

它主要相当于[[子集,即

dat[['lm']][[1]]

要获得所需的工作,您需要继续子集化,因为 .$lm 返回列表列,在本例中是模型列表。 .[[1]](类似于上面的1)从列表中提取模型:

dat %>% filter(spec == "1") %>% .$lm %>% .[[1]]

或者混合方法,如果你愿意的话:

dat %>% filter(spec == "1") %>% pluck('lm', 1)

或使用pull提取具有NSE语义的列:

dat %>% filter(spec == "1") %>% pull(lm) %>% pluck(1)

所有返回的内容都是相同的。

关于r - 使用 dplyr() 检索通过 group_by() 和 do() 创建的模型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48527202/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com