使用 purrr::map 将多个线性模型拟合到数据帧中的所有观测值

Fitting multiple linear models to all observations in a dataframe using purrr::map

提问人:T. K. 提问时间:10/25/2023 更新时间:10/25/2023 访问量:49

问:

我正在尝试使用这些练习来了解有关 R 功能的更多信息。purrr

任务(练习 8)如下:

  1. 按 拆分数据集。mtcarscyl
  2. 通过 拟合线性模型 ( 对于每组观测值。qsec ~ hpcyl
  3. 将每个模型适合所有 .mtcars

我目前的代码是:

library(tidyverse)
mtcars %>% 
    split(mtcars$cyl) %>% 
    map(~ lm(.x$qsec ~ .x$hp)) %>% 
    map(~ predict(.x, newdata = list(mtcars)))

但是,这仅在一组 上应用一个模型,因此输出为:mtcars

$`4`
       1        2        3        4        5        6        7        8 
18.98872 19.43308 18.96005 19.37574 19.57642 19.39008 18.93138 19.37574 
       9       10       11 
19.01739 18.70203 18.75937 

$`6`
       1        2        3        4        5        6        7 
18.51998 18.51998 18.51998 18.74090 17.94558 17.94558 15.64799 

$`8`
       1        2        3        4        5        6        7        8 
17.37861 16.13783 17.28998 17.28998 17.28998 16.84684 16.66959 16.40371 
       9       10       11       12       13       14 
17.82174 17.82174 16.13783 17.37861 15.80104 14.54254 

据我了解,所需的输出将是一个预测值列表,其中包含三个列表元素,每个元素有 32 个值。我需要如何修改代码?谢谢。

r tidyverse 咕噜

评论


答:

2赞 stefan 10/25/2023 #1

问题是您将向量直接传递到里面的公式中。而是将数据集传递给参数:lm()data=

library(tidyverse)
#> Warning: package 'ggplot2' was built under R version 4.3.1

pred <- mtcars %>%
  split(mtcars$cyl) %>%
  map(~ lm(qsec ~ hp, data = .x)) %>%
  map(~ predict(.x, newdata = mtcars))

lapply(pred, length)
#> $`4`
#> [1] 32
#> 
#> $`6`
#> [1] 32
#> 
#> $`8`
#> [1] 32

评论

1赞 T. K. 10/25/2023
太棒了,非常感谢你的快速澄清,Stefan!
1赞 TarJae 10/25/2023
为了保持整洁的风格,我们可以做:library(tidyverse) pred <- mtcars %>% group_split(cyl) %>% map(~ lm(qsec ~ hp, data = .x)) %>% map(~ predict(.x, newdata = mtcars)) map(pred, length)
1赞 stefan 10/25/2023
@TarJae。确定。不过,我更喜欢使用它,因为它返回一个命名列表,而没有。splitgroup_split
0赞 T. K. 10/25/2023
有意思,谢谢两位。我依稀记得有一个函数存在,但懒得去查。@Stefan我同意你的看法,在这种情况下,命名版本似乎更有帮助。tidyverse
0赞 TarJae 10/25/2023
@stefan。这是一个很好的观点!