Cách duy nhất tôi biết làm thế nào để thực hiện điều này một cách dễ dàng là dự đoán từ mô hình trên phạm vi sqft
và vẽ đồ thị dự đoán. Không có một cách chung nào với abline
hoặc tương tự. Bạn cũng có thể xem gói được phân đoạn sẽ phù hợp với các mô hình này và cung cấp cơ sở hạ tầng âm mưu cho bạn.
Làm điều này thông qua dự đoán và đồ họa cơ sở. Đầu tiên, một số dữ liệu giả:
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)
Phù hợp với mô hình:
mod <- lm(price~sqft+I((sqft-mean(sqft))*Ind), data = DF)
Tạo một số dữ liệu để dự đoán và dự đoán:
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))
Vẽ các đường hồi quy:
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)
Bạn có thể mã hóa hàm này thành một hàm đơn giản - bạn chỉ cần các bước trong hai đoạn mã trước - mà bạn có thể sử dụng thay cho 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)
}
Sau đó:
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)
Qua gói phân khúc
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")
Với những dữ liệu này, nó không ước tính điểm dừng tại mean(sqft)
, nhưng các phương thức plot
và lines
trong gói đó có thể giúp bạn thực hiện một cái gì đó chung chung hơn là myabline
thực hiện công việc này cho bạn diretcly từ lm()
mô hình được trang bị .
Chỉnh sửa: Nếu bạn muốn phân đoạn để ước tính vị trí của điểm dừng, sau đó đặt 'psi'
đối số thành NA
:
mod.s <- segmented(mod2, seg.Z = ~ sqft, psi = NA,
control = seg.control(stop.if.error = FALSE))
Sau đó segmented
sẽ thử định K = 10
lượng sqft
, với K
việc được đặt seg.control()
và mặc định 10
. Xem ?seg.control
để biết thêm.