web-dev-qa-db-ja.com

ggplot2:ロジスティック回帰-確率と回帰直線をプロット

連続予測子と二分応答変数を含むdata.frameがあります。

_> head(df)
  position response
1        0        1
2        3        1
3       -4        0
4       -1        0
5       -2        1
6        0        0
_

glm()- functionを使用して、ロジスティック回帰を簡単に計算できます。この時点まで問題はありません。

次に両方の経験的確率を含むggplotでプロットを作成します全体の11の予測値のそれぞれについておよびフィットされた回帰直線

私は先に進んでcast()で確率を計算し、それらを別のdata.frameに保存しました

_> probs
   position   prob
1        -5 0.0500
2        -4 0.0000
3        -3 0.0000
4        -2 0.2000
5        -1 0.1500
6         0 0.3684
7         1 0.4500
8         2 0.6500
9         3 0.7500
10        4 0.8500
11        5 1.0000
_

確率をプロットしました:

_p <- ggplot(probs, aes(x=position, y=prob)) + geom_point()
_

しかし、フィットした回帰直線を追加しようとすると

_p <- p + stat_smooth(method="glm", family="binomial", se=F)
_

警告を返します:_non-integer #successes in a binomial glm!_。 _stat_smooth_を「正しく」プロットするためには、元のdfデータで二分変数を使用して呼び出す必要があることを知っています。ただし、ggplot()dfdataを使用すると、確率をプロットする方法がわかりません。

確率と回帰直線を1つのプロットに組み合わせるにはどうすればよいですか、これはggplot2内にあることを意図した方法で、つまり警告やエラーメッセージを取得せずに?

16
vincentqu

基本的に3つのソリューションがあります。

Data.framesのマージ

データを2つの別々のdata.framesに格納した後の最も簡単な方法は、positionによってそれらをマージすることです。

mydf <- merge( mydf, probs, by="position")

次に、このdata.frameggplotを警告なしで呼び出すことができます。

ggplot( mydf, aes(x=position, y=prob)) +
  geom_point() +
  geom_smooth(method = "glm", 
    method.args = list(family = "binomial"), 
    se = FALSE) 

enter image description here

2つのdata.framesの作成を回避する

将来的には、後でマージする必要がある2つの個別のdata.framesの作成を直接回避できます。個人的には、そのためにplyrパッケージを使用するのが好きです:

librayr(plyr)
mydf <- ddply( mydf, "position", mutate, prob = mean(response)  )

編集:レイヤーごとに異なるデータを使用する

レイヤーごとに別のdata.frameを使用できるということを忘れていました。これはggplot2の大きな利点です。

ggplot( probs, aes(x=position, y=prob)) +
  geom_point() +
  geom_smooth(data = mydf, aes(x = position, y = response),
    method = "glm", method.args = list(family = "binomial"), 
    se = FALSE)

追加のヒントとして:組み込み関数stats::dfをこの変数名に割り当てることでオーバーライドするため、変数名dfの使用を避けます。

17
Beasterfield