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
相关产品推荐
相关产品推荐

