问题描述
我的数据框由组分隔。我想对每个组执行分段线性回归,为此我打算使用 segmented
包。
首先,我使用 dplyr
包为每个组创建了线性模型。下一步是对这些模型进行细分,但这就是我卡住的地方。任何提示或其他方法来做到这一点?最终目标是使用这些段来制作图表。
library(dplyr)
library(segmented)
Group <- c("A","B")
x <- 0:10
y <- c(0,0.4,0.6,0.8,0.9,0.95,0.97,0.98,0.99,1,0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1)
df <- expand.grid(x = x,Group = Group)
df$y <- y
Segment <- df %>%
group_by(Group) %>%
do(my.lm = lm(data = .,formula = y ~ x))
失败的尝试:
Segment <- df %>%
group_by(Group) %>%
do(my.lm = lm(data = .,formula = y ~ x),my.seg = segmented(my.lm,seg.Z = x))
Segment <- df %>%
group_by(Group) %>%
do(my.lm = lm(data = .,formula = y ~ x)) %>%
do(my.seg = segmented(my.lm,formula = y ~ x)) %>%
mutate(my.seg = segmented(my.lm,seg.Z = x))
解决方法
一种选择是用 tryCatch
包裹并为可能的错误返回 NA
library(dplyr)
out <- df %>%
nest_by(Group) %>%
mutate(my.lm = list(lm(y ~ x,data = data)),my.seg = list(tryCatch(segmented(my.lm,seg.Z = ~ x),error = function(e) list(NA))))
-输出
> out
# A tibble: 2 x 4
# Rowwise: Group
Group data my.lm my.seg
<fct> <list<tibble[,2]>> <list> <list>
1 A [11 × 2] <lm> <segmentd>
2 B [11 × 2] <lm> <list [1]>
> out$my.seg
[[1]]
Call: segmented.lm(obj = my.lm,seg.Z = ~x)
Meaningful coefficients of the linear terms:
(Intercept) x U1.x
0.03333 0.30000 -0.27488
Estimated Break-Point(s):
psi1.x
2.691
[[2]]
[[2]][[1]]
[1] NA