使用R语言onls包拟合非线性幂律函数出现报错如何解决?
问题解决方法
错误原因
你的报错核心是数据框构造代码错误:as.data.frame(x, y)的语法不符合R的数据框创建规则,as.data.frame()第一个参数是待转换的对象,第二个参数为行名等配置参数,不会将y识别为第二列存入数据框,最终生成的DAT仅包含x变量,onls函数读取data参数中的y时找不到符合要求的变量,就会抛出格式错误。
修复步骤
1. 正确构造输入数据框
将创建DAT的代码替换为标准数据框构造写法:
DAT <- data.frame(x = x, y = y)
生成的DAT会同时包含x、y两列,结构完全符合模型函数的输入要求。
2. 调整初始值(可选,提升拟合成功率)
你要拟合的公式为y = b * x^(-a),对应你写的拟合公式y ~ b1*x^b2时,b2的理论值为负数,你原本设置的初始值1为正数,大概率会导致拟合不收敛,建议调整初始值到更接近真实值的范围:
# 未安装onls包先执行:install.packages("onls") library(onls) fit <- onls(y ~ b1*x^b2, data = DAT, start = list(b1 = 10000, b2 = -1.5))
3. 提取拟合结果
拟合完成后执行summary(fit)即可查看参数估计值、显著性、拟合优度等结果,你需要的幂律参数:
b对应coef(fit)[["b1"]]a对应-coef(fit)[["b2"]]
完整可运行代码
# 安装并加载包 # install.packages("onls") library(onls) # 输入原始数据 x <- c(370, 470, 520, 590, 660, 880, 950) y <- c(11.7, 6.7, 5.31, 4.6, 4.8, 3.2, 1.6) # 构造标准数据框 DAT <- data.frame(x = x, y = y) # 执行正交非线性最小二乘拟合 fit <- onls(y ~ b1*x^b2, data = DAT, start = list(b1 = 10000, b2 = -1.5)) # 输出拟合结果 summary(fit)
内容的提问来源于stack exchange,提问作者Valeria
相关产品推荐
相关产品推荐

