R语言nls拟合含分类变量非线性模型时如何绘制分组预测曲线
分组Gompertz非线性模型可视化实现
核心逻辑分为三步:
- 从拟合好的
nls模型对象中提取两个位置对应的a、b、c参数估计值 - 生成覆盖原始年龄取值范围的连续等间隔年龄序列,代入Gompertz公式计算对应位置的体长预测值,得到平滑曲线的坐标点
- 先绘制原始观测值的分组散点,再叠加分组预测曲线即可。
方法1:ggplot2 实现(出图规范易调整,推荐)
# 加载绘图包,未安装请先运行 install.packages("ggplot2") library(ggplot2) # 1. 提取模型拟合得到的分组参数 fit_coef <- coef(gompertz.locs) # 2. 生成用于绘制平滑曲线的连续年龄序列(覆盖原始数据年龄范围) pred_df <- data.frame( age = seq(min(df$age), max(df$age), length.out = 200) ) # 分别计算两个位置的模型预测体长 pred_df$loc1_pred <- fit_coef["a1"] * exp(-fit_coef["b1"] * exp(-fit_coef["c1"] * pred_df$age)) pred_df$loc2_pred <- fit_coef["a2"] * exp(-fit_coef["b2"] * exp(-fit_coef["c2"] * pred_df$age)) # 3. 拼接长格式预测数据,匹配ggplot数据结构 pred_long <- rbind( data.frame(age = pred_df$age, location = as.factor(1), pred_length = pred_df$loc1_pred), data.frame(age = pred_df$age, location = as.factor(2), pred_length = pred_df$loc2_pred) ) df$location <- as.factor(df$location) # 4. 组合绘制散点与拟合曲线 ggplot() + # 底层绘制原始观测散点 geom_point(data = df, aes(x = age, y = Length, color = location), alpha = 0.6) + # 上层绘制拟合曲线 geom_line(data = pred_long, aes(x = age, y = pred_length, color = location), linewidth = 1.2) + # 自定义标签与配色 labs(x = "年龄", y = "体长", color = "采样位置") + scale_color_manual(values = c("#1f77b4", "#ff7f0e"), labels = c("位置1", "位置2")) + theme_bw()
方法2:基础R绘图实现(无需加载第三方包)
# 1. 提取拟合参数、生成预测序列 fit_coef <- coef(gompertz.locs) age_seq <- seq(min(df$age), max(df$age), length.out = 200) pred1 <- fit_coef["a1"] * exp(-fit_coef["b1"] * exp(-fit_coef["c1"] * age_seq)) pred2 <- fit_coef["a2"] * exp(-fit_coef["b2"] * exp(-fit_coef["c2"] * age_seq)) # 2. 绘制分组散点 plot(Length ~ age, data = df[df$location ==1,], col = "#1f77b4", pch = 16, xlab = "年龄", ylab = "体长", xlim = range(df$age), ylim = range(df$Length)) points(Length ~ age, data = df[df$location ==2,], col = "#ff7f0e", pch = 16) # 3. 叠加拟合曲线 lines(age_seq, pred1, col = "#1f77b4", lwd = 2) lines(age_seq, pred2, col = "#ff7f0e", lwd = 2) # 4. 添加图例 legend("bottomright", legend = c("位置1", "位置2"), col = c("#1f77b4", "#ff7f0e"), pch = 16, lwd = 2, bty = "n")
扩展提示:如果后续需要加入性别等更多分类变量,只需要在生成预测数据时对应拆分参数组,按相同逻辑映射颜色、形状等图形属性即可;如果需要给曲线添加置信区间,可以结合自助法计算区间边界,再用
geom_ribbon()(ggplot2)或polygon()(基础R)添加阴影区间。
内容的提问来源于stack exchange,提问作者billyleaf
相关产品推荐
相关产品推荐

