在R包“segmented”中,如何将模型中某一行的斜率设置为0?

时间:2012-12-10 22:45:12

标签: r plot linear linear-regression

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

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

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

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

我的数据看起来像

0.2 1.31

0.4 1.60

0.6 1.86

0.8 2.16

1.0 2.44

1.2 2.71

1.4 3.00

1.6 3.24

1.8 3.57

2.0 3.81

2.5 3.80

3.0 3.83

3.5 3.78

4.0 3.94

4.5 3.75

5.0 3.89

将数据输入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)

2 个答案:

答案 0 :(得分:1)

这就像在plot

的帮助中分段和链接的包提供的segmented类对象一样简单segmented方法

假设您的数据位于data.frame d

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

enter image description here

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

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

enter image description here

答案 1 :(得分:0)

在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的值时才适用:

enter image description here