【问题标题】:How to use segmented package when working with data frames with dplyr package to perform piecewise linear regression?使用 dplyr 包处理数据帧以执行分段线性回归时如何使用分段包?
【发布时间】:2021-09-28 06:56:33
【问题描述】:

我的数据框按组分隔。我想对每个组执行分段线性回归,为此我打算使用 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.9, 0.95, 0.97, 0.98, 0.99, 1,
       0, 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,
                        seg.Z = x))


Segment <- df %>%
  group_by(Group) %>%
  do(my.lm = lm(data = .,
                formula = y ~ x)) %>%
  mutate(my.seg = segmented(my.lm,
                        seg.Z = x))

【问题讨论】:

  • 我认为您的数据也不正确。例如。对于第二组“B”,它会抛出错误Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 0 (non-NA) cases
  • @akrun 在我的电脑上没有出现这个错误。此外,您似乎正在使用我没有使用过的lm.fit() 函数。您能否更具体地说明错误在哪里?
  • 这里是错误tmp &lt;- subset(df, Group == 'B'); obj1 &lt;- lm(y ~ x, tmp); segmented(obj1, seg.Z = ~ x)#Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 0 (non-NA) cases。如果你对Group == 'A' 做同样的事情,它会起作用

标签: r dplyr linear-regression segment piecewise


【解决方案1】:

一种选择是使用 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

【讨论】:

    猜你喜欢
    • 2020-05-30
    • 1970-01-01
    • 2021-08-21
    • 2013-01-05
    • 2023-04-07
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多