Стандартная ошибка наклона в кусочно-линейной регрессии с известными точками останова

9

Ситуация

У меня есть набор данных с одной зависимой и одной независимой переменной . Я хочу согласовать непрерывную кусочно-линейную регрессию с известными / фиксированными точками останова, возникающими в . Точки останова известны без неопределенности, поэтому я не хочу их оценивать. Затем я подгоняю регрессию (OLS) в форме Вот примерx k ( a 1 , a 2 , , a k ) y i = β 0 + β 1 x i + β 2 max ( x i - a 1 , 0 ) + β 3 max ( x i - a 2 , 0 ) + + Β k + 1 max ( xYИксК(a1,a2,...,aК)

Yязнак равноβ0+β1Икся+β2Максимум(Икся-a1,0)+β3Максимум(Икся-a2,0)+...+βК+1Максимум(Икся-aК,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)

Давайте предположим, что точка останова происходит в :К19,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. Как проверить, имеют ли два соседних уклона одинаковые уклоны (т. Е. Можно ли пропустить точку останова)?
COOLSerdash
источник

Ответы:

7
  1. Как легко рассчитать точку пересечения и уклон каждого отрезка?

Иксзнак равно15-1,1003+1,3760знак равно0,2757,

Перехват немного сложнее, но это линейная комбинация коэффициентов (включая узлы).

Иксзнак равно9,621,7057-1,1003×9,6знак равно11,1428(9,6,11,428)0,275711,1428-0,2757×9,6знак равно8,496β0-β2К1знак равно21,7057-1,3760×9,6

Можно ли перенастроить модель, чтобы сделать это за один расчет?

Ну да, но в целом, вероятно, проще просто вычислить его по модели.

2. Как рассчитать стандартную ошибку каждого наклона каждого сегмента?

aβ^aaVar(β^)a

Например, в вашем примере стандартная ошибка наклона второго сегмента:

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 для теста, согласно которому второй сегмент имеет тот же наклон, что и первый, находится прямо в конце этой линии.

Glen_b - Восстановить Монику
источник
(+1) Спасибо Глену за ваш ответ. Только один маленький вопрос относительно # 2: в моем примере мне понадобится матрица дисперсии-ковариации xи I(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 ** 

Но я не уверен, что статистика (в частности, степени свободы) сделаны правильно, если вы делаете это таким образом.

Roland
источник
(+1) Большое спасибо за ваш ответ. Это обеспечивает очень удобный способ непосредственного вычисления перехватов и уклонов, спасибо!
COOLSerdash