r - nls() 的后续步骤?
问题描述
在 R 中工作,我试图用nls()
一些数据来拟合以下模型:
y ~ c - a * exp(-b * x)
我的数据:
x <- c(8, 8, 10, 10, 10, 10, 12, 12, 12, 12, 14, 14, 14, 16, 16, 16, 18, 18, 20, 20, 20, 22, 22, 22, 24, 24, 24, 26, 26, 26, 28, 28, 30, 30, 30, 32, 32, 34, 36, 36, 38, 38, 40, 42)
y <- c(0.49, 0.49, 0.48, 0.47, 0.48, 0.47, 0.46, 0.46, 0.45, 0.43, 0.45, 0.43, 0.43, 0.44, 0.43, 0.43, 0.46, 0.45, 0.42, 0.42, 0.43, 0.41, 0.41, 0.40, 0.42, 0.40, 0.40, 0.41, 0.40, 0.41, 0.41, 0.40, 0.40, 0.40, 0.38, 0.41, 0.40, 0.40, 0.41, 0.38, 0.40, 0.40, 0.39, 0.39)
data <- data.frame(x, y)
检查数据是否符合模型的形式:
我正在使用的书说系数估计应该是:c=0.3896,a=-0.2194,b=0.992。
我尝试使用给定的值,基于这个线程2,返回一个奇异的梯度错误:
m <- nls(y ~ I(c-a*exp(-b*x)), data=data, start=list(a=-.2194, b=1, c=0.3), trace=T)
当我尝试拟合y ~ a * exp(-b * x)
和时,我得到了可接受的值y ~ exp(-b * x)
,但是当我添加“c”项时,我得到了奇异梯度误差。我也尝试过使用 nlsLM,它有同样的问题,所以我认为这与我在拦截术语中添加的方式有关。任何建议表示赞赏,谢谢。
解决方案
使用 plinear 算法,在这种情况下,线性输入的参数不需要起始值。在这种情况下,右侧应该是一个矩阵,使得每一列乘以线性输入的参数之一。
fm <- nls(y ~ cbind(c = 1, a = -exp(-b*x)), data,
start = list(b = 1), alg = "plinear")
fm
给予:
Nonlinear regression model
model: y ~ cbind(c = 1, a = -exp(-b * x))
data: data
b .lin.c .lin.a
0.09916 0.38963 -0.21940
residual sum-of-squares: 0.004997
Number of iterations to convergence: 6
Achieved convergence tolerance: 3.075e-07
我们可以直观地检查拟合:
plot(y ~ x, data)
lines(fitted(fm) ~ x, data, col = "red")
推荐阅读
- hadoop - Hadoop mapreduce 多个输出写入单个文件
- python - 使用一个数组中的 UTC 时间戳值在 pandas 数据帧中进行本地化
- c# - 用于本地化的 ASP.NET Core 3.1 Identity 开箱即用资源文件
- laravel-8 - Laravel 8中外键的UUID类型
- codenameone - 以相同名称保存时文件是否会在 Codenameone 中被覆盖
- c# - 无法使用 C# 语言在剧作家自动化中下载文件
- macos - 在我的 Mac 上安装 truffle 后,我无法在终端中运行 truffle 命令,结果总是 zsh: command not found: truffle
- xamarin.forms - 从 Xamarin 表单添加到 Ioc.Default.Configure 服务
- reactjs - React:支持使用通用 npm 包集成多个 OAuth2 授权服务器 (SSO)
- python - Twitter Stream API 提供没有文本关键字的推文