二项GLM绘图出现多条预测线的原因与单线条调整方法
多条杂乱线条的产生原因
图中出现的交叉乱线是连线逻辑错误导致的,和已拟合的logistic模型本身没有关系:
- 你当前的绘图代码仅实现了原始0/1分类值的散点绘制,本身不会自动生成模型拟合线
- 出现乱线通常是尝试补加线条时,直接按照数据集的原始行顺序连接样本点,没有按照x轴(雏鸟体重)的数值大小排序:因为数据的原始记录顺序和体重大小没有对应关系,连线会在图中来回折返、交叉,最终形成多根交错的杂乱线条,完全不是模型的拟合趋势
- 直接连接未排序的预测值也会产生同样的问题:哪怕是用模型算出来的预测值,如果没有按x轴顺序排列,连点成线后依然会出现杂乱的交叉效果
单条平滑拟合线的实现方案
核心逻辑是先按x轴取值范围生成规整的连续预测序列,再基于模型算出对应预测值,最后按顺序连线,具体步骤和代码如下:
- 第一步:绘制原始样本散点,可对纵向的0/1分类值加轻微抖动,避免同取值的点完全重叠,同时将y轴范围设置在0-1的概率区间,适配后续的拟合线展示
- 第二步:按照雏鸟体重的实际取值范围,生成一组从小到大连续均匀排列的体重值作为预测的自变量序列
- 第三步:调用已拟合的logistic模型,将预测序列对应的线性预测结果转换为实际的繁殖终末概率值
- 第四步:将按顺序排列的预测值用线条连接,即可得到单条平滑的S型logistic拟合线
对应的可运行代码:
# 绘制原始散点(加轻微纵向抖动减少点重叠) plot(jitter(cranesData$Terminal_Effect, amount = 0.03) ~ cranesData$chick_mass, xlab = "Chick Mass (kg)", ylab = "Probability of Terminal Reproduction", pch = 19, ylim = c(-0.05, 1.05)) # 生成按体重值升序排列的预测用x序列 x_pred <- seq( from = min(cranesData$chick_mass), to = max(cranesData$chick_mass), length.out = 100 ) # 计算对应x序列的终端效应概率预测值 y_pred <- predict( object = m10, newdata = data.frame(chick_mass = x_pred), type = "response" ) # 绘制单条平滑拟合线 lines(x_pred, y_pred, col = "#c0392b", lwd = 2)
关键注意事项:
- 禁止直接使用
lines(cranesData$Terminal_Effect ~ cranesData$chick_mass)这类写法连线,该写法会严格按照数据行的原始顺序连点,是产生交叉乱线的最常见诱因- 预测时必须指定
type = "response",否则默认输出的是logit尺度的线性预测值,不是可用于绘图的实际概率值- 传入predict函数的newdata必须包含和模型自变量完全同名的列名,否则会触发参数不匹配的报错
内容的提问来源于stack exchange,提问作者Steph Curtis
相关产品推荐
相关产品推荐

