Seu modelo assume que o sucesso de um ninho pode ser visto como uma aposta: Deus joga uma moeda carregada com os lados rotulados como "sucesso" e "fracasso". O resultado do flip para um ninho é independente do resultado do flip para qualquer outro ninho.
Os pássaros têm algo a seu favor: a moeda pode favorecer muito o sucesso em algumas temperaturas em comparação com outras. Assim, quando você tem a chance de observar ninhos em uma determinada temperatura, o número de sucessos é igual ao número de lançamentos bem-sucedidos da mesma moeda - aquele para essa temperatura. A distribuição binomial correspondente descreve as chances de sucesso. Ou seja, estabelece a probabilidade de zero sucesso, de um, de dois, ... e assim por diante, através do número de ninhos.
Uma estimativa razoável da relação entre a temperatura e como Deus carrega as moedas é dada pela proporção de sucessos observados nessa temperatura. Esta é a estimativa de máxima verossimilhança (MLE).
71033 / 7.3 / 73
5 , 10 , 15 , 200 , 3 , 2 , 32 , 7 , 5 , 3
A linha superior da figura mostra os MLEs em cada uma das quatro temperaturas observadas. A curva vermelha no painel "Ajustar" mostra como a moeda é carregada, dependendo da temperatura. Por construção, esse rastreamento passa por cada um dos pontos de dados. (O que faz em temperaturas intermediárias é desconhecido; conectei os valores bruscamente para enfatizar esse ponto.)
Esse modelo "saturado" não é muito útil, precisamente porque não nos dá base para estimar como Deus carregará as moedas em temperaturas intermediárias. Para fazer isso, precisamos supor que exista algum tipo de curva de "tendência" que relacione o carregamento de moedas com a temperatura.
A linha inferior da figura se encaixa nessa tendência. A tendência é limitada no que pode ser feito: quando plotada nas coordenadas apropriadas ("probabilidades de log"), conforme mostrado nos painéis "Logit Response" à esquerda, ela pode seguir apenas uma linha reta. Qualquer linha reta determina o carregamento da moeda em todas as temperaturas, como mostra a linha curva correspondente nos painéis "Ajustar". Esse carregamento, por sua vez, determina as distribuições binomiais em todas as temperaturas. A linha inferior representa essas distribuições para as temperaturas em que os ninhos foram observados. (As linhas pretas tracejadas marcam os valores esperados das distribuições, ajudando a identificá-las com bastante precisão. Você não vê essas linhas na linha superior da figura porque coincidem com os segmentos vermelhos.)
Agora é preciso fazer uma troca: a linha pode passar de perto para alguns pontos de dados, apenas para se afastar de outros. Isso faz com que a distribuição binomial correspondente atribua probabilidades mais baixas à maioria dos valores observados do que antes. Você pode ver isso claramente em 10 e 15 graus: a probabilidade dos valores observados não é a maior probabilidade possível, nem se aproxima dos valores atribuídos na linha superior.
A regressão logística desliza e move as possíveis linhas ao redor (no sistema de coordenadas usado pelos painéis "Logit Response"), converte suas alturas em probabilidades binomiais (os painéis "Ajustar"), avalia as chances atribuídas às observações (os quatro painéis à direita) ) e escolhe a linha que oferece a melhor combinação dessas chances.
O que e melhor"? Simplesmente que a probabilidade combinada de todos os dados é a maior possível. Dessa maneira, nenhuma probabilidade única (os segmentos vermelhos) pode ser verdadeiramente minúscula, mas geralmente a maioria das probabilidades não será tão alta quanto no modelo saturado.
Aqui está uma iteração da pesquisa de regressão logística em que a linha foi girada para baixo:
1015graus, mas um trabalho terrível de ajustar os outros dados. (A 5 e 20 graus, as probabilidades binomiais atribuídas aos dados são tão pequenas que você nem consegue ver os segmentos vermelhos.) No geral, esse ajuste é muito pior do que o mostrado na primeira figura.
Espero que esta discussão tenha ajudado a desenvolver uma imagem mental das probabilidades binomiais mudando conforme a linha varia, mantendo o mesmo tempo os dados. O ajuste da linha pela regressão logística tenta tornar essas barras vermelhas o mais alto possível. Assim, a relação entre regressão logística e a família de distribuições binomiais é profunda e íntima.
Apêndice: R
código para produzir as figuras
#
# Create example data.
#
X <- data.frame(temperature=c(5,10,15,20),
nests=c(2,7,5,3),
successes=c(0,3,2,3))
#
# A function to plot a Binomial(n,p) distribution and highlight the value `k0`.
#
plot.binom <- function(n, p, k0, highlight="#f02020", ...) {
plot(0:n, dbinom(0:n, n, p), type="h", yaxt="n",
xlab="Trials", ylab="Probability", ...)
abline(v = p*n, lty=3, lwd=2)
if(!missing(k0)) lines(rep(k0,2), c(0, dbinom(k0,n,p)), lwd=2, col=highlight)
}
#
# A function to convert from probability to log odds.
#
logit <- function(p) log(p) - log(1-p)
#
# Fit a saturated model, then the intended model.
#
# Ordinarily the formula for the saturated model would be in the form
# `... ~ factor(temperature)`, but the following method makes it possible to
# plot the predicted values in a visually effective way.
#
fit.0 <- glm(cbind(successes, nests-successes) ~ factor(round(temperature/5)),
data=X, family=binomial)
summary(fit.0)
fit <- glm(cbind(successes, nests-successes) ~ temperature,
data=X, family=binomial)
summary(fit)
#
# Plot both fits, one per row.
#
lfits <- list(fit.0, fit)
par.old <- par(mfrow=c(length(lfits), nrow(X)+2))
for (fit in lfits) {
#
# Construct arrays of plotting points.
#
X$p.hat <- predict(fit, type="response")
Y <- data.frame(temperature = seq(min(X$temperature), max(X$temperature),
length.out=101))
Y$p.hat <- predict(fit, type="response", newdata=Y) # Probability
Y$lambda.hat <- predict(fit, type="link", newdata=Y) # Log odds
#
# Plot the fit in terms of log odds.
#
with(Y, plot(temperature, lambda.hat, type="n",
yaxt="n", bty="n", main="Logit Response",
ylab=expression(hat(lambda))))
if (isTRUE(diff(range(Y$lambda.hat)) < 6)) {
# Draw gridlines and y-axis labels
p <- c( .10, .25, .5, .75, .9)
q <- logit(p)
suppressWarnings(rug(q, side=2))
abline(h=q, col="#d0d0d0")
mtext(signif(p, 2), at=q, side=2, cex=0.6)
}
with(Y, lines(temperature, lambda.hat, lwd=2, col="#f02020"))
#
# Plot the data and the fit in terms of probability.
#
with(X, plot(temperature, successes/nests, ylim=0:1,
cex=sqrt(nests), pch=21, bg="Gray",
main="Fit"))
with(Y, lines(temperature, p.hat, col="#f02020", lwd=2))
#
# Plot the Binomial distributions associated with each row of the data.
#
apply(X, 1, function(x) plot.binom(x[2], x[4], x[3], bty="n", lwd=2, col="Gray",
main=paste(x[1], "Degrees")))
}
par(mfrow=par.old)