为什么我不能使用map将函数应用于lm fit列表?

问题描述 投票:0回答:2

我正在使用嵌套数据框和map函数将线性回归模型拟合到不同的组。之后,我想对lm的每个拟合进行分段回归。

在此示例中,diamonds2包含一列Fit_lm,每个组的lm个适合。在那之后,我以为我可以再次使用map来应用segmented功能,但是代码不起作用(请参阅diamonds3)。

但是,如果我在相同的功能中组合了lmsegmented,则代码有效(请参阅diamonds4)。

[如果可能,我想了解mapsegmented无法在lm对象上工作的原因?这与map功能的工作方式有关吗?当然,我可以像diamonds4一样做同样的事情,但是由于我已经适合lm一次,因此此策略效率不高。

library(tidyverse)
library(segmented)

data("diamonds")

diamonds2 <- diamonds %>%
  group_by(cut) %>%
  nest() %>%
  mutate(Fit_lm = map(data, ~lm(price ~ carat, data = .x))) 

diamonds3 <- diamonds2 %>%
  # segmented regression
  mutate(Fit_seg = map(Fit_lm, ~segmented(.x, seg.Z = ~carat)))
# Error: Problem with `mutate()` input `Fit_seg`.
# x cannot coerce class ‘"lm"’ to a data.frame
# i Input `Fit_seg` is `map(Fit_lm, ~segmented(.x, seg.Z = ~carat))`.
# i The error occured in group 1: cut = "Fair".
# Run `rlang::last_error()` to see where the error occurred.

diamonds4 <- diamonds2 %>%
  #  lm and segmented regression
  mutate(Fit_seg = map(data, function(x){
    fit <- lm(price ~ carat, data = x)
    fit2 <- segmented(fit, seg.Z = ~carat)
    return(fit2)
  }))

我正在使用嵌套数据框和地图函数将线性回归模型拟合到不同的组。之后,我想对lm的每个拟合进行分段回归。在此示例中,diamonds2 ...

r list tidyverse purrr lm
2个回答
1
投票

您可以使用新的dplyr 1.0.0


1
投票

运行segmented时需要在函数中提供数据。另外,数据应与运行lm时的名称相同。

© www.soinside.com 2019 - 2024. All rights reserved.