R语言绘制逻辑回归预测概率折线显示异常问题咨询
问题复现
模拟数据生成
n = 1e3 x = rnorm(n) linear_process = 1 + 5*x y = rbinom(n = n, size = 1, prob = plogis(linear_process)) plot(x,y)

模型拟合
m = glm(y~x, family = binomial(link = 'logit')) y_hat = predict(m, type = 'response')
不同绘图方式的效果差异
- 用散点叠加预测值,效果符合预期:
plot(x,y) points(x,y_hat, col = 'blue')

- 直接用折线连接预测值,出现异常错乱图形:
plot(x,y) lines(x,y_hat, col = 'blue')

问题原因
predict()函数的使用完全正确,异常来自lines()函数的绘图逻辑:lines()属于R基础绘图函数,不会自动对输入的x坐标做排序,只会严格按照向量的原始存储顺序,依次连接相邻的两个(x,y)坐标点。
你代码中的x是rnorm()生成的随机数,本身是无规律乱序的,对应的预测值y_hat也和原始乱序x一一对应。直接调用lines()时,连线会在不同x位置的预测点之间来回跳转,最终形成错乱的锯齿状图形。而points()只负责在对应坐标位置画点,不存在连点逻辑,因此散点叠加的效果完全正常。
修复方案
方案1:对原始坐标排序后连线
适合快速修正,直接基于现有预测值绘图:
plot(x, y) # 获取x从小到大排序的索引 ord <- order(x) # 按排序后的坐标连线 lines(x[ord], y_hat[ord], col = 'blue', lwd = 2)
方案2:生成有序网格点预测后绘图(更推荐)
生成覆盖x取值范围的等间距有序x序列做预测,画出的拟合曲线更平滑规整,更适合展示模型拟合效果:
plot(x, y) # 生成100个等间距分布的x点 x_new <- seq(min(x), max(x), length.out = 100) # 对新x值做预测 y_hat_new <- predict(m, newdata = data.frame(x = x_new), type = 'response') lines(x_new, y_hat_new, col = 'blue', lwd = 2)
内容的提问来源于stack exchange,提问作者invictus
相关产品推荐
相关产品推荐

