R 分段包断点是可变的,在断点上查找标准错误

R 分段包断点是可变的,在断点上查找标准错误,r,linear-regression,piecewise,R,Linear Regression,Piecewise,今天有两个问题:一个是关于使用segmented包创建分段回归,并在多次运行模型时获得不同的断点,第二个是关于查找断点的标准错误 加载和查看数据: gbay<-data.frame(matrix(,nrow=46,ncol=3)) colnames(gbay)<-c("pop","cal.length","temp") gbay$cal.length<-c(0.597, 0.834, 1.120, 1.353, 0.119, 1.301, 0.944, 3.127, 3.37

今天有两个问题:一个是关于使用
segmented
包创建分段回归,并在多次运行模型时获得不同的断点,第二个是关于查找断点的标准错误

加载和查看数据:

gbay<-data.frame(matrix(,nrow=46,ncol=3))
colnames(gbay)<-c("pop","cal.length","temp")

gbay$cal.length<-c(0.597, 0.834, 1.120, 1.353, 0.119, 1.301, 0.944, 3.127, 3.375, 3.171, 3.400, 3.376, 3.322, 3.785, 3.304, 3.197, 3.216,
 4.183, 2.171, 3.989, 3.187 ,4.153, 3.252, 4.960, 4.268, 4.827, 4.869, 3.932, 4.573, 4.645, 4.634, 4.713, 4.879, 4.724,
5.031, 4.746, 5.047, 5.714, 5.227, 4.701,4.280, 5.296, 4.977, 4.932, 4.374, 4.758)

gbay$temp<-c(16, 16, 16, 16, 16, 16, 16, 20, 20, 20, 20, 20, 20, 20, 20, 24, 24, 24, 24, 24, 24, 24, 24, 26, 26, 26, 26, 26, 26, 26, 28, 28, 28, 28,
28, 28, 28, 28, 28, 30, 30, 30, 30, 30, 30, 30)
gbay$pop<-gb

ggplot(gbay,aes(x=temp,y=cal.length))+geom_point()
2) 我试图从这个数据中提取断点(psi)的x和y分量。我成功地做到了这一点。但是,我也希望能够提取断点的x和y组件的错误。我认为模型给出了x分量的标准错误,但我想知道是否有办法在
分段
或其他包中找到断点的y分量中的错误

m.gbay<-glm(cal.length~temp,gbay,family=gaussian)
seg.gbay<-segmented(m.gbay,seg.Z = ~temp, psi=28)
xmin<-min(gbay$temp,na.rm=T)
xmax<-max(gbay$temp,na.rm=T)
predicted.gbay<-data.frame(temp=seq(xmin,xmax,length.out=100))
predicted.gbay$cal.length<-predict(seg.gbay,predicted.gbay)
predicted.gbay$pop<-"gb"

ggplot(predicted.gbay,aes(x=temp,y=cal.length))+geom_line(aes(x=temp,y=cal.length))+
  ylab("Shell Length (mm)")+xlab("Common Garden Temperature (°C)")

summary(seg.gbay)
breakpts<-data.frame(matrix(,nrow=1,ncol=4))
colnames(breakpts)<-c("brkptx","brkpty","x_err","y_err")

breakpts[1,1]<-seg.gbay$psi[[2]]
breakpts[1,2]<-(seg.gbay$psi[[2]]*coef(seg.gbay)[[2]])+(coef(seg.gbay)[[1]])
breakpts[1,3]<-seg.gbay$psi[[3]]

breakpts此数据集非常小,因此,如果您事先不知道更改点在哪里,则该数据集是不明确的。大多数现有的包只识别一个变更点,而没有量化它们通常奇怪的分布

我认为
mcp
包满足了您的需求。简单地说,您可以对后跟连接坡度的直线进行建模:

model = list(
  cal.length ~ 1 + temp,  # Line with intercept
  ~ 0 + temp  # Joined slope
)
现在让我们来适应它
family=gaussian()
是隐式的。请注意,我设置了大量迭代和并行处理,因为在这种情况下,更改点的位置非常难以识别,因此需要进行大量工作来探索后面的问题:

library(mcp)
fit = mcp(model, data = gbay, iter = 100000, cores = 3)
plot(fit, q_fit = T, q_predict = T)
默认曲线图显示估计变化点的后验曲线(蓝线)。我们可以添加拟合区间(红色)和预测区间(绿色)。灰色线是来自后部的25个随机样本:

library(mcp)
fit = mcp(model, data = gbay, iter = 100000, cores = 3)
plot(fit, q_fit = T, q_predict = T)

如您所见,变化点的后部是双峰的。您还可以调用
plot\u pars(fit)
summary(fit)
查看有关各个参数的更多详细信息。如果要测试最早模式与第二模式的证据,可以使用
假设(fit,“cp_1<25”)
。如果您对可靠坡度、变更点位置等有先验知识,则可以使用,例如,
mcp(model,gbay,prior=list(cp_1=“dunif(0,25)”)
轻松添加


在和中阅读有关mcp的更多信息,包括安装说明。免责声明:我是
mcp

一些可能的澄清的作者:(1)
gbay$pop
未使用,因此您可以删除它,(2)记住
库(ggplot2)
库(分段)
,(3)无需执行
glm(…,family=gaussian())
。这与
lm(…)
(4)可能要弄清楚“y中的错误”是什么意思?更改点是x轴上的一个位置。是预测的y中的不确定性吗?