具有已知断点的分段线性回归中斜率的标准误差


9

情况

我有一个具有一个因变量和一个独立变量的数据集。我想用出现在已知/固定断点拟合连续分段线性回归。已知breakpoins没有不确定性,所以我不想估计它们。然后,我拟合以下形式的回归(OLS): 这是ÿXķ一个1个一个2一个ķ

ÿ一世=β0+β1个X一世+β2最高X一世-一个1个0+β3最高X一世-一个20++βķ+1个最高X一世-一个ķ0+ϵ一世
R
set.seed(123)
x <- c(1:10, 13:22)
y <- numeric(20)
y[1:10] <- 20:11 + rnorm(10, 0, 1.5)
y[11:20] <- seq(11, 15, len=10) + rnorm(10, 0, 2)

假设断点出现在:ķ1个9.6

mod <- lm(y~x+I(pmax(x-9.6, 0)))
summary(mod)

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)          21.7057     1.1726  18.511 1.06e-12 ***
x                    -1.1003     0.1788  -6.155 1.06e-05 ***
I(pmax(x - 9.6, 0))   1.3760     0.2688   5.120 8.54e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

两个线段的截距和斜率分别为:第一个为和,第二个为和。21.7-1.18.50.27

断点


问题

  1. 如何轻松计算每个线段的截距和斜率?可以通过一次计算对模型进行重新模型化吗?
  2. 如何计算每段斜率的标准误差?
  3. 如何测试两个相邻的斜率是否具有相同的斜率(即是否可以省略断点)?

Answers:


7
  1. 如何轻松计算每个线段的截距和斜率?

通过简单地将所有系数加到当前位置即可计算出每个段的斜率。所以斜率估计为X=15-1.1003+1.3760=0.2757

截距比较难,但是它是系数的线性组合(涉及结)。

在您的示例中,第二行与第一行在 X=9.6,所以红点在的第一行 21.7057-1.1003×9.6=11.1428。由于第二条线穿过该点9.611.428 带坡度 0.2757,其截距为 11.1428-0.2757×9.6=8.496。当然,您可以将这些步骤放在一起,并简化到第二段的截距=β0-β2ķ1个=21.7057-1.3760×9.6

可以将模型重新参数化以一次计算吗?

好的,是的,但是通常从模型中进行计算通常会更容易。

2.如何计算每段斜率的标准误差?

由于估计是回归系数的线性组合 一个β^,在哪里 一个 由1和0组成,方差为 一个Varβ^一个。标准误差是方差和协方差项之和的平方根。

例如,在您的示例中,第二段斜率的标准误差为:

Sb <- vcov(mod)[2:3,2:3]
sqrt(sum(Sb))

或者以矩阵形式:

Sb <- vcov(mod)
a <- matrix(c(0,1,1),nr=3)
sqrt(t(a) %*% Sb %*% a)

3.如何测试两个相邻的斜率是否具有相同的斜率(即是否可以省略断点)?

通过查看该段表中的系数进行测试。看到这一行:

I(pmax(x - 9.6, 0))   1.3760     0.2688   5.120 8.54e-05 ***

那就是9.6处的斜率变化。如果该变化不同于0,则两个斜率不相同。因此,第二段与第一段具有相同斜率的测试的p值就在该行的末尾。


(+1)感谢Glen的回答。只是一个关于#2的小问题:在我的例子,我需要的方差-协方差矩阵xI(pmax(x-9.6,0)),是正确的?
COOLSerdash

否。我根据您的示例编辑了一个明确的示例。如果您需要更多详细信息,请询问。
Glen_b-恢复莫妮卡

非常感谢您所做的编辑,这对我来说很清楚。因此,我是否正确理解:每个斜率的标准误差都相同?
COOLSerdash

1
否。过程相同,但值不同。第一部分斜率的标准误差在回归表(0.1788)中。第二段斜率的标准误差为0.1160。如果我们有第三段,它的总和将包含更多方差-协方差项(在取平方根之前)。
Glen_b-恢复莫妮卡

6

我的幼稚方法可以回答问题1:

mod2 <- lm(y~I((x<9.6)*x)+as.numeric((x<9.6))+
             I((x>=9.6)*x)+as.numeric((x>=9.6))-1)
summary(mod2)

#                        Estimate Std. Error t value Pr(>|t|)    
# I((x < 9.6) * x)        -1.1040     0.2328  -4.743 0.000221 ***
# as.numeric((x < 9.6))   21.7188     1.3099  16.580 1.69e-11 ***
# I((x >= 9.6) * x)        0.2731     0.1560   1.751 0.099144 .  
# as.numeric((x >= 9.6))   8.5442     2.6790   3.189 0.005704 ** 

但是我不确定统计信息(特别是自由度)是否正确完成(如果您这样做)。


(+1)非常感谢您的回答。它提供了一种非常方便的方法来直接计算截距和斜率,谢谢!
COOLSerdash
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.