我想绘制一个二元分类响应变量和一个连续预测变量之间的关系来研究它的形状。目标是准备逻辑回归。这张图片可能会澄清:
我可以访问 Minitab 和 R,并且非常感谢任何有关如何重新创建此直方图或可能同样有效的替代方案的见解。
我想绘制一个二元分类响应变量和一个连续预测变量之间的关系来研究它的形状。目标是准备逻辑回归。这张图片可能会澄清:
我可以访问 Minitab 和 R,并且非常感谢任何有关如何重新创建此直方图或可能同样有效的替代方案的见解。
这就是探索:我们应该自由发挥创造力,并以多种不同的方式查看数据以形成洞察力。
本着这种精神,一种有吸引力的方法避免对自变量进行分箱。相反,计算和平滑因变量的运行摘要(每年收入低于 50,000 的比例)。根据需要的关系图的详细程度或一般程度,选择合适的窗口进行总结和平滑。
下面是一个设计成如图所示的合成数据集示例:
第一行显示了自变量(小时)和因变量(每年数千美元的收入)的单变量摘要。后者表明,在这个例子中,关于高收入的信息相对不确定。
底行呈现双变量信息。左边是收入与工作时间的关系图。(在许多情况下,最好对这种关系进行建模,而不是将收入分成两组。但有时我们确实只有一个二元因变量,或者我们的分析目标真正涉及比较两组。让我们继续......)
右下角说明了建议的解决方案:
摆动的蓝线是收入低于 50K 的比例与每周工作时间的平滑运行平均值。
周围的灰线与蓝线相隔一个估计标准误差。
红线——实际上是不可用的——是用于合成这些数据的基础关系。理想情况下,它将完全位于(或至少靠近)由灰线包围的区域内。
最后一个图的外观可以通过改变移动窗口大小和对移动摘要应用或多或少的平滑来控制。以下是默认宽度的一些变化:
较小的宽度(左上角)提供了太多的细节。较大的宽度给出更简单的表示;在右下角,关系几乎简化为一条直线。在实践中——如果这是一个真实的数据集(并且参考 [红色] 线不可用),人们可能会决定从一个简单的线性项开始,仅以小时为单位,并测试引入(比如说)一个小的三次样条是否会改进模型,在效果将右下角的描绘与右上角的描绘进行比较。
如果您希望保留正式比较模型的能力(即信任 p 值),那么在进行探索之前保留一些数据并根据保留的数据测试最终模型是必不可少的。如果它成立,那么模型最终可以使用所有数据进行拟合,以改进其系数的估计。
R
代码如下。
#
# Synthesize a data set.
#
set.seed(17)
n <- 300 # Amount of data
means <- c(15, 44) / 168 # Typical hours per week
sds <- c(5, 15) / 168 # Dispersion around those values
ab <- means * (1-means) / sds^2 - 1 # Corresponding Beta parameters
alphas <- means * ab
betas <- ab - alphas
hours <- sort(rbeta(n, alphas, betas) * 168) # Generate a mixture of Betas
par(mfrow=c(2,2))
hist(hours)
f <- function(h, m1=-2, m2=0.3) { # Prescribe the income-hour relationship
x <- h/100
0.4 + m2*x + m1*(pmin(x,0.5)-0.5) -(m1+m2)*(pmin(x,0.3)-0.3)
}
# Incomes are lognormally distributed conditional on hours
sd <- 0.4 # CV of incomes (geometric SD)
income <- exp(rnorm(n, mean=qnorm(1-f(hours))*sd + log(50), sd=sd))
hist(income)
plot(hours, income, xlab="Hours per week", ylab="Income (K$)",
main="Income vs. Hours") # $
#
# Compute moving summaries.
#
require(zoo)
width <- floor(sqrt(n)) # Size of moving window
smooth.width <- min(n, 3*width) / n # Strength of the smoother
fill <- list("extend", "extend", "extend")
x.window <- rollmean(zoo(hours), width, fill=fill)
y.window <- rollmean(zoo(income <= 50), width, fill=fill)
y.window <- zoo(lowess(y.window, f=smooth.width)$y) # $
plot(c(min(x.window), max(x.window)), c(0,1), type="n", bg="#f8f8f8",
xlab="Hours per week", ylab="Proportion Income <= 50K",
main="Proportion Below 50K vs. Hours")
curve(f(x), add=TRUE, col="Red")
lines(x.window, y.window, col="Blue")
lines(x.window, y.window + sqrt(y.window * (1-y.window) / width), col="Gray")
lines(x.window, y.window - sqrt(y.window * (1-y.window) / width), col="Gray")
您在问题中突出显示的图提醒使用黄土(或lowess)曲线来可视化针对二元响应的连续变量:-
当然,这条线对应于两种颜色相遇处的直方图示例。如果数据是原始数据还是建模数据(如我的示例),我在您的示例中看不到。
这个 SO question显示了另一个例子。