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

