虽然已经有一个公认的答案,但该问题还询问非线性nls 拟合。
这是一种方法。
df1 <- data.frame(x, y)
cat("a.true:", a, " b.true:", b, "\n")
#a.true: 9.482203 b.true: 0.02768012
nls(y ~ a*exp(-b*x), df1, start = list(a = 5, b = 1))
#Nonlinear regression model
# model: y ~ a * exp(-b * x)
# data: df1
# a b
#9.28448 0.02636
# residual sum-of-squares: 9.493
#
#Number of iterations to convergence: 8
#Achieved convergence tolerance: 9.938e-08
由于公式不是很复杂,可以转化为x中的线性公式,如log(y) = log(a) - b*x,标准线性模型可以给出参数a和b的其他估计。请注意,估计为负的b。
fit2 <- lm(log(y) ~ x, df1)
log.a <- coef(fit2)[1]
neg.b <- coef(fit2)[2]
cat("a.lm:", exp(log.a), " b.lm:", -neg.b, "\n")
#a.lm: 9.293966 b.lm: 0.0266301
数据。
重复数据创建代码,这一次显式创建了两个参数a 和b。
set.seed(5000)
x <- seq(0, 50, 1)
a <- runif(1, 5, 15)
b <- runif(1, 0.01, 0.05)
y <- a*exp(-b*x) + rnorm(51, 0, 0.5)