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
, присваивая этому имени переменной.