私はGEV分布の分位数を計算する関数を書いています。この質問に関連する態様は、パラメータ(形状パラメータまたはカッパ)の一方がゼロゼロとの浮動小数点の比較
これは一般にアドレス指定されるプログラムである場合、機能の異なる形態が必要とされることです次のように(:qgevとlmomcoが似ている:: quagevこれはEVDからの抜粋です):
(編集:lmomcoのバージョン2.2.2、この問題の識別問題に対処しています)
if (shape == 0)
return(loc - scale * log(-log(p)))
else return(loc + scale * ((-log(p))^(-shape) - 1)/shape)
これは、shape/kappaがゼロに正確に等しいがゼロ付近で奇妙な振る舞いがある場合にうまくいきます。同じ答えがゼロに近く、ゼロで返されるので、これは正常に見える
Qgev_zero <- function(shape){
# p is an exceedance probability
p= 0.01
location=0
scale=1
if(shape == 0) return(location - scale*(log(-log(1-p))))
location + (scale/shape)*((-log(1-p))^-shape - 1)
}
Qgev_zero(0)
#[1] 4.600149
Qgev_zero(1e-8)
#[1] 4.600149
:
は例を見てみましょう。しかし、ゼロに近いものを見てください。
k.seq <- seq(from = -4e-16, to = 4e-16, length.out = 1000)
plot(k.seq, sapply(k.seq, Qgev_zero), type = 'l')
関数によって返される値は、多くの場合、間違っています振動します。
ゼロとの直接比較をall.equal
に置き換えると、これらの問題はなくなります。 all.equal
のヘルプを見ると
if(isTRUE(all.equal(shape, 0))) return(location - scale*(log(-log(1-p))))
は、デフォルト値については、1.5E-8よりも小さいものをゼロとして扱われることを示唆しています。
もちろん、ゼロ付近の奇妙な振る舞いは一般的には問題ではありませんが、私の場合は既知の分位数からパラメータを決定するために最適化/根検索を使用しています。
質問には:all.equal(target, 0)
この問題に対処する適切な方法を使用していますか?このアプローチが日常的に使われていないのはなぜですか?
自分自身を教育します。数値精度でR-FAQを読んでください(Mac上のリンク:http://127.0.0.1:18795/doc/manual/R-FAQ.html#Why-doesn_0027t-R-think-the-number- equal_003f)、完全一致をテストするためにSOを検索し、 '?all.equal'とそのページのすべての例とリンクを読み込みます。 –
数値精度のR-FAQへのリンク[https://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f](https ://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f) –
興味深い記事があります[ここ](http: /realtimecollisiondetection.net/blog/?p=89) –