web-dev-qa-db-ja.com

ラティスパッケージのxyplot()を使用して、線形回帰から観測値と近似値をプロットします。

簡単なグラフを作成できます。同じグラフで(線形回帰から)観測値と予測値を取得したいと思います。 Yvariable vs Xvariableと言ってプロットしています。予測子は1つ、応答は1つだけです。同じグラフに線形回帰曲線を追加するにはどうすればよいですか?

したがって、結論として、次のような支援が必要です。

  • 実績のプロットと両方の予測
  • 回帰直線のプロット
5
user2543622

これは、ポイントとしての単一プロットの観測値と予測値の1つのオプションです。 2番目に説明する観測点の回帰直線を取得する方が簡単です。

最初にいくつかのダミーデータ

set.seed(1)
x <- runif(50)
y <- 2.5 + (3 * x) + rnorm(50, mean = 2.5, sd = 2)
dat <- data.frame(x = x, y = y)

モデルに合わせる

mod <- lm(y ~ x, data = dat)

モデルの出力と観測されたxをplottの単一のオブジェクトに結合します

res <- stack(data.frame(Observed = dat$y, Predicted = fitted(mod)))
res <- cbind(res, x = rep(dat$x, 2))
head(res)

格子をロードしてプロット

require("lattice")

xyplot(values ~ x, data = res, group = ind, auto.key = TRUE)

結果のプロットは次のようになります

enter image description here

観測データの回帰直線だけを取得し、回帰モデルが私が示すもののような単純な直線モデルである場合、これのほとんどを回避し、を使用してプロットすることができます

xyplot(y ~ x, data = dat, type = c("p","r"), col.line = "red")

(つまり、モデルを適合させたり、プロットのために新しいデータを作成したりする必要はありません)

結果のプロットは次のようになります

enter image description here

回帰直線の係数を与えるもので使用できる最初の例の代わりに、独自のパネル関数を作成することもできます。見た目ほど怖くはありません。

xyplot(y ~ x, data = dat, col.line = "red",
       panel = function(x, y, ...) {
         panel.xyplot(x, y, ...)
         panel.abline(coef = coef(mod), ...) ## using mod from earlier
       }
      )

これにより、上記の図2のプロットが得られますが、手作業で行われます。

キャレットでこれを行ったと仮定すると

mod <- train(y ~ x, data = dat, method = "lm",
             trControl = trainControl(method = "cv"))

xyplot(y ~ x, data = dat, col.line = "red",
       panel = function(x, y, ...) {
         panel.xyplot(x, y, ...)
         panel.abline(coef = coef(mod$finalModel), ...) ## using mod from caret
       }
      )

上記の図2と同じプロットが生成されます。

もう1つのオプションは、latticeExtraからpanel.lmlineqを使用することです。

library(latticeExtra)
set.seed(0)
xsim <- rnorm(50, mean = 3)
ysim <- (0 + 2 * xsim) * (1 + rnorm(50, sd = 0.3))

## basic use as a panel function
xyplot(ysim ~ xsim, panel = function(x, y, ...) {
  panel.xyplot(x, y, ...)
  panel.lmlineq(x, y, adj = c(1,0), lty = 1,xol.text='red',
                col.line = "blue", digits = 1,r.squared =TRUE)
})

enter image description here

3
agstudy