如何做指数回归模型?
How to do an exponential regression model?
我有一个小 data base(txt 文件)。
我想在 R 中获得指数回归。
我正在使用的命令是:
regression <- read.delim("C:/Users/david/OneDrive/Desktop/regression.txt")
View(regression)
source('~/.active-rstudio-document', echo=TRUE)
m <- nls(DelSqRho ~ (1-exp(-a*(d-b)**2)), data=regression, start=list(a=1, b=1))
y_est<-predict(m,regression$d)
plot(x,y)
lines(x,y_est)
summary(m)
但是,当我 运行 它时,我得到一个错误:
Error in nls(DelSqRho ~ (1 - exp(-a * (d - b)^2)), data = regression, :
step factor 0.000488281 reduced below 'minFactor' of 0.000976562
我不知道如何解决它,如何获得指数回归,请问有什么提示吗?
nls
对起始参数的值非常敏感,因此您希望选择能够合理拟合数据的值(minpack.lm::nlsLM
可能更宽容一些)。
您可以在 a=1
和 b=1
的起始值处绘制曲线,并发现它并没有很好地捕捉曲线。
regression <- read.delim("regression.txt")
with(regression, plot(d, DelSqRho, ylim=c(-3, 1)))
xs <- seq(min(regression$d), max(regression$d), length=100)
a <- 1; b <- 1; ys <- 1 - exp(-a* (xs - b)**2)
lines(xs, ys)
获取起始值的一种方法是重新排列 objective 函数。
y = 1 - exp(-a*(x-b)**2)
可以重新排列为 log(1/(1-y)) = ab^2 - 2abx + ax^2
(这里 y
必须小于一)。然后可以使用线性回归来估计 a
和 b
.
start_m <- lm(log(1/(1-DelSqRho)) ~ poly(d, 2, raw=TRUE), regression)
unname(a <- coef(start_m)[3]) # as `a` is aligned with the quadratic term
# [1] -0.2345953
unname(b <- sqrt(coef(start_m)[1]/coef(start_m)[3]))
# [1] 2.933345
(有时无法以这种方式重新排列数据,您可以尝试通过绘制各种起始参数的曲线来大致了解参数。nls2
也可以使用蛮力搜索或网格搜索起始参数。)
我们现在可以尝试在这些参数下估计 nls
模型:
m <- nls(DelSqRho ~ 1-exp(-a*(d-b)**2), data=regression, start=list(a=a, b=b))
coef(m)
# a b
# -0.2379078 2.8868374
并绘制结果:
# note that `newdata` must be a named list or data frame
# in which to look for variables with which to predict.
y_est <- predict(m, newdata=data.frame(d=xs))
with(regression, plot(d, DelSqRho))
lines(xs, y_est, col="red", lwd=2)
拟合度不高,可能表明需要更灵活的模型。
我有一个小 data base(txt 文件)。
我想在 R 中获得指数回归。
我正在使用的命令是:
regression <- read.delim("C:/Users/david/OneDrive/Desktop/regression.txt")
View(regression)
source('~/.active-rstudio-document', echo=TRUE)
m <- nls(DelSqRho ~ (1-exp(-a*(d-b)**2)), data=regression, start=list(a=1, b=1))
y_est<-predict(m,regression$d)
plot(x,y)
lines(x,y_est)
summary(m)
但是,当我 运行 它时,我得到一个错误:
Error in nls(DelSqRho ~ (1 - exp(-a * (d - b)^2)), data = regression, :
step factor 0.000488281 reduced below 'minFactor' of 0.000976562
我不知道如何解决它,如何获得指数回归,请问有什么提示吗?
nls
对起始参数的值非常敏感,因此您希望选择能够合理拟合数据的值(minpack.lm::nlsLM
可能更宽容一些)。
您可以在 a=1
和 b=1
的起始值处绘制曲线,并发现它并没有很好地捕捉曲线。
regression <- read.delim("regression.txt")
with(regression, plot(d, DelSqRho, ylim=c(-3, 1)))
xs <- seq(min(regression$d), max(regression$d), length=100)
a <- 1; b <- 1; ys <- 1 - exp(-a* (xs - b)**2)
lines(xs, ys)
获取起始值的一种方法是重新排列 objective 函数。
y = 1 - exp(-a*(x-b)**2)
可以重新排列为 log(1/(1-y)) = ab^2 - 2abx + ax^2
(这里 y
必须小于一)。然后可以使用线性回归来估计 a
和 b
.
start_m <- lm(log(1/(1-DelSqRho)) ~ poly(d, 2, raw=TRUE), regression)
unname(a <- coef(start_m)[3]) # as `a` is aligned with the quadratic term
# [1] -0.2345953
unname(b <- sqrt(coef(start_m)[1]/coef(start_m)[3]))
# [1] 2.933345
(有时无法以这种方式重新排列数据,您可以尝试通过绘制各种起始参数的曲线来大致了解参数。nls2
也可以使用蛮力搜索或网格搜索起始参数。)
我们现在可以尝试在这些参数下估计 nls
模型:
m <- nls(DelSqRho ~ 1-exp(-a*(d-b)**2), data=regression, start=list(a=a, b=b))
coef(m)
# a b
# -0.2379078 2.8868374
并绘制结果:
# note that `newdata` must be a named list or data frame
# in which to look for variables with which to predict.
y_est <- predict(m, newdata=data.frame(d=xs))
with(regression, plot(d, DelSqRho))
lines(xs, y_est, col="red", lwd=2)
拟合度不高,可能表明需要更灵活的模型。