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])

Antworten auf die Frage(4)

Ihre Antwort auf die Frage