9 votos

Logaritmo de la función Beta incompleta para grandes $\alpha,\beta$

La función de R pbeta se supone que calcula la función Beta incompleta regularizada. Si la bandera log=TRUE se pasa como argumento, se devuelve el logaritmo del resultado en su lugar.

He encontrado el siguiente error numérico. Evaluando:

pbeta(0.5555555, 1925.74, 33.7179, log=TRUE)

devuelve -Inf , lo cual es obviamente erróneo. El resultado correcto es (calculado con Mathematica):

$$\log\mathrm{I}_{0.5555555}(1925.74,33.7179) = -994.767594138466967$$

Para todos los demás valores que he probado, pbeta da la respuesta correcta. He inspeccionado el código fuente de pbeta pero no puede precisar el error.

Necesito un método preciso para calcular el logaritmo de la función Beta incompleta para valores grandes de $\alpha,\beta$ (del orden de miles). ¿Puede alguien sugerir una solución para pbeta ¿o una solución? ¿O tal vez una biblioteca diferente?

Informe de errores de R: https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=16332

2 votos

Podría ser bueno publicar esto en la lista de R-devel. r-project.org/mail.html

0 votos

exp(-1165.999736142461574)=0 en R. Parece que pbeta con el log simplemente hace log(0) .

1 votos

Estaba escribiendo una respuesta pero la pregunta ya está cerrada... @becko, usa: library(gsl); logpbeta <- function(x,a,b) log(hyperg_2F1(a+b,1,a+1,x)) + a*log(x)+b*log(1-x)-log(a)

7voto

Ηλίας Puntos 109

La función incompleta Beta se puede escribir con la ayuda de la función hipergeométrica de Gauss: $$B_x(a,b)=\frac{1}{a}x^a{(1-x)}^b F(a+b,1,a+1,x)$$ y la FCD del $Beta(a,b)$ distribución evaluada en $x$ es $$B_x(a,b)/B(a,b).$$ Una buena implementación de la función hipergeométrica de Gauss se encuentra en el gsl paquete - una envoltura para las funciones especiales de la Biblioteca Científica Gnu. Así que usted puede escribir el log-CDF así:

library(gsl)
logpbeta <- function(x,a,b) log(hyperg_2F1(a+b,1,a+1,x)) + a*log(x)+b*log(1-x)-log(a) - lbeta(a,b)

Y da el mismo resultado que Mathematica para tu ejemplo:

> logpbeta(0.5555555, 1925.74, 33.7179)
[1] -994.7676

No sé para qué rango de parámetros el resultado es correcto. Y no he encontrado la respuesta en el manual de referencia de GNU.

Tenga en cuenta que el cero que se obtiene con pbeta parece deberse a la evaluación de $B_x(a,b)$ seguido de la transformación logarítmica:

> x <- 0.5555555 
> a <- 1925.74
> b <- 33.7179
> log(hyperg_2F1(a+b,1,a+1,x)*x^a*(1-x)^b/a)
[1] -Inf
> hyperg_2F1(a+b,1,a+1,x)
[1] 2.298761
> x^a*(1-x)^b/a
[1] 0

2 votos

+1 Sin embargo, el problema con pbeta no es tan simple. Trazándolo para un rango de valores del primer argumento que cubra el intervalo $[0.5,0.6]$ será interesante. Entonces, ajuste una línea y estudie los residuos. Está claro que cualquier algoritmo R se rompe en algunos puntos (dispersos) de este intervalo y es inestable en todo momento.

0 votos

Hmm. ¿Se ha arreglado esto? x <- 0.5555555; a <- 1925.74; b <- 33.7179; pbeta(x,a,b,log=TRUE) me da -994.7683 con la versión de desarrollo del 24 de abril... quizá sea una diferencia de plataforma (Ubuntu 12.04, 32 bits)

0 votos

@BenBolker Me sale -994.7676 con el logpbeta función dada en mi respuesta. ¿Obtiene usted lo mismo?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X