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


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

Ответы:


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


(+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 ** 

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


(+1) Большое спасибо за ваш ответ. Это обеспечивает очень удобный способ непосредственного вычисления перехватов и уклонов, спасибо!
COOLSerdash
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.