Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的分段线性回归(segmented.lm)_R_Regression_Piecewise - Fatal编程技术网

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

R中的分段线性回归(segmented.lm),r,regression,piecewise,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) 它返回时出现以下错误: 求解中出错。默认值(

我非常感谢您能帮助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)
它返回时出现以下错误:

求解中出错。默认值(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))
我得到另一个错误:

分段.lm(lm(y~x,data=data),分段Z=~x,psi=NA,控制=seg.control(K=1))中的错误: 间隔内仅1个基准点:边界处的断点或彼此太近


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

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

breaks <- data$x[data$x >= 70 & data$x <= 90]
最后,用最小的
mse
确定断点:

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

希望这能有所帮助。

我希望这只是一个样本数据集,因为这实在太少了,无法尝试估算类似的数据。不指定K时的问题是默认值为10。由于您的观测值少于,因此此默认值没有意义,并且您无法区分不同的模型。K=1的问题是,它试图在80点后突破,在第二组中只剩下一个点,因此无法计算斜率。但是你真的需要一个更大的输入数据集,就像@MrFlick说的,你在这里的观察太少了。试试:
data=data.frame(x=c(50,60,70,80,90100110),y=c(703.786705.857708.153711.056709.25770707.4705.6))
。这样就可以了:
model.lm=segmented(lm(y~x,data=data),seg.Z=~x,psi=NA,control=seg.control(K=1))
谢谢Flick和Frank先生。我最终将使用更大的数据集。但是对于这个样本集,我可以设法得到一个模型:library(“SiZer”)model.pwl=piecedise.linear(x=data$x,y=data$y,middle=1,CI=FALSE,bootstrap.samples=1000,sig.level=0.05)plot(model.pwl)
breaks[which(mse==min(mse))]