在保持psi = NA的同时更改seg.control()中的参数

时间:2016-11-23 09:26:04

标签: r piecewise

我有dataset我试图使用segmented()拟合分段线性回归模型。我想离开psi = NA,因为我有几个“横断面”的数据,需要安装分段模型。问题是我一直遇到两个错误之一:

Error in segmented.lm(transect.lm, seg.Z = ~distance, psi = NA, control = seg.control(n.boot = 30,  : 
  only 1 datum in an interval: breakpoint(s) at the boundary or too close each other

Error: at least one coef is NA: breakpoint(s) at the boundary? (possibly with many x-values replicated)

我想将psi留给NA。可以更改seg.control内的任何内容以防止错误吗?

我在这里提出了分段模型:

transect.lm <- lm(elevation~length, data = data2)
transect.pw <- segmented(transect.lm, 
                          seg.Z = ~length, 
                          psi = NA, 
                          control = seg.control(
                            n.boot = 30, 
                            h = 0.001, 
                            stop.if.error = FALSE))

非常感谢先进!

2 个答案:

答案 0 :(得分:1)

如果您不想对psi参数进行硬编码,可以执行以下操作:

如果您认为断点将接近开头:

segmented(transect.lm, seg.Z = ~length, psi = sort(data2$length)[2])

如果你认为断点接近中间:

segmented(transect.lm, seg.Z = ~length, psi = median(data2$length))

如果您认为断点接近结束:

segmented(transect.lm, seg.Z = ~length, psi = sort(data2$length, decreasing = TRUE)[2])

无论如何,我发现即使我将segmented()设置为距收敛点很远的值,psi也会在数据集的任何部分上最好地收敛。

答案 1 :(得分:1)

我发现a post in R-Bloggers谈到了如何管理for循环中的错误。 for循环中给我带来麻烦的部分可以在try()命令内。在文章中,R只是跳过它并继续进行分析,但我发现我的for循环,它会循环回来再试一次,所以最终看起来像这样:

transect.lm <- lm(elevation~length, data = data2)
try(transect.pw <- segmented(transect.lm, 
                          seg.Z = ~length, 
                          psi = NA, 
                          control = seg.control(
                            n.boot = 30, 
                            h = 0.001)))

错误仍会打印出来让我知道发生了什么错误,但它会循环回来再试一次,直到模型安装完毕,然后移到下一个横断面。

感谢大家的帮助!