我正在使用嵌套数据框和map
函数将线性回归模型拟合到不同的组。之后,我想对lm
的每个拟合进行分段回归。
在此示例中,diamonds2
包含一列Fit_lm
,每个组的lm
个适合。在那之后,我以为我可以再次使用map
来应用segmented
功能,但是代码不起作用(请参阅diamonds3
)。
但是,如果我在相同的功能中组合了lm
和segmented
,则代码有效(请参阅diamonds4
)。
[如果可能,我想了解map
和segmented
无法在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 ...
您可以使用新的dplyr 1.0.0
运行segmented
时需要在函数中提供数据。另外,数据应与运行lm
时的名称相同。