You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言绘制GLM多项式拟合线出现异常图形,寻求技术协助

解决GLM二次拟合线绘图异常的问题

嘿,我帮你找到问题所在啦!你绘制的拟合线出现异常,核心原因是你用来连线的df$bmi_NC是原始的未排序数据——lines()函数会严格按照数据的原始顺序依次连接预测点,如果你的BMI数据不是从小到大排列的,线条就会在不同x值之间来回跳跃,导致图形混乱。

下面给你两种简单的解决方法:

方法一:先排序数据再拟合绘图

这种方法适合希望保留原始散点分布,同时让拟合线按x轴顺序连接的场景:

# 第一步:按bmi_NC从小到大排序整个数据框
df_sorted <- df[order(df$bmi_NC), ]

# 第二步:基于排序后的数据重新拟合模型
fit_bmi <- glm(genhlth_NC ~ poly(bmi_NC, 2, raw = TRUE), data = df_sorted)

# 第三步:绘制散点图(用排序后的数据也可以,不影响散点展示)
plot(df_sorted$bmi_NC, df_sorted$genhlth_NC, col=rgb(red=0.2, green=0.2, blue=1.0, alpha=0.01))

# 第四步:用排序后的x和对应预测值连线,此时线条就是平滑的二次曲线了
lines(df_sorted$bmi_NC, predict(fit_bmi), col = 'red')

方法二:生成连续x序列预测并绘图

这种方法会生成覆盖BMI全范围的连续x值,拟合线会更平滑,适合展示趋势:

# 原始拟合模型不变
fit_bmi <- glm(df$genhlth_NC ~ poly(df$bmi_NC, 2, raw = TRUE))

# 绘制原始散点图
plot(df$bmi_NC, df$genhlth_NC, col=rgb(red=0.2, green=0.2, blue=1.0, alpha=0.01))

# 生成覆盖BMI最小值到最大值的连续x序列(100个点足够平滑)
x_seq <- seq(min(df$bmi_NC, na.rm = TRUE), max(df$bmi_NC, na.rm = TRUE), length.out = 100)

# 基于新的x序列生成预测值,注意要构造和模型变量名匹配的数据框
pred_vals <- predict(fit_bmi, newdata = data.frame(bmi_NC = x_seq))

# 用连续x序列和预测值连线
lines(x_seq, pred_vals, col = 'red')

简单总结下:predict()返回的预测值顺序和你输入模型的数据顺序完全一致,只要保证用来连线的x值是从小到大有序的,拟合线就会正常显示啦~

内容的提问来源于stack exchange,提问作者Xiang Li

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:28:34