【发布时间】:2020-09-24 05:36:04
【问题描述】:
我正在使用嵌套数据框和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)
}))
【问题讨论】:
-
这不是
map的事情;lapply也会发生同样的事情。通过调试器运行它,它看起来像是segmented.lm中如何处理环境的产物;mf <- eval(mf, parent.frame())行是错误的。 -
@alistaire 感谢您对此进行检查。我想你是对的。这与环境的处理方式有关。