我有一个函数尝试将分段回归模型应用于我的数据。 在某些情况下,数据存在大量缺失值,并且我没有一个很好的估计器来估计结的位置。我决定绕过分段并进行简单的线性回归:
try(piecewise) if error go to lm with just one slope
这是执行此操作的代码。请注意,
lin.reg
是一个辅助函数,它为 x 范围内的 predict()
对象输出 lm
。它不会造成任何问题。
piece <- function(x,y){
# just in case this comes with column names or something
y <- as.numeric(y)
# create the lm object
lm.obj <- lm(y~x)
# Try to fit piecewise
seg <- try(segmented(lm.obj,seg.Z=~x))
# print(seg)
if("try-error" %in% class(seg)) {
# Print that you are using a linear regression and not the piece-wise
print("Using linear Regression")
# Call helper function
result <- lin.reg(x,y)
# Get out of the error/function
return(result)
}
# Use the piece-wise
result <- predict(segmented::segmented(lm.obj,seg.Z=~x),
newdata = data.frame(x,y))
print("Using piece-wise regression")
return(result)
}
问题
当分段出错时,我会收到此错误
错误:至少有一个系数不适用:边界处有断点吗? (可能有许多重复的 x 值)
但是它不可靠/不可预测,有时它会被忽略,有时会破坏功能。我正在使用
y
值循环数据帧的行,并且在制动之前相同的调用会到达不同的行。
我相信这与
if("try-error" %in% class(seg))
有关,这可能不是捕获错误的最佳方法。
我添加了一些打印来确保。当它正常工作时,注意迭代 284 给出了错误并进入简单线性。
[1] "Using piece-wise regression"
[1] 283
[1] "segmented" "lm"
[1] "Using piece-wise regression"
[1] 284
Error : at least one coef is NA: breakpoint(s) at the boundary? (possibly with many x-values replicated)
[1] "try-error"
[1] "Using linear Regression"
当它没有出现时,似乎 try() 调用没有返回应有的错误
[1] "Using piece-wise regression"
[1] 312
[1] "segmented" "lm"
[1] "Using piece-wise regression"
[1] 313
[1] "segmented" "lm"
Error: at least one coef is NA: breakpoint(s) at the boundary? (possibly with many x-values replicated)
在 try 块中添加参数
silent=T
对我来说很有效。
2024年的答案:
try(., silent = T)
和 seg.control(stop.if.error = F)
对于抑制此类错误不再有用。
根据我自己的经验,您可能需要尝试限制
it.max
中的 n.boot
或 seg.control
并打开 display = T
,这样您就可以了解发生了什么。