Rでの超幾何関数の計算


8

R のパッケージでを評価するのは非常に困難です。私の場合、、、値は常に正の実数です。それでも、超幾何関数はその値に非常に敏感です。私は極端な精度を求めていません。Excelを使用して、目的に適したGuass超幾何の大まかな見積もりを取得できます。a b c2F1(a,b;c;z)hypergeoabc

広範囲の値を持つ正の実数のガウシアン超幾何計算を非常に正確ではないにしても、高速でエラーのないRで実装するための提案はありますか?

編集:MATLABにはこれよりRよりはるかに多くのコードがあるようです。なぜかについての考えはありますか?


超幾何和の中で最大の項を見つけて、この項の周りを切り捨てるのが良い方法だと私は思ったでしょう。このようにして、最大の項を除外して、合計が1未満の項を処理できます。また、積分表現でラプラス法を使用することもできます(境界の問題を回避するために適切にパラメーター化されています)。
確率論的

回答:


14

パラメータまたは変数の複雑な値についてガウス超幾何関数を評価する必要がない限り、Robin Hankinのgslパッケージを使用することをお勧めします。

私の経験に基づいて、にある変数の値に対してガウス超幾何関数のみを評価し、値に変換式を使用することもお勧めします。] - 0 ][0,1]],0]

library(gsl)
Gauss2F1 <- function(a,b,c,x){
    if(x>=0 & x<1){
        hyperg_2F1(a,b,c,x)
    }else{
            hyperg_2F1(c-a,b,c,1-1/(1-x))/(1-x)^b
        }
}

更新

これは、gmpパッケージを使用した私の代替実装です(少なくとも、楽しみのために)。


1
それほど単純ではない問題に対する単純でクリーンな解決策をありがとう!Rのガウス超幾何関数に関するドキュメントは多くないので、このアプローチは価値があります。
12

@benrolls私はhypergeoパッケージ、gslパッケージ、自分で実装した別のメソッド、およびMathematicaでガウス超幾何関数を体験しました。私が上記で与えた解決策が非常に高性能であることを保証します。それを使用するときにバグを発見したことはありません。
ステファン・ローラン

上記のステファンの公式はすばらしいですが、が負で絶対値が大きいときにNaNを生成することに気づきました。別の変換式を使用すると、次のようになります。library(gsl)ca
pglpm

1

上記の@StéphaneLaurentの式は素晴らしいです。私はそれが時々生じていることに気づいたNaN時にねabc大規模であり、z私がダウンして正確な条件を固定することができていない-マイナスです。これらの場合、ステファンの代替表現から始まる別の超幾何変換を使用できます。それはこの代替式につながります:

library(gsl)
Gauss2F1b <- function(a,b,c,x){
    if(x>=0 & x<1){
        hyperg_2F1(a,b,c,x)
    }else{
        hyperg_2F1(a,c-b,c,1-1/(1-x))/(1-x)^a
    }
}

例えば:

> Gauss2F1(80.2,50.1,61.3,-1)
[1] NaN
>
> Gauss2F1b(80.2,50.1,61.3,-1)
[1] 5.498597e-20
>
>
> Gauss2F1(80.2,50.1,61.3,-3)
[1] NaN
> Gauss2F1b(80.2,50.1,61.3,-3)
[1] 5.343807e-38
>
>
> Gauss2F1(80.2,50.1,61.3,-0.4)
[1] NaN
> Gauss2F1b(80.2,50.1,61.3,-0.4)
[1] 3.322785e-10

3つすべてがMathematicaに同意しHypergeometric2F1ます。この式は十分に小さいためにも振る舞ったようですabc。ただし、この式が与える場合NaNとStéphane が与えない場合があります。ケースバイケースで確認することをお勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.