Der einzige Weg, wie ich dies leicht tun kann, besteht darin, aus dem Modell über den gesamten Bereich hinweg sqft
Vorhersagen zu treffen und die Vorhersagen zu zeichnen. Es gibt keinen allgemeinen Weg mit abline
oder ähnlich. Sie können sich auch das segmentierte Paket ansehen , das zu diesen Modellen passt, und die Plotinfrastruktur für Sie bereitstellen.
Dies geschieht über Vorhersagen und Basisgrafiken. Zunächst einige Dummy-Daten:
set.seed(1)
sqft <- runif(100)
sqft <- ifelse((tmp <- sqft > mean(sqft)), 1, 0) + rnorm(100, sd = 0.5)
price <- 2 + 2.5 * sqft
price <- ifelse(tmp, price, 0) + rnorm(100, sd = 0.6)
DF <- data.frame(sqft = sqft, price = price,
Ind = ifelse(sqft > mean(sqft), 1, 0))
rm(price, sqft)
plot(price ~ sqft, data = DF)
Passen Sie das Modell an:
mod <- lm(price~sqft+I((sqft-mean(sqft))*Ind), data = DF)
Generieren Sie einige Daten, um sie vorherzusagen und vorherzusagen:
m.sqft <- with(DF, mean(sqft))
pDF <- with(DF, data.frame(sqft = seq(min(sqft), max(sqft), length = 200)))
pDF <- within(pDF, Ind <- ifelse(sqft > m.sqft, 1, 0))
pDF <- within(pDF, price <- predict(mod, newdata = pDF))
Zeichnen Sie die Regressionslinien:
ylim <- range(pDF$price, DF$price)
xlim <- range(pDF$sqft, DF$sqft)
plot(price ~ sqft, data = DF, ylim = ylim, xlim = xlim)
lines(price ~ sqft, data = pDF, subset = Ind > 0, col = "red", lwd = 2)
lines(price ~ sqft, data = pDF, subset = Ind < 1, col = "red", lwd = 2)
Sie können dies in eine einfache Funktion zerlegen - Sie benötigen nur die Schritte in den beiden vorhergehenden Codeblöcken -, die Sie anstelle von abline
:
myabline <- function(model, data, ...) {
m.sqft <- with(data, mean(sqft))
pDF <- with(data, data.frame(sqft = seq(min(sqft), max(sqft),
length = 200)))
pDF <- within(pDF, Ind <- ifelse(sqft > m.sqft, 1, 0))
pDF <- within(pDF, price <- predict(mod, newdata = pDF))
lines(price ~ sqft, data = pDF, subset = Ind > 0, ...)
lines(price ~ sqft, data = pDF, subset = Ind < 1, ...)
invisible(model)
}
Dann:
ylim <- range(pDF$price, DF$price)
xlim <- range(pDF$sqft, DF$sqft)
plot(price ~ sqft, data = DF, ylim = ylim, xlim = xlim)
myabline(mod, DF, col = "red", lwd = 2)
Über das segmentierte Paket
require(segmented)
mod2 <- lm(price ~ sqft, data = DF)
mod.s <- segmented(mod2, seg.Z = ~ sqft, psi = 0.5,
control = seg.control(stop.if.error = FALSE))
plot(price ~ sqft, data = DF)
plot(mod.s, add = TRUE)
lines(mod.s, col = "red")
Mit diesen Daten wird der Haltepunkt nicht geschätzt mean(sqft)
, aber die Methoden plot
und lines
in diesem Paket können Ihnen dabei helfen, etwas Allgemeineres myabline
zu implementieren, als diesen Job direkt vom angepassten lm()
Modell aus für Sie zu erledigen .
Bearbeiten: Wenn Sie segmentieren möchten, um die Position des Haltepunkts zu schätzen, setzen Sie das 'psi'
Argument auf NA
:
mod.s <- segmented(mod2, seg.Z = ~ sqft, psi = NA,
control = seg.control(stop.if.error = FALSE))
Dann segmented
werden K = 10
Quantile von versucht sqft
, K
wobei gesetzt wird seg.control()
und welche standardmäßig verwendet werden 10
. Weitere ?seg.control
Informationen finden Sie hier.
segmented
Befehls wurde "Kein Haltepunkt geschätzt" angezeigt.seq.Z
mit einer einseitigen Formel der Variablen angeben, die eine segmentierte Beziehung zur Antwort haben. Ich habe meine Antwort so bearbeitet, dass sieseq.Z = ~ sqft
einen Hinweis enthält, dasssegmented
Sie Wertepsi
für Sie ausgewählt haben.