使用 dplyr 包处理数据框时如何使用分段包来执行分段线性回归?

问题描述

我的数据框由组分隔。我想对每个组执行分段线性回归,为此我打算使用 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