区分的回帰直線のプロット


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)

これを単純な関数にコード化することができます。必要なのは、前の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はこちらをご覧ください。


@Gavin(+1)私よりはるかに完全な応答。私はそれが好きです。
chl

@Gavin「セグメント化されたパッケージを介して」セクションがデータに対して機能しませんでした。segmentedコマンドを実行した後、「ブレークポイントは推定されませんでした」と表示されました。
George Dontas、2011年

@ gd047:お詫び、私が示したコードにエラーがありました。seq.Z応答とセグメント化された関係を持つ変数の片側式で引数を指定する必要があります。回答を編集して、値seq.Z = ~ sqftsegmented選択してもらうことに関するメモを追加しましたpsi
モニカの復活-G.シンプソン

@ gd047これは元の質問をより適切に解決するため、私の回答を削除したいと思います。私の代わりにこれを受け入れてもらえますか?
2011年

@chlもちろん、まだエラーが発生しますが、if(model)objF -mfのエラーモデル<:条件長さ> 1で、最初の要素のみが使用されますmodel<mf:argumentisnotinterpretableaslogicalInaddition:Warningmessage:Inif(model)objF
George Dontas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.