如何解决R中3参数weibull的拐点?
R 中的 drc
包包含自启动函数,用于将 3 参数 Weibull 模型拟合到数据。该包给出了 3 参数 weibull (https://cran.r-project.org/web/packages/drc/drc.pdf) 的 2 个参数化:
f(x) = 0 + (d − 0) exp(− exp(b(log(x) − log(e))))
f(x) = 0 + (d − 0)(1 − exp(− exp(b(log(x) − log(e)))))
包的文档表明,d
表示上渐近线,b
是速率参数,并且曲线在剂量 e
处有一个拐点。但是,绘制这些函数并使用 R 求解何时二阶导数 = 0 会给出与拐点 e
不同的值。例如:
dd=1
bb = -5
ee = 30
curve(dd*exp(-exp(bb * (log(x) - log(ee))) ),xlim=c(0,100))
abline(v=ee)
# 1st deriv
g <- function(x) {}
body(g) <- D( expression(dd*exp(-exp(bb * (log(x) - log(ee))) )),"x")
curve(g,100))
abline(v=ee)
# 2nd deriv
g <- function(x) {}
body(g) <- D(D( expression(dd*exp(-exp(bb * (log(x) - log(ee))) )),"x"),100))
abline(v=ee)
uniroot(g,c(20,50)) # should be 30,but is not?
文档不正确吗?或者这是否与 weibull 的特定记录参数化有关(将其限制为正数)?
解决方法
我认为文档是错误的。
exp(-exp(x))
在 0 处有一个拐点:
DD <- function(expr,name,order = 1) {
if(order < 1) stop("'order' must be >= 1")
if(order == 1) D(expr,name)
else DD(D(expr,name),order - 1)
}
DD( expression(exp(-exp(x))),"x",2)
#-(exp(-exp(x)) * exp(x) - exp(-exp(x)) * exp(x) * exp(x))
exp(0)
等于 1。因此,我们有:
-(1/e - 1*e) = 0
我可以看到当内指数的参数变为零时,人们如何假设 exp(-exp(log(x) - log(c)))
也会有一个拐点。但事实并非如此,因为 log
会改变曲率和二阶导数:
DD( expression(exp(-exp(log(x) - log(c)))),2)
#-(exp(-exp(log(x) - log(c))) * (exp(log(x) - log(c)) * (1/x) *
# (1/x) - exp(log(x) - log(c)) * (1/x^2)) - exp(-exp(log(x) -
# log(c))) * (exp(log(x) - log(c)) * (1/x)) * (exp(log(x) -
# log(c)) * (1/x)))
如果我们让 x = c,我们有:
-(1/e * (1 * 1/c * 1/c - 1 * 1/c^2) - 1/e * 1 * 1/c * 1 * 1/c)
= -(0 - 1/e * 1/c^2)
= 1/e * 1/c^2
这不是 0。
只是为了检查我的数学:
g <- function(x) {}
body(g) <- DD( expression(exp(-exp(log(x) - log(c)))),2)
c <- 2
g(2)
#[1] 0.09196986
1/exp(1) * 1/2^2
#[1] 0.09196986
(为了额外的功劳,你应该手工做二阶导数。我没有那么多时间。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。