我试图了解逻辑回归如何使用二项式分布。
假设我正在研究鸟巢的成功。嵌套成功的概率为0.6。使用二项分布,我可以计算n次试验(研究的巢数)后r次成功的概率。
但是,在建模环境中如何使用二项式分布?假设我想知道平均温度如何影响筑巢成功,并且我使用逻辑回归研究了这个问题。
在我描述的上下文中,逻辑回归如何使用二项式分布?
我正在寻找一个直观的答案,因此没有方程式的答案!我认为方程式只有在直观的理解水平上才有用。
我试图了解逻辑回归如何使用二项式分布。
假设我正在研究鸟巢的成功。嵌套成功的概率为0.6。使用二项分布,我可以计算n次试验(研究的巢数)后r次成功的概率。
但是,在建模环境中如何使用二项式分布?假设我想知道平均温度如何影响筑巢成功,并且我使用逻辑回归研究了这个问题。
在我描述的上下文中,逻辑回归如何使用二项式分布?
我正在寻找一个直观的答案,因此没有方程式的答案!我认为方程式只有在直观的理解水平上才有用。
Answers:
假设您观察到多个处于不同平均每日温度巢。巢成功的概率π (t )如何取决于温度t?(如果嵌套是独立的,则将温度为t时成功的嵌套数量按二项式分布,其中n等于观察到的嵌套数量和成功概率π (t )。)
逻辑回归是一种方法(使用逻辑函数),该方法通过拉伸和移动逻辑曲线来指定成功概率作为温度的函数,并且需要根据数据估算拉伸和移动的量。
没有方程式?kes 让我们来看看:
因为逻辑链接对于二项式族是规范的,所以它甚至更好,因为足够的统计信息的格式非常简单-这使得处理大型样本甚至开发“在线”算法变得很方便。
使用逻辑回归,该曲线(链接函数)就是逻辑函数。其他功能也是可能的,并且许多程序包都实现了几种glm
功能(如果我没记错的话,R在其功能中内置了三个合适的功能)。
撰写此帖子时,不会损害任何平等符号。
您的模型假设嵌套的成功可以看作是一场赌博:上帝将一枚装满硬币的硬币翻转成标有“成功”和“失败”的一面。一个嵌套的翻转结果与任何其他嵌套的翻转结果无关。
不过,鸟类确实有帮助自己的地方:与某些温度相比,这种硬币在某些温度下可能会极大地促进成功。因此,当您有机会在给定温度下观察嵌套时,成功次数等于同一枚硬币的成功翻转次数-该温度下的成功翻转次数。相应的二项式分布描述了成功的机会。也就是说,它通过嵌套的数量确定零成功的概率,一,二,...,依此类推。
通过在该温度下观察到的成功比例,可以合理估计温度与上帝如何装载硬币之间的关系。这是最大似然估计(MLE)。
图的顶部显示了在四个观测温度下的MLE。 “适合”面板中的红色曲线根据温度跟踪硬币的装入方式。通过构造,该迹线穿过每个数据点。(在中间温度下它的作用尚不清楚;我已经粗略地连接了这些值以强调这一点。)
这种“饱和”模型不是很有用,正是因为它没有给我们任何依据来估计上帝在中等温度下如何装载硬币。为此,我们需要假设存在某种“趋势”曲线,它将硬币的装载量与温度相关联。
该图的底行符合这种趋势。 趋势受其作用的限制:以适当的(“对数几率”)坐标进行绘制时(如左侧的“ Logit Response”面板中所示),它只能沿着一条直线。任何这样的直线都决定了硬币在所有温度下的负载,如“适合”面板中相应的曲线所示。该载荷反过来决定了所有温度下的二项式分布。最下面的行绘制了观察到巢的温度的那些分布。(黑色虚线标记了分布的期望值,有助于准确地识别它们。您不会在图中的第一行看到这些线,因为它们与红色部分重合。)
现在必须进行权衡:该线可能会紧密通过某些数据点,而只会远离其他数据点。这导致相应的二项分布为大多数观测值分配的概率比以前更低。您可以在10度和15度处清楚地看到这一点:观测值的概率不是最大可能的概率,也不是接近上一行中分配的值。
Logistic回归滑动并摆动可能的线(在“ Logit Response”面板使用的坐标系中),将其高度转换为二项式概率(“ Fit”面板),评估分配给观测值的机会(右侧四个面板) ),并选择能最佳组合这些机会的线。
什么是“最佳”? 简单地说,所有数据的组合概率尽可能大。这样,不允许单个概率(红色部分)真正地很小,但是通常大多数概率不会像饱和模型中那样高。
这是逻辑回归搜索的一次迭代,其中线向下旋转:
度,但拟合其他数据的工作却很糟糕。(在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)