【问题标题】:Self Starting Functions for Exponential Decay Model in RR中指数衰减模型的自启动函数
【发布时间】:2020-04-21 13:39:48
【问题描述】:

我正在研究一个指数衰减模型,我想估计衰减率。我当前的模型使用自启动功能,SSasymp 来自 stats 包。我还编写了第二个模型,我只关注起始参数,这需要minpack.lm 包。我的问题是,是否有另一种方法可以估计起始参数来交叉检查SSasymp 函数。我(认为)我了解代码在估算起始参数时所做的工作,但我想获得一些反馈,以了解 SSasymp 是否是与此数据一起使用的正确函数,或者是否还有其他函数我可能会使用。

library(stats)
library(minpack.lm)
library(broom)
library(ggplot2)

df<-data.frame(Date=seq(1:66),
           Level=c(1438072839.75,   1397678053.5,   1358947420.5,   1313619938.25,  1269224528.25, 
1246776954.75,  1207201162.5,   1176229091.25,  1136063160, 1103721704.25,  1080591637.5,    
1048286667, 1017840460.5,   1001057052, 975815001,  943568665.5,    932026210.5,    916996593.75,    
903904288.5,    887578544.25,   871428547.5,    855417720,  843504839.25,   825835607.25,    
816060303.75,   803506361.25,   801213123,  797977217.25,   793483994.25,   780060123,  766265609.25,    
756172471.5,    746615497.5,    738002936.25,   723741644.25,   711969181.5,    696032998.5,     
686162453.25,   671953166.25,   674184571.5,    664739475,  641091932.25,   627358484.25,    
616740068.25,   602261552.25,   592440797.25,   584160403.5,    569780103.75,   556305753,   
551682927,  546535062,  537782506.5,    524251944.75,   519277188.75,   503598795,  498481312.5,     
487907885.25,   479760227.25,   474773064.75,   468246932.25,   460561701,  455266345.5,     
448451890.5,    447760119,  441236056.5,    438884417.25))

dfDecay<-nls(Level~ SSasymp(Date, Asym, R0, lrc), data = df)
dfFitted<-augment(dfDecay)
ggplot(df, aes(x=Date,y=Level))+geom_point()+  geom_line( aes(y=dfFitted$.fitted), color="red")

dfDecay2<-nlsLM(Level~b*exp(-a*Date), 
                   data = df,
                   start= list(a=.01,b=1.5e+09),
                   algorithm = "LM")
fitDecay2<-augment(dfDecay2)
ggplot(df, aes(x=Date,y=Level))+geom_point()+  geom_line( aes(y=fitDecay2$.fitted), color="red")

【问题讨论】:

标签: r dataframe regression exponential


【解决方案1】:

关于起始值:

  1. 取两边的对数并拟合线性模型。
  2. 参数应该具有相似的大小以避免数值问题,因此使用Level/1e9 代替Level。这只是改变了测量 Level 的单位。
  3. 使用线性模型的起始值,nls 应该足够了。

这给出了:

fm0 <- lm(log(Level/1e9) ~ Date, df)
st <- list(a = exp(coef(fm0)[[1]]), b = -coef(fm0)[[2]])
nls(Level/1e9 ~ a * exp(-b * Date ), df, start = st)

给予:

Nonlinear regression model
  model: Level/1e+09 ~ a * exp(-b * Date)
   data: df
     a      b 
1.3532 0.0183 
 residual sum-of-squares: 0.08055

Number of iterations to convergence: 4 
Achieved convergence tolerance: 4.023e-07

【讨论】:

  • 这是一个很好的回应,谢谢!不过有一个问题,是什么让你选择除以 1e9?
  • 查看mean(df$Level),因为具体数字无关紧要,只需使用易于编写的接近即可。
  • 我正在努力更好地理解这一点。我知道选择起始参数对于非线性模型非常重要。在运行自启动模型和您上面编写的模型时,我得到不同的衰减率结果,导致半衰期为 +-20 个月。为什么这个模型会被认为更有利于自启动功能?我了解您的模型,但我不确定如何解释衰减率的差异。
  • 检查两个结果的偏差,即残差平方和——偏差(fm),并进行比较。还要确保在每种情况下都使用相同的模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 2014-04-13
  • 2020-07-05
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多