Cálculo da função hipergeométrica em R


8

Estou tendo uma tremenda dificuldade em avaliar com o pacote em R. No meu caso, os valores de , , são sempre números reais positivos. Mesmo assim, a função hipergeométrica é incrivelmente sensível aos seus valores. Não estou procurando por extrema precisão; Posso usar o Excel para obter uma estimativa aproximada da hipergeometria Guass que é adequada para meus propósitos.a b c2F1(uma,b;c;z)hypergeoumabc

Alguma sugestão para uma implementação em R que fornecerá um cálculo hipergeométrico gaussiano rápido, sem erros, se não super preciso, de números reais positivos com uma ampla gama de valores?

Edit: parece que há muito mais código para isso no MATLAB do que R. Quaisquer pensamentos sobre o porquê?


eu teria pensado que uma boa abordagem seria encontrar o maior termo na soma hipergeométrica e truncar esse termo. Dessa forma, você pode fatorar o maior termo e trabalhar com termos menores que 1 na soma. você também pode usar o método laplace na representação integral (adequadamente parametrizado para evitar problemas de contorno).
probabilityislogic

Respostas:


14

A menos que você precise avaliar a função hipergeométrica de Gauss para valores complexos dos parâmetros ou da variável, é melhor usar o gslpacote de Robin Hankin .

[0 0,1]]-,0 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
        }
}

Atualizar

Aqui está minha implementação alternativa com o pacote gmp (pelo menos por diversão)


1
Obrigado por uma solução simples e limpa para um problema não tão simples! Não há muita documentação sobre funções hipergeométricas gauss para R, portanto essa abordagem é valiosa.
precisa saber é

@benrolls Eu experimentei a função hipergeométrica do Gauss com o pacote hypergeo, o pacote gsl, outro método implementado por mim e o Mathematica também. Garanto que a solução fornecida acima é muito eficiente, nunca encontrei um bug ao usá-lo.
Stéphane Laurent

cuma

1

A fórmula de Stéphane Laurent acima é ótima. Tenho notado que às vezes produz NaNs quando a, b, csão grandes e zé negativo - Eu não tenho sido capaz de fixar as condições precisas para baixo. Nesses casos, podemos usar outra transformação hipergeométrica a partir da expressão alternativa de Stéphane. Isso leva a esta fórmula alternativa:

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
    }
}

Por exemplo:

> 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

todos os três concordando com o Mathematica Hypergeometric2F1. Esta fórmula parece bem comportado também para menores a, b, c. Observe que há casos em que essa fórmula fornece NaNe a de Stéphane não , no entanto. Melhor verificar caso a caso.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.