提问人:T. K. 提问时间:10/25/2023 更新时间:10/25/2023 访问量:49
使用 purrr::map 将多个线性模型拟合到数据帧中的所有观测值
Fitting multiple linear models to all observations in a dataframe using purrr::map
问:
我正在尝试使用这些练习来了解有关 R 功能的更多信息。purrr
任务(练习 8)如下:
- 按 拆分数据集。
mtcars
cyl
- 通过 拟合线性模型 ( 对于每组观测值。
qsec ~ hp
cyl
- 将每个模型适合所有 .
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 个值。我需要如何修改代码?谢谢。
答:
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。确定。不过,我更喜欢使用它,因为它返回一个命名列表,而没有。split
group_split
0赞
T. K.
10/25/2023
有意思,谢谢两位。我依稀记得有一个函数存在,但懒得去查。@Stefan我同意你的看法,在这种情况下,命名版本似乎更有帮助。tidyverse
0赞
TarJae
10/25/2023
@stefan。这是一个很好的观点!
评论