【问题标题】:Piecewise linear regression in R (segmented.lm)R中的分段线性回归(segmented.lm)
【发布时间】:2014-09-21 13:03:27
【问题描述】:

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

【问题讨论】:

  • 我希望这只是一个样本数据集,因为这样的观察实在太少了,无法尝试估计类似的东西。不指定 K 时的问题是默认值是 10。由于您的观察值少于,因此此默认值没有意义,并且您无法区分模型。 K=1 的问题是它在 80 点之后尝试突破,这在第二组中只留下一个点,因此无法计算斜率。但是您确实需要更大的输入数据集。
  • 就像@MrFlick 所说,你在这里的观察太少了。试试:data = data.frame(x=c(50,60,70,80,90,100,110) , y= c(703.786,705.857,708.153,711.056,709.257, 707.4, 705.6))。然后这将起作用:model.lm = segmented(lm(y~x,data = data),seg.Z = ~x, psi = NA, control = seg.control(K=1))
  • 谢谢弗利克先生和弗兰克。我最终将使用更大的数据集。但是对于这个样本集,我可以设法得到一个模型: library("SiZer") model.pwl = piecewise.linear(x = data$x, y = data$y, middle = 1, CI = FALSE, bootstrap .samples = 1000, sig.level = 0.05) 图(model.pwl)

标签: r regression piecewise


【解决方案1】:

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

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

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

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

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-18
    • 2012-03-14
    • 2023-04-07
    • 2010-11-13
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多