2

我感谢任何帮助segmented.lm(或任何其他函数)在此示例中找到明显断点的帮助:

data = list(x=c(50,60,70,80,90) , y= c(703.786,705.857,708.153,711.056,709.257))
plot(data, type='b')
require(segmented)
model.lm = segmented(lm(y~x,data = data),seg.Z = ~x, psi = NA)

它返回以下错误:

solve.default(crossprod(x1), crossprod(x1, y1)) 中的错误:系统在计算上是奇异的:倒数条件数 = 1.51417e-20

如果我改变 K:

model.lm = segmented(lm(y~x,data = data),seg.Z = ~x, psi = NA, control = seg.control(K=1))

我得到另一个错误:

segmented.lm(lm(y ~ x, data = data), seg.Z = ~x, psi = NA, control = seg.control(K = 1)) 中的错误:间隔中只有 1 个数据:断点(s ) 在边界或彼此太近

4

1 回答 1

0

Crawley (2007: 427) 中描述了一种很好的客观方法来确定断点。

breaks首先,为一系列潜在断点定义一个向量:

breaks <- data$x[data$x >= 70 & data$x <= 90]

然后for对所有潜在断点运行一个循环进行分段回归,并mse从输出中提取每个模型的最小残差标准误差 ( ) summary

mse <- numeric(length(breaks))
for(i in 1:length(breaks)){
  piecewise <- lm(data$y ~ data$y*(data$x < breaks[i]) + data$y*(data$x >= breaks[i]))
  mse[i] <- summary(piecewise)[6]
}
mse <- as.numeric(mse)

最后,确定最少的断点mse

breaks[which(mse==min(mse))] 

希望这可以帮助。

于 2020-06-26T09:21:38.900 回答