tückweise Regression mit einer geraden Linie und einer horizontalen Linie, die sich an einem Haltepunkt verbinde
Ich möchte eine stückweise lineare Regression mit einem Haltepunkt durchführen, wobei die 2. Hälfte der Regressionsgeraden @ haslope = 0
. Es gibt Beispiele für eine stückweise lineare Regression, z. B.Hie. Das Problem, das ich habe, ist, dass mir nicht klar ist, wie ich die Neigung der Hälfte des Modells auf 0 festlegen kann.
Ich habe es versuch
lhs <- function(x) ifelse(x < k, k-x, 0)
rhs <- function(x) ifelse(x < k, 0, x-k)
fit <- lm(y ~ lhs(x) + rhs(x))
wok
ist der Haltepunkt, aber das rechte Segment ist nicht flach / horizontal.
Ich möchte die Steigung des zweiten Segments auf 0 begrenzen. Ich habe versucht:
fit <- lm(y ~ x * (x < k) + x * (x > k))
aber nochmal, ich bin mir nicht sicher, wie ich die zweite Hälfte dazu bringen kann, eine Steigung von Null zu erreichen.
Jede Hilfe wird sehr geschätzt.
Meine eigene Lösung
Ich habe eine Lösung dank des Kommentars unten. Hier ist der Code, mit dem ich die Anpassung optimiere und dann plotte:
x <- c(1, 2, 3, 1, 2, 1, 6, 1, 2, 3, 2, 1, 4, 3, 1)
y <- c(0.041754212, 0.083491254, 0.193129615, 0.104249201, 0.17280516,
0.154342335, 0.303370501, 0.025503008, 0.123934121, 0.191486527,
0.183958737, 0.156707866, 0.31019215, 0.281890206, 0.25414608)
range_x <- max(x) - min(x)
intervals <- 1000
coef1 <- c()
coef2 <- c()
r2 <- c()
for (i in 1:intervals) {
k <- min(x) + (i-1) * (range_x / intervals)
x2 = (x - k) * (x < k)
fit <- lm(y ~ x2)
coef1[i] <- summary(fit)$coef[1]
coef2[i] <- summary(fit)$coef[2]
r2[i] <- summary(fit)$r.squared
}
best_r2 <- max(r2) # get best r squared
pos <- which.max(r2)
best_k <- min(x) + (pos - 1) * (range_x / intervals)
plot(x, y)
curve(coef1[pos] - best_k * coef2[pos] + coef2[pos] * x,
from=min(x), to=best_k, add = TRUE)
segments(best_k, coef1[pos], max(x), coef1[pos])