我感谢任何帮助使 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个数据:边界处的断点或彼此太近的
答案 0 :(得分: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))]
希望这会有所帮助。