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

使用nls拟合数据时如何选取最优拟合方式并在ggplot中展示

报错原因说明

你调用nls()时报错的核心原因是公式中没有定义待拟合的未知参数:nls(mi~Location, data = FX, start = list(mi = 1, Location = 1))的写法中,mi和Location都是数据集中已有的观测变量,没有需要估计的参数,因此触发「no parameters to fit」报错。
正确的nls()公式需要将因变量表示为自变量+未知参数的组合,初始值start列表对应未知参数的初始猜测值。

多拟合结果的最优筛选方法
  • 第一步先根据数据趋势确定候选模型集合,你提供的样本数据mi呈指数级增长,可以纳入线性模型y = a*x + b、指数模型y = a*exp(b*x)、幂函数模型y = a*x^b三类候选。
  • 第二步用量化指标初选:优先参考AIC/BIC值(越低越好,同时平衡拟合效果和模型复杂度,避免过拟合)、调整R²(越高越好)、残差平方和SSE(越低越好)三类指标。
  • 第三步做残差诊断:拟合完成后绘制残差散点图,若残差完全随机分布无明显趋势,说明模型对数据规律的捕捉效果较好。
  • 第四步校验业务合理性:确保参数估计值符合对应研究场景的业务逻辑,排除统计上拟合优度高但不符合实际规律的模型。
拟合结果接入ggplot的实现代码

以下为修复报错、完成多模型拟合、将结果叠加到ggplot的完整可运行代码,若出现nls()收敛报错,调整start内的参数初始值即可:

library(ggplot2)
library(tidyverse)

# 构造数据集
FX <- data.frame(Location=c(1:5), mi=c(1, 4, 16, 16^2,256^2))

# 1. 修正nls写法,分别拟合3种候选模型
# 线性模型:mi = a*Location + b
fit_linear <- nls(mi ~ a*Location + b, data = FX, start = list(a=1000, b=1))
# 指数模型:mi = a*exp(b*Location)
fit_exp <- nls(mi ~ a*exp(b*Location), data = FX, start = list(a=1, b=1))
# 幂函数模型:mi = a*Location^b
fit_power <- nls(mi ~ a*Location^b, data = FX, start = list(a=1, b=2))

# 查看三个模型的AIC值,越低拟合效果越好,本案例中指数模型AIC最低
AIC(fit_linear, fit_exp, fit_power)

# 2. 生成预测值,用于ggplot绘图
FX_pred <- FX %>%
  mutate(linear = predict(fit_linear, .),
         exp = predict(fit_exp, .),
         power = predict(fit_power, .)) %>%
  pivot_longer(cols = c(mi, linear, exp, power), names_to = "type", values_to = "value")

# 3. 绘制叠加拟合线的图表
ggplot(FX_pred, aes(x = Location, y = value, color = type)) +
  geom_line(alpha = 0.9, linewidth = 1) +
  scale_color_manual(values = c("mi" = "red", "linear" = "blue", "exp" = "green", "power" = "purple"),
                     labels = c("原始数据", "线性拟合", "指数拟合", "幂函数拟合")) +
  labs(color = "类型") +
  theme_bw()

内容的提问来源于stack exchange,提问作者Toy L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:36:02