Satu-satunya cara saya tahu bagaimana melakukan ini dengan mudah adalah dengan memprediksi dari model di seluruh rentang sqft
dan merencanakan prediksi. Tidak ada cara umum dengan abline
atau serupa. Anda juga dapat melihat paket tersegmentasi yang sesuai dengan model ini dan menyediakan infrastruktur merencanakan untuk Anda.
Melakukan ini melalui prediksi dan gambar dasar. Pertama, beberapa data dummy:
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)
Sesuai dengan model:
mod <- lm(price~sqft+I((sqft-mean(sqft))*Ind), data = DF)
Hasilkan beberapa data untuk memprediksi dan memprediksi:
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))
Plot garis regresi:
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)
Anda bisa mengkodekannya menjadi fungsi sederhana - Anda hanya perlu langkah-langkah di dua bidak kode sebelumnya - yang bisa Anda gunakan sebagai pengganti 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)
}
Kemudian:
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)
Melalui paket tersegmentasi
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")
Dengan data ini ia tidak memperkirakan breakpoint mean(sqft)
, tetapi metode plot
dan lines
dalam paket itu mungkin membantu Anda menerapkan sesuatu yang lebih umum daripada myabline
melakukan pekerjaan ini untuk Anda langsung dari lm()
model yang sesuai .
Sunting: Jika Anda ingin disegmentasi untuk memperkirakan lokasi breakpoint, maka atur 'psi'
argumen ke NA
:
mod.s <- segmented(mod2, seg.Z = ~ sqft, psi = NA,
control = seg.control(stop.if.error = FALSE))
Kemudian segmented
akan mencoba K = 10
kuantil dari sqft
, dengan K
diset di seg.control()
dan yang defaultnya 10
. Lihat ?seg.control
lebih lanjut.