5

我正在使用 R 包segmented来计算模型的参数,其中响应变量与解释变量线性相关,直到一个断点,然后响应变量变得独立于解释变量。换句话说,第二部分的斜率 = 0 的分段线性模型。我已经做的是:

linear1 <- lm(Y ~ X)
linear2  <- segmented (linear1, seg.Z = ~ X, psi = 2)

这给出了一个具有非常好的第一行的模型,但第二行不是水平的(但不重要)。我想让第二行水平。(psi = 2 是我观察到断点的地方。)

此外,当我使用“abline”在绘图上显示虚线时,它只显示模型的第一部分,并给出警告:“仅使用 4 个回归系数中的前两个”。我怎样才能显示模型的两个部分?

要将我的数据输入到 R 中:

X <- c(0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0)
Y <- c(1.31, 1.60, 1.86, 2.16, 2.44, 2.71, 3.00, 3.24, 3.57, 3.81, 3.80, 3.83, 3.78, 3.94, 3.75, 3.89)
4

2 回答 2

2

这就像使用包提供的类对象的plot方法一样简单segmented,在帮助中分段和链接segmented

假设您的数据在data.frame d

linear2  <- segmented (linear1, seg.Z = ~ X, psi = 2, data = d)
plot(linear2)
points(Y~X, data = d)

在此处输入图像描述

一种伪造水平线的简单方法是将系数替换为该线水平所需的值

fudgedmodel <- linear2
fudgedmodel$coefficients[3] <- - fudgedmodel$coefficients[2]
plot(fudgedmodel)
points(Y~X, data = d)

在此处输入图像描述

于 2012-12-10T23:04:31.623 回答
1

在 R 帮助邮件列表中搜索相同的内容并在这篇文章中找到了一个简洁的答案:

https://stat.ethz.ch/pipermail/r-help/2007-July/137625.html

这是该答案的编辑版本,可直接解决问题:

library(segmented)

# simulate data - linear slope down until some point, at which slope=0
n<-50
x<-1:n/n
y<- 0-pmin(x-.5,0)+rnorm(50)*.03
plot(x,y) #This should be your scatterplot..
abline(0,0,lty=2)


# a parsimonious modelling: constrain right slope=0
# NB. This is probably what you want...
o<-lm(y~1)
xx<- -x
o2<-segmented(o,seg.Z=~xx,psi=list(xx=-.3))
slope(o2)
points(x,fitted(o2),col=2)


# now constrain \hat{\mu}(x)=0 for x>psi (you can do this if you know what the value of y is when x becomes independent)
o<-lm(y~0)
xx<- -x
o3<-segmented(o,seg.Z=~xx,psi=list(xx=-.3))
slope(o3)
points(x,fitted(o3),col=3)

你应该得到这样的东西。红点是第一种方法,听起来很适合你。绿点是第二种方法,仅当您已经知道 x 变得独立时的 y 值时才适用:

在此处输入图像描述

于 2014-02-17T01:56:20.127 回答