आपका मॉडल मानता है कि एक घोंसले की सफलता को एक जुआ के रूप में देखा जा सकता है: भगवान "सफलता" और "विफलता" लेबल वाले पक्षों के साथ एक लोड किए गए सिक्के को फहराता है। एक घोंसले के लिए फ्लिप का परिणाम किसी अन्य घोंसले के लिए फ्लिप के परिणाम से स्वतंत्र है।
पक्षियों के पास उनके लिए कुछ चल रहा है, हालांकि: सिक्का दूसरों की तुलना में कुछ तापमान पर सफलता का पक्ष ले सकता है। इस प्रकार, जब आपके पास किसी दिए गए तापमान पर घोंसले का निरीक्षण करने का मौका होता है, तो सफलताओं की संख्या एक ही सिक्के के सफल flips की संख्या के बराबर होती है - उस तापमान के लिए एक। संबंधित द्विपद वितरण सफलताओं की संभावनाओं का वर्णन करता है। यही है, यह शून्य सफलताओं की संभावना स्थापित करता है, एक की, दो की, ... और इतने पर घोंसले की संख्या के माध्यम से।
तापमान और भगवान द्वारा सिक्कों के बीच संबंध का एक उचित अनुमान उस तापमान पर देखी गई सफलताओं के अनुपात से दिया गया है। यह अधिकतम संभावना अनुमान (MLE) है।
71033/7.3/73
5,10,15,200,3,2,32,7,5,3
चित्र की शीर्ष पंक्ति चार देखे गए तापमानों में से प्रत्येक पर MLE को दर्शाती है। "फिट" पैनल में लाल वक्र तापमान के आधार पर सिक्के को कैसे लोड किया जाता है, इसका पता लगाता है। निर्माण के द्वारा, यह ट्रेस डेटा बिंदुओं में से प्रत्येक से होकर गुजरता है। (यह मध्यवर्ती तापमान पर क्या करता है यह अज्ञात है; मैंने इस बिंदु पर जोर देने के लिए मूल्यों को गंभीर रूप से जोड़ा है।)
यह "संतृप्त" मॉडल बहुत उपयोगी नहीं है, ठीक है क्योंकि यह हमें यह अनुमान लगाने का कोई आधार नहीं देता है कि भगवान मध्यवर्ती तापमान पर सिक्कों को कैसे लोड करेंगे। ऐसा करने के लिए, हमें लगता है कि कुछ प्रकार की "प्रवृत्ति" वक्र है जो सिक्के के लोडिंग से तापमान से संबंधित है।
आकृति की निचली पंक्ति इस तरह की प्रवृत्ति को फिट करती है। प्रवृत्ति यह सीमित है कि यह क्या कर सकता है: जब उपयुक्त ("लॉग ऑड्स") में निर्देशांक लगाया जाता है, जैसा कि बाईं ओर "लॉगिट रिस्पांस" पैनल में दिखाया गया है, यह केवल एक सीधी रेखा का अनुसरण कर सकता है। ऐसी कोई भी सीधी रेखा सभी तापमानों पर सिक्के के लोडिंग को निर्धारित करती है, जैसा कि "फिट" पैनलों में संबंधित घुमावदार रेखा द्वारा दिखाया गया है। यह लोडिंग, बदले में, सभी तापमानों पर द्विपद वितरण को निर्धारित करता है। नीचे की पंक्ति उन तापमानों के लिए उन वितरणों को प्लॉट करती है जहां घोंसले देखे गए थे। (धराशायी काली रेखाएं वितरण के अपेक्षित मूल्यों को चिह्नित करती हैं, जिससे उन्हें काफी हद तक पहचानने में मदद मिलती है। आप उन पंक्तियों को आकृति की शीर्ष पंक्ति में नहीं देखते क्योंकि वे लाल खंडों के साथ मेल खाते हैं।)
अब एक ट्रेडऑफ बनाया जाना चाहिए: लाइन कुछ डेटा बिंदुओं के करीब से गुजर सकती है, केवल दूसरों से दूर वीर करने के लिए। इससे संबंधित द्विपद वितरण पहले की तुलना में अधिक देखे गए मानों को कम संभावनाएं प्रदान करता है। आप इसे 10 डिग्री और 15 डिग्री पर स्पष्ट रूप से देख सकते हैं: देखे गए मूल्यों की संभावना उच्चतम संभव संभावना नहीं है, न ही यह ऊपरी पंक्ति में निर्दिष्ट मूल्यों के करीब है।
लॉजिस्टिक रिग्रेशन स्लाइड और "लॉज रिस्पांस" पैनल द्वारा उपयोग की जाने वाली समन्वित प्रणाली में चारों ओर संभव लाइनों को विगेट्स करता है, उनकी ऊंचाई को द्विपदीय संभावनाओं ("फिट" पैनल) में परिवर्तित करता है, टिप्पणियों के लिए सौंपे गए अवसरों का मूल्यांकन करता है (चार सही पैनल) ), और उन अवसरों का सबसे अच्छा संयोजन देने वाली रेखा को चुनता है।
"सर्वश्रेष्ठ" क्या है? बस इतना है कि सभी डेटा की संयुक्त संभावना यथासंभव बड़ी है। इस तरह किसी भी एकल संभावना (लाल खंडों) को वास्तव में छोटे होने की अनुमति नहीं है, लेकिन आमतौर पर अधिकांश संभावनाएं उतनी अधिक नहीं होंगी जितनी वे संतृप्त मॉडल में थीं।
यहाँ लॉजिस्टिक रिग्रेशन खोज का एक पुनरावृत्ति है जहाँ लाइन को नीचे की ओर घुमाया गया था:
1015डिग्री लेकिन अन्य डेटा फिटिंग का एक भयानक काम। (5 और 20 डिग्री पर डेटा को दी गई द्विपद संभावनाएं इतनी छोटी हैं कि आप लाल खंड भी नहीं देख सकते हैं।) कुल मिलाकर, यह पहले आंकड़े में दिखाए गए लोगों की तुलना में बहुत खराब है।
मुझे आशा है कि इस चर्चा से आपको द्विपदीय संभावनाओं की मानसिक छवि विकसित करने में मदद मिली है, क्योंकि रेखा विविध है, डेटा को समान रखते हुए सभी। लॉजिस्टिक रिग्रेशन द्वारा फिट की गई लाइन उन लाल पट्टियों को यथासंभव उच्च बनाने का प्रयास करती है। इस प्रकार, लॉजिस्टिक प्रतिगमन और द्विपद वितरण के परिवार के बीच संबंध गहरा और अंतरंग है।
परिशिष्ट: 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)