R中的分段线性回归(segmented.lm)

时间:2014-07-30 01:36:48

标签: r regression piecewise

我感谢任何帮助使 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个数据:边界处的断点或彼此太近的

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))] 

希望这会有所帮助。