【发布时间】: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