与 R 的指数拟合
Exponential fitting with R
我有这样的数据集
df
x y
7.3006667 -0.14383333
-0.8983333 0.02133333
2.7953333 -0.07466667
我想拟合像 y = a*(exp(bx)).
这样的指数函数
这是我尝试过的方法和我得到的错误
f <- function(x,a,b) {a * exp(b * x)}
st <- coef(nls(log(y) ~ log(f(x, a, b)), df, start = c(a = 1, b = -1)))
Error in qr.qty(QR, resid) : NA/NaN/Inf in foreign function call (arg 5)
In addition: Warning messages:
1: In log(y) : NaNs produced
2: In log(y) : NaNs produced
fit <- nls(y ~ f(x, a, b), data = df, start = list(a = st[1], b = st[2]))
Error in nls(y ~ exp(a + b * x), data = df, start = list(a = st[1], :
singular gradient
我认为这与日志未定义负数有关,但我不知道如何解决。
我看不到这里的问题。
f <- function(x,a,b) {a * exp(b * x)}
fit <- nls(y~f(x,a,b),df,start=c(a=1,b=1))
summary(fit)$coefficients
# Estimate Std. Error t value Pr(>|t|)
# a -0.02285668 0.03155189 -0.7244157 0.6008871
# b 0.25568987 0.19818736 1.2901422 0.4197729
plot(y~x, df)
curve(predict(fit,newdata=data.frame(x)), add=TRUE)
系数的估计很差,但这并不奇怪:你有两个参数和三个数据点。
至于您的代码失败的原因:第一次调用 nls(...)
会产生错误,因此 st
永远不会设置为任何值(尽管它可能有一些早期代码的值)。然后你尝试在第二次调用 nls(...)
.
时使用它
我有这样的数据集
df
x y
7.3006667 -0.14383333
-0.8983333 0.02133333
2.7953333 -0.07466667
我想拟合像 y = a*(exp(bx)).
这样的指数函数这是我尝试过的方法和我得到的错误
f <- function(x,a,b) {a * exp(b * x)}
st <- coef(nls(log(y) ~ log(f(x, a, b)), df, start = c(a = 1, b = -1)))
Error in qr.qty(QR, resid) : NA/NaN/Inf in foreign function call (arg 5)
In addition: Warning messages:
1: In log(y) : NaNs produced
2: In log(y) : NaNs produced
fit <- nls(y ~ f(x, a, b), data = df, start = list(a = st[1], b = st[2]))
Error in nls(y ~ exp(a + b * x), data = df, start = list(a = st[1], :
singular gradient
我认为这与日志未定义负数有关,但我不知道如何解决。
我看不到这里的问题。
f <- function(x,a,b) {a * exp(b * x)}
fit <- nls(y~f(x,a,b),df,start=c(a=1,b=1))
summary(fit)$coefficients
# Estimate Std. Error t value Pr(>|t|)
# a -0.02285668 0.03155189 -0.7244157 0.6008871
# b 0.25568987 0.19818736 1.2901422 0.4197729
plot(y~x, df)
curve(predict(fit,newdata=data.frame(x)), add=TRUE)
系数的估计很差,但这并不奇怪:你有两个参数和三个数据点。
至于您的代码失败的原因:第一次调用 nls(...)
会产生错误,因此 st
永远不会设置为任何值(尽管它可能有一些早期代码的值)。然后你尝试在第二次调用 nls(...)
.