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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:36:15