Расчет кусочно-квантильной линейной регрессии с сегментированным пакетом R - PullRequest
3 голосов
/ 14 февраля 2020

Я ищу способ получить кусочно-квантильную линейную регрессию с помощью R. Я смог вычислить квантильную регрессию с помощью пакета quantreg. Тем не менее, я не хочу только один уникальный уклон, но хочу проверить точки останова в моем наборе данных. Я видел, что пакет segmented может это сделать. Хотя он работает хорошо, если подгонка выполняется с lm или glm (как показано ниже в примере), он не может работать для квантиля.

В информации о пакете segmented я прочитал, что существует segmented.default, который можно использовать для конкретных c регрессионных моделей, таких как Quantiles. Однако, когда я применяю это для моего квантильного результата, это дает мне следующие ошибки:

Ошибка в diag (vv): недопустимое значение 'nrow' (слишком большое или NA) Кроме того: Предупреждение: не могу вычислить ковариационную матрицу

Если вместо использования K = 2 я использую, например, пси, я получаю другие типы ошибок:

Ошибка в rq.fit.br ( x, y, tau = tau, ...): матрица единственного дизайна

Я создал пример с данными mtcars, чтобы вы могли видеть ошибки, которые я получаю.

library(quantreg)
library(segmented)

data(mtcars)

out.rq <- rq(mpg ~ wt, data= mtcars)
out.lm <- lm(mpg ~ wt, data= mtcars)

# Plotting the results
plot(mpg ~ wt, data = mtcars, pch = 1, main = "mpg ~ wt") 
abline(out.lm, col = "red", lty = 2)
abline(out.rq, col = "blue", lty = 2)
legend("topright", legend = c("linear", "quantile"), col = c("red", "blue"), lty = 2)

#Generating segmented LM
o <- segmented(out.lm, seg.Z= ~wt, npsi=2, control=seg.control(display=FALSE))  
plot(o, lwd=2, col=2:6, main="Segmented regression", res=FALSE) #lwd: line width #col: from 2 to 6 #RES: show datapoints

#Generating segmented Quantile
#using K=2
o.quantile <- segmented.default(out.rq, seg.Z= ~wt, control=seg.control(display=FALSE, K=2))  
# using psi
o.quantile <- segmented.default(out.rq, seg.Z= ~wt, psi=list(wt=c(2,4)), control=seg.control(display=FALSE))  
...