我使用pracma
包,特别是Brent-Dekker根寻找算法,搜索根到一个函数,该函数设置观察变异系数(CV obs)等于模拟(CV sim)。
虽然在个人基础上我可以对算法提供初始间隔的良好估计(例如brent(f, a, b)
中的[a,b]),但我正在处理大量的年/区/等。为此我找到了根,并且间隔范围不那么宽容 - 就我遇到的情况而言,它需要非常狭窄。以下是我的代码的一般要点:
library(pracma)
CV <- function(x){ #coefficient of variation
sd(x)/mean(x)
}
fb <- function(b){ #this is my function
CV(obs)-CV(sim^b)
}
for (i in ...) { #regions
for (j in ...) { #years... etc.
obs <- some.dataframe
sim <- some.df.2
z1 <- brent(fb, 0.5,2) #where z1$root is the solution
}
}
我想知道是否有相关的包或方法来确定我的for循环中的初始间隔,或者是否有修改以便我可以将此间隔留空(我不使用Python但是例如{{3}间隔是可选的)。
我希望有意义,乐于提供更多背景信息。
答案 0 :(得分:0)
我不知道这是否符合您的要求,但scanf()
使用(某种形式)布伦特的方法:archive pointed to by ?stats::uniroot
说:
此文件包含Brent的单变量最小化器和零查找器。
C实现(适应)算法
G.Forsythe,M.Malcolm,C.Moler,计算机方法 数学计算。
stats::uniroot
有一个uniroot()
参数,默认为“no”,但可以设置为“yes”:
extendInt
:字符串,指定间隔'c(lower,upper)' 当'f()'时应该扩展或直接产生错误 在端点没有不同的标志。
因此您不能将间隔留空,但算法会尝试优雅地调整为“不良”选择。