あなたのモデルは、巣の成功をギャンブルと見なすことができると仮定しています。神は、「成功」と「失敗」というラベルの付いたコインを装填しました。1つのネストのフリップの結果は、他のネストのフリップの結果とは無関係です。
しかし、鳥には何かがあります。コインは、他の温度と比較して、ある温度での成功を非常に好むかもしれません。したがって、特定の温度で巣を観察する機会がある場合、成功の数は同じコインの成功したフリップの数に等しくなります-その温度のためのものです。対応する二項分布は、成功の可能性を説明しています。つまり、成功の数がゼロ、1、2、…などの確率がネストの数を通じて確立されます。
温度と、神がコインを積む方法との関係の合理的な推定値は、その温度で観察された成功の割合によって与えられます。これは最尤推定値(MLE)です。
71033 / 73 / 73
5 、10 、15 、200 、3 、2 、32、7 、5 、3
図の一番上の行は、観測された4つの各温度でのMLEを示しています。 「Fit」パネルの赤い曲線は、温度に応じてコインがどのように装填されるかを示しています。構成上、このトレースは各データポイントを通過します。(中間温度で何をするかは不明です。この点を強調するために、値を大まかに接続しました。)
この「飽和」モデルは、神がどのように中間温度でコインを積み込むかを推定する根拠を与えないため、あまり有用ではありません。そのためには、コインの負荷を温度に関連付ける何らかの「傾向」曲線があると想定する必要があります。
図の一番下の行は、このような傾向に適合しています。 トレンドの機能には制限があります。左側の「Logit Response」パネルに示されているように、適切な(「ログオッズ」)座標でプロットすると、直線のみに従うことができます。「フィット」パネルの対応する曲線で示されるように、そのような直線はすべての温度でのコインの装填を決定します。その負荷は、すべての温度で二項分布を決定します。下の行は、巣が観察された温度の分布をプロットしています。(黒い破線は、分布の期待値をマークし、それらをかなり正確に識別するのに役立ちます。これらの線は、赤いセグメントと一致するため、図の一番上の行には表示されません。)
ここで、トレードオフを行う必要があります。線は一部のデータポイントに近づいて、他のデータポイントから遠ざかるだけです。これにより、対応する二項分布により、観測値のほとんどに以前よりも低い確率が割り当てられます。これは10度と15度ではっきりと確認できます。観測値の確率は、可能な限り高い確率ではなく、上の行に割り当てられた値に近いものでもありません。
ロジスティック回帰は、(「ロジット応答」パネルで使用される座標系で)可能な線をスライドおよびウィグルし、その高さを二項確率(「フィット」パネル)に変換し、観測に割り当てられた機会を評価します(右の4つのパネル)、およびそれらのチャンスの最適な組み合わせを提供する行を選択します。
「ベスト」とは何ですか? 単純に、すべてのデータの結合確率が可能な限り大きいこと。この方法では、単一の確率(赤いセグメント)を本当に小さくすることはできませんが、通常、ほとんどの確率は飽和モデルの場合ほど高くありません。
以下は、ロジスティック回帰検索の1つの反復で、行が下向きに回転されています。
1015度ですが、他のデータをフィッティングするというひどい仕事です。(5度と20度では、データに割り当てられた2項分布の確率は非常に小さいため、赤いセグメントは見えません。)全体として、これは最初の図に示したものよりもはるかに悪い適合です。
この議論が、データを同じに保ちながら、線が変化するにつれて変化する二項確率の精神的なイメージを開発するのに役立つことを願っています。ロジスティック回帰によるラインフィットは、これらの赤いバー全体を可能な限り高くしようとします。したがって、ロジスティック回帰と二項分布のファミリーとの関係は深く密接です。
付録:R
図を生成するコード
#
# 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)