如何解析 R 中 x 的指数函数?
How can I resolve an exponential function for x in R?
我想更详细地分析对数增长曲线。特别是我想知道斜率变为 >0 的时间点(这是滞后期后增长的起点)。
因此,我使用 R 的 grofit 包为我的增长数据拟合了一个对数函数。我得到了三个参数(lambda、mu、最大渐近线)的值。
现在我想,我可以使用对数增长函数的一阶导数使 mu=0(增长期间任何时间点的斜率),这样就可以求解时间 (x) 的方程。我不确定这是否可能,因为 mu=0 在曲线开始的较长时间跨度内是正确的(并且没有唯一的时间点)。但也许我可以通过设置 mu=0.01 来近似于该点。这应该更具体。
无论如何,我使用 Deriv 包找到我的对数函数的一阶导数:
Deriv(a/(1+exp(((4*b)/a)*(c-x)+2)), "x")
其中 a=渐近线,b=最大斜率,c=lambda。
结果我得到了:
{.e2 <- exp(2 + 4 * (b * (c - x)/a))
4 * (.e2 * b/(.e2 + 1)^2)}
或者正常写法:
f'(x)=(4*exp(2+((4b(c-x))/a))*b)/((exp(2+((4b(c-x))/a)) +1)^2)
现在我想用 f'(x)=0.01 求解 x 的这个函数。谁能告诉我怎么做最好?
另外,你对我的思路或者我使用的R函数有什么意见吗?
谢谢。
安妮
可能不是最好的方法,但您可以使用 optim
函数找到解决方案。检查下面的代码,我基本上是在尝试找到最小化 abs(f(x) - 0.01)
的 x 值
x 的起始种子值可能很重要,optim
函数对于某些种子可能不会收敛。
fn <- function(x){
a <- 1
b<- 1
c <- 1
return( abs((4*exp(2+((4*b*(c-x))/a))*b)/ ((exp(2+((4*b*(c-x))/a))+1)^2) - 0.01) )
}
x <- optim(10,fn)
x$par
使用求根函数比使用优化函数更合适。
我举两个包的例子。
绘制一系列值的函数也是个好主意。
像这样:
curve(fn,-.1,.1)
您可以看到,使用基本 R 函数 uniroot
会出现问题,因为它需要区间端点处的函数值具有相反的符号。
像这样使用包 nleqslv
library(nleqslv)
nleqslv(1,fn)
给予
$x
[1] 0.003388598
$fvec
[1] 8.293101e-10
$termcd
[1] 1
$message
[1] "Function criterion near zero"
<more info> ......
使用包 pracma
中的函数 fsolve
library(pracma)
fsolve(fn,1)
给予
$x
[1] 0.003388585
$fval
[1] 3.136539e-10
两个包给出的解非常接近。
非常感谢您的努力。不幸的是,上述解决方案中的 none 对我有用:-(
我用老式的方法(铅笔+纸+数学书)解决了这个问题。
祝你有美好的一天
安妮
我想更详细地分析对数增长曲线。特别是我想知道斜率变为 >0 的时间点(这是滞后期后增长的起点)。 因此,我使用 R 的 grofit 包为我的增长数据拟合了一个对数函数。我得到了三个参数(lambda、mu、最大渐近线)的值。 现在我想,我可以使用对数增长函数的一阶导数使 mu=0(增长期间任何时间点的斜率),这样就可以求解时间 (x) 的方程。我不确定这是否可能,因为 mu=0 在曲线开始的较长时间跨度内是正确的(并且没有唯一的时间点)。但也许我可以通过设置 mu=0.01 来近似于该点。这应该更具体。 无论如何,我使用 Deriv 包找到我的对数函数的一阶导数:
Deriv(a/(1+exp(((4*b)/a)*(c-x)+2)), "x")
其中 a=渐近线,b=最大斜率,c=lambda。
结果我得到了:
{.e2 <- exp(2 + 4 * (b * (c - x)/a))
4 * (.e2 * b/(.e2 + 1)^2)}
或者正常写法:
f'(x)=(4*exp(2+((4b(c-x))/a))*b)/((exp(2+((4b(c-x))/a)) +1)^2)
现在我想用 f'(x)=0.01 求解 x 的这个函数。谁能告诉我怎么做最好?
另外,你对我的思路或者我使用的R函数有什么意见吗?
谢谢。 安妮
可能不是最好的方法,但您可以使用 optim
函数找到解决方案。检查下面的代码,我基本上是在尝试找到最小化 abs(f(x) - 0.01)
x 的起始种子值可能很重要,optim
函数对于某些种子可能不会收敛。
fn <- function(x){
a <- 1
b<- 1
c <- 1
return( abs((4*exp(2+((4*b*(c-x))/a))*b)/ ((exp(2+((4*b*(c-x))/a))+1)^2) - 0.01) )
}
x <- optim(10,fn)
x$par
使用求根函数比使用优化函数更合适。 我举两个包的例子。
绘制一系列值的函数也是个好主意。 像这样:
curve(fn,-.1,.1)
您可以看到,使用基本 R 函数 uniroot
会出现问题,因为它需要区间端点处的函数值具有相反的符号。
像这样使用包 nleqslv
library(nleqslv)
nleqslv(1,fn)
给予
$x
[1] 0.003388598
$fvec
[1] 8.293101e-10
$termcd
[1] 1
$message
[1] "Function criterion near zero"
<more info> ......
使用包 pracma
fsolve
library(pracma)
fsolve(fn,1)
给予
$x
[1] 0.003388585
$fval
[1] 3.136539e-10
两个包给出的解非常接近。
非常感谢您的努力。不幸的是,上述解决方案中的 none 对我有用:-( 我用老式的方法(铅笔+纸+数学书)解决了这个问题。 祝你有美好的一天 安妮