r中的指数衰减拟合

r中的指数衰减拟合,r,statistics,model-fitting,function-fitting,R,Statistics,Model Fitting,Function Fitting,我想将R中的指数衰减函数拟合到以下数据: data <- structure(list(x = 0:38, y = c(0.991744340878828, 0.512512332368168, 0.41102449265681, 0.356621905557202, 0.320851602373477, 0.29499198506227, 0.275037747162642, 0.25938850981822, 0.245263623938863, 0.233655093612007

我想将R中的指数衰减函数拟合到以下数据:

data <- structure(list(x = 0:38, y = c(0.991744340878828, 0.512512332368168, 
0.41102449265681, 0.356621905557202, 0.320851602373477, 0.29499198506227, 
0.275037747162642, 0.25938850981822, 0.245263623938863, 0.233655093612007, 
0.224041426946405, 0.214152907133301, 0.207475138903635, 0.203270738895484, 
0.194942528735632, 0.188107106969046, 0.180926819430008, 0.177028560207711, 
0.172595416846822, 0.166729221891201, 0.163502461048814, 0.159286528409165, 
0.156110097827889, 0.152655498715612, 0.148684858095915, 0.14733605355542, 
0.144691873223729, 0.143118852619617, 0.139542186417186, 0.137730138713745, 
0.134353615271572, 0.132197800438632, 0.128369567159113, 0.124971834736476, 
0.120027536018095, 0.117678812415655, 0.115720611113327, 0.112491329844252, 
0.109219168085624)), class = "data.frame", row.names = c(NA, 
-39L), .Names = c("x", "y"))

data
data
data双指数模型更适合,尽管还不完美。这表明可能有两个同时发生的衰变过程

fit <- nls(y ~ SSbiexp(x, A1, lrc1, A2, lrc2), data = data)
#A1*exp(-exp(lrc1)*x)+A2*exp(-exp(lrc2)*x)

plot(y ~x, data = data)
curve(predict(fit, newdata = data.frame(x)), add = TRUE)

fit双指数模型更适合,尽管仍然不完美。这表明可能有两个同时发生的衰变过程

fit <- nls(y ~ SSbiexp(x, A1, lrc1, A2, lrc2), data = data)
#A1*exp(-exp(lrc1)*x)+A2*exp(-exp(lrc2)*x)

plot(y ~x, data = data)
curve(predict(fit, newdata = data.frame(x)), add = TRUE)
fit试试
y~.lin/(b+x^c)
。请注意,当使用
“plinear”
时,在将公式指定为
nls
时,会忽略
.lin
线性参数,并忽略其起始值

还要注意,
.lin
b
参数在最佳情况下约为1,因此我们也可以尝试单参数模型
y~1/(1+x^c)
。这是单参数对数逻辑生存曲线的形式。此单参数模型的AIC比三参数模型差(比较
AIC(fm1)
AIC(fm3)
),但单参数模型可能仍然更可取,因为它比较简单,而且拟合在视觉上与三参数模型没有区别

opar <- par(mfcol = 2:1, mar = c(3, 3, 3, 1), family = "mono")

# data = data.frame with x & y col names; fm = model fit; main = string shown above plot
Plot <- function(data, fm, main) {
  plot(y ~ x, data, pch = 20)
  lines(fitted(fm) ~ x, data, col = "red")
  legend("topright", bty = "n", cex = 0.7, legend = capture.output(fm))
  title(main = paste(main, "- AIC:", round(AIC(fm), 2)))
}  

# 3 parameter model
fo3 <- y ~ 1/(b + x^c) # omit .lin parameter; plinear will add it automatically
fm3 <- nls(fo3, data = data, start = list(b = 1, c = 1), alg = "plinear")
Plot(data, fm3, "3 parameters")

# one parameter model
fo1 <- y ~ 1 / (1 + x^c)
fm1 <- nls(fo1, data, start = list(c = 1))
Plot(data, fm1, "1 parameter")

par(read.only = opar)
从最佳AIC(即fm3)到最差AIC(即fm2)给出:

尝试
y~.lin/(b+x^c)
。请注意,当使用
“plinear”
时,在将公式指定为
nls
时,会忽略
.lin
线性参数,并忽略其起始值

还要注意,
.lin
b
参数在最佳情况下约为1,因此我们也可以尝试单参数模型
y~1/(1+x^c)
。这是单参数对数逻辑生存曲线的形式。此单参数模型的AIC比三参数模型差(比较
AIC(fm1)
AIC(fm3)
),但单参数模型可能仍然更可取,因为它比较简单,而且拟合在视觉上与三参数模型没有区别

opar <- par(mfcol = 2:1, mar = c(3, 3, 3, 1), family = "mono")

# data = data.frame with x & y col names; fm = model fit; main = string shown above plot
Plot <- function(data, fm, main) {
  plot(y ~ x, data, pch = 20)
  lines(fitted(fm) ~ x, data, col = "red")
  legend("topright", bty = "n", cex = 0.7, legend = capture.output(fm))
  title(main = paste(main, "- AIC:", round(AIC(fm), 2)))
}  

# 3 parameter model
fo3 <- y ~ 1/(b + x^c) # omit .lin parameter; plinear will add it automatically
fm3 <- nls(fo3, data = data, start = list(b = 1, c = 1), alg = "plinear")
Plot(data, fm3, "3 parameters")

# one parameter model
fo1 <- y ~ 1 / (1 + x^c)
fm1 <- nls(fo1, data, start = list(c = 1))
Plot(data, fm1, "1 parameter")

par(read.only = opar)
从最佳AIC(即fm3)到最差AIC(即fm2)给出:



你也可以发布你用于指数衰减的函数吗?你在nls中传递的那个。我现在传递的是y~a*exp(-b*x)是否有理论上的理由期望数据遵循一个衰减的指数,或者你只是盯着它看?没有理由,只是盯着它看。@Scratch你需要适合什么?参数值?预测?你也可以发布你用于指数衰减的函数吗?你在nls中传递的那个。我现在传递的是y~a*exp(-b*x)是否有理论上的理由期望数据遵循一个衰减的指数,或者你只是盯着它看?没有理由,只是盯着它看。@Scratch你需要适合什么?参数值?预测?您应该注意执行对数变换然后执行线性拟合()的含义。谢谢!但是,当我尝试您的方法时,函数仍然拟合得不好,我猜它需要一个系数作为数据$x^fit$系数的倍数[2]。你知道怎么穿吗?你希望它看起来像什么?你的数据可能不是完全指数型的。我并不期望有什么特别的东西,但是考虑到从我的数据来看衰减曲线是多么平滑,我希望我能找到一个非常精确的模型,但是我想我太乐观了看看对数曲线图,如果它是完美的指数曲线,那么它就是一条完美的直线。你应该注意执行对数变换然后进行线性拟合的含义()。谢谢!但是,当我尝试您的方法时,函数仍然拟合得不好,我猜它需要一个系数作为数据$x^fit$系数的倍数[2]。你知道怎么穿吗?你希望它看起来像什么?你的数据可能不是完全指数型的。我并不期望有什么特别的东西,但是考虑到从我的数据来看衰减曲线是多么平滑,我希望我能找到一个非常精确的模型,但是我想我太乐观了,看看对数图,如果它是完美的指数,那就是一条完美的直线。谢谢你的回答!我承认我是凭经验选择函数的。那么,你将如何寻找最能解释数据中关系的基础函数呢?我首先要考虑我对数据的了解和研究文献。如果在文献中找不到任何东西,我会看看我是否可以自己推导一个微分方程并尝试求解它。特别是,有大量关于生存分析的文献(不是我的专业领域)。谢谢你的回答!我承认我是凭经验选择函数的。那么,你将如何寻找最能解释数据中关系的基础函数呢?我首先要考虑我对数据的了解和研究文献。如果在文献中找不到任何东西,我会看看我是否可以自己推导一个微分方程并尝试求解它。特别是,有大量关于生存分析的文献(不是我的专业领域)。
    df     AIC
fm3  4 -329.35
fm1  2 -307.69
fm4  5 -215.96
fm2  3 -167.33