구간 별 회귀선 플로팅


10

lines각 세그먼트를 개별적으로 플롯 하는 데 사용 하거나을 사용 하는 것 이외의 조각 모델의 회귀선을 플로팅하는 방법이 geom_smooth(aes(group=Ind), method="lm", fill=FALSE)있습니까?

m.sqft <- mean(sqft)
model <- lm(price~sqft+I((sqft-m.sqft)*Ind))
# sqft, price: continuous variables, Ind: if sqft>mean(sqft) then 1 else 0

plot(sqft,price)
abline(reg = model)
Warning message:
In abline(reg = model) :
  only using the first two of 3regression coefficients

감사합니다.

답변:


6

이 작업을 쉽게 수행하는 방법을 아는 유일한 방법은 다양한 범위의 모델에서 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)plotlines메소드 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을 참조하십시오 .


@Gavin (+1) 나의 것보다 훨씬 더 완전한 반응; 난 그냥 좋아
chl

@Gavin "세그먼트 된 패키지를 통해"섹션이 내 데이터에서 작동하지 않았습니다. segmented명령 을 실행 한 후 "No breakpoint 추정"이 나타납니다 .
George Dontas

@ gd047 : 사과, 내가 보여준 코드에 오류가있었습니다. seq.Z응답과 세그먼트 화 된 관계가있는 변수의 일방 공식을 인수로 제공해야합니다 . 나는 당신 을 위해 값 seq.Z = ~ sqftsegmented선택 하는 것에 대한 메모 를 포함 하고 포함하도록 내 대답을 편집했습니다 psi.
개빈 심슨

@ gd047 원래 답변을 더 나은 방법으로 해결하므로 답변을 삭제하고 싶습니다. 내 대신 이것을 받아들이시겠습니까?
Chl

model<mf:argumentisnotinterpretableaslogicalInaddition:Warningmessage:Inif(model)objF
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.