이 작업을 쉽게 수행하는 방법을 아는 유일한 방법은 다양한 범위의 모델에서 sqft예측하고 예측을 플로팅하는 것입니다. 일반적인 방법은 abline비슷 하지 않습니다 . 이러한 모델에 맞는 세그먼트 화 된 패키지를 살펴보고 플로팅 인프라를 제공 할 수도 있습니다.
예측 및 기본 그래픽을 통해이를 수행합니다. 먼저 일부 더미 데이터 :
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)
모형을 적합하십시오 :
mod <- lm(price~sqft+I((sqft-mean(sqft))*Ind), data = DF)
예측하고 예측할 데이터를 생성하십시오.
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))
회귀선을 플로팅합니다.
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)
이것을 간단한 함수로 코딩 할 수 있습니다-앞의 두 코드 덩어리의 단계 만 필요합니다. 대신에 사용할 수 있습니다 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)
}
그때:
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)
세그먼트 화 된 패키지를 통해
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")
이 데이터를 사용하면의 중단 점을 추정하지는 않지만 해당 패키지 mean(sqft)의 plot및 lines메소드 myabline는 적합 lm()모델 에서이 작업을 수행 하는 것보다 일반적인 것을 구현하는 데 도움이 될 수 있습니다 .
편집 : 분할하여 중단 점의 위치를 추정하려면 'psi'인수를 다음으로 설정하십시오 NA.
mod.s <- segmented(mod2, seg.Z = ~ sqft, psi = NA,
control = seg.control(stop.if.error = FALSE))
그런 segmented시도 할 것이다 K = 10의 분위수를 sqft함께 K설정되어 seg.control()와있는 기본값 10. 자세한 내용 ?seg.control을 참조하십시오 .