これを簡単に行う方法を知っている唯一の方法は、モデル全体から予測を行い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)
これを単純な関数にコード化することができます。必要なのは、前の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
はこちらをご覧ください。