Код, который вы использовали, оценивает модель логистической регрессии, используя glm
функцию. Вы не включили данные, поэтому я просто сделаю некоторые.
set.seed(1234)
mydat <- data.frame(
won=as.factor(sample(c(0, 1), 250, replace=TRUE)),
bid=runif(250, min=0, max=1000)
)
mod1 <- glm(won~bid, data=mydat, family=binomial(link="logit"))
Модель логистической регрессии моделирует взаимосвязь между двоичной переменной ответа и, в этом случае, одним непрерывным предиктором. Результатом является логит-преобразованная вероятность как линейное отношение к предиктору. В вашем случае, результатом является двоичный ответ, соответствующий выигрышу или не выигрышу в азартной игре, и он прогнозируется значением ставки. Коэффициенты от mod1
приведены в зарегистрированных коэффициентах (которые трудно интерпретировать), согласно:
logit ( p ) = log( р( 1 - р )) = β0+ β1Икс1
Чтобы преобразовать зарегистрированные шансы в вероятности, мы можем перевести вышеприведенное в
р = эксп( β0+ β1Икс1)( 1 + опыт(β0+β1Икс1) )
Вы можете использовать эту информацию для настройки сюжета. Во-первых, вам нужен диапазон переменной предиктора:
plotdat <- data.frame(bid=(0:1000))
Затем, используя predict
, вы можете получить прогнозы на основе вашей модели
preddat <- predict(mod1, newdata=plotdat, se.fit=TRUE)
Обратите внимание, что установленные значения также можно получить через
mod1$fitted
Указав se.fit=TRUE
, вы также получите стандартную ошибку, связанную с каждым подобранным значением. В результате data.frame
получается матрица со следующими компонентами: подогнанные прогнозы ( fit
), предполагаемые стандартные ошибки ( se.fit
) и скалярный корень, дающий квадратный корень из дисперсии, используемой для вычисления стандартных ошибок ( residual.scale
). В случае биномиального логит значение будет 1 (который вы можете увидеть, введя preddat$residual.scale
в R
). Если вы хотите увидеть пример того, что вы уже рассчитали, вы можете напечатать head(data.frame(preddat))
.
Следующим шагом является настройка сюжета. Мне нравится сначала настраивать пустую область печати с параметрами:
with(mydat, plot(bid, won, type="n",
ylim=c(0, 1), ylab="Probability of winning", xlab="Bid"))
Теперь вы можете увидеть, где важно знать, как рассчитать подобранные вероятности. Вы можете нарисовать линию, соответствующую подобранным вероятностям, следуя второй формуле выше. С помощью preddat data.frame
вы можете преобразовать подогнанные значения в вероятности и использовать их для построения линии относительно значений вашей предикторной переменной.
with(preddat, lines(0:1000, exp(fit)/(1+exp(fit)), col="blue"))
Наконец, ответьте на свой вопрос, доверительные интервалы могут быть добавлены к графику путем расчета вероятности для подобранных значений, +/- 1.96
умноженных на стандартную ошибку:
with(preddat, lines(0:1000, exp(fit+1.96*se.fit)/(1+exp(fit+1.96*se.fit)), lty=2))
with(preddat, lines(0:1000, exp(fit-1.96*se.fit)/(1+exp(fit-1.96*se.fit)), lty=2))
Результирующий график (из случайно сгенерированных данных) должен выглядеть примерно так:
Ради целесообразности, вот весь код в одном куске:
set.seed(1234)
mydat <- data.frame(
won=as.factor(sample(c(0, 1), 250, replace=TRUE)),
bid=runif(250, min=0, max=1000)
)
mod1 <- glm(won~bid, data=mydat, family=binomial(link="logit"))
plotdat <- data.frame(bid=(0:1000))
preddat <- predict(mod1, newdata=plotdat, se.fit=TRUE)
with(mydat, plot(bid, won, type="n",
ylim=c(0, 1), ylab="Probability of winning", xlab="Bid"))
with(preddat, lines(0:1000, exp(fit)/(1+exp(fit)), col="blue"))
with(preddat, lines(0:1000, exp(fit+1.96*se.fit)/(1+exp(fit+1.96*se.fit)), lty=2))
with(preddat, lines(0:1000, exp(fit-1.96*se.fit)/(1+exp(fit-1.96*se.fit)), lty=2))
(Примечание. Это сильно отредактированный ответ в попытке сделать его более релевантным для stats.stackexchange.)