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() -функции, никаких проблем до этой точки.

Далее, Я хочу создать график с 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 с дихотомической переменной. Однако, если я использую данные df в ggplot(), я не вижу возможности строить вероятности.

Как я могу объединить вероятности и линию регрессии на одном графике, как это было в ggplot2, т.е. без каких-либо предупреждений или сообщений об ошибках?

Ответ 1

В основном есть три решения:

Слияние данных. кадры

Самый простой, после того, как ваши данные в двух отдельных data.frame состоят в их объединении на position:

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

Затем вы можете вызвать ggplot на этом data.frame без предупреждений:

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

enter image description here

Избегайте создания двух data.frames

В будущем вы можете напрямую избежать создания двух отдельных 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)

В качестве дополнительного подсказки: избегайте использования имени переменной df, поскольку вы переопределяете встроенную функцию stats::df, присваивая этому имени переменной.