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 quepbeta
con ellog
simplemente hacelog(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)
1 votos
@StéphaneLaurent Tienes razón, es el cdf. Error tonto por mi parte. He eliminado el comentario.
1 votos
Becko, si modificas tu pregunta (y el título) para preguntar sobre las formas de calcular la log cdf de una beta donde ambos argumentos son muy grandes (reduciendo el enfoque en cuestiones numéricas en la función de R), creo que estaría en el tema. (Para ser honesto, me gustaría que la presente pregunta fuera sobre el tema aquí).
0 votos
@becko ¿Estás usando Linux? Si es así, creo que tienes que instalar
libgsl0-dev
.0 votos
@becko Oh, espera, ni siquiera has instalado el paquete R gsl. En Windows,
install.packages(gsl)
debería funcionar, y en Linux hay que hacerlo después de instalarlibgsl0-dev
.0 votos
@becko Lo siento,
install.packages("gsl")
o cualquier forma habitual de instalar un paquete.0 votos
@StéphaneLaurent Sí, eso funciona. Lo siento, no sabía cómo instalar paquetes en R. El uso de la función hipergeométrica da el resultado correcto. ¿Para qué rango de valores de $\alpha,\beta$ y $x$ ¿es esto exacto?
0 votos
@becko No conozco el rango de validez. Si confías en los resultados de Mathematica entonces podrías comparar para tus valores máximos de los parámetros.
0 votos
@becko Ten cuidado, se me olvidó el $1/B(a,b)$ factor. Ver mi respuesta que acabo de editar ahora para hacer la corrección.
0 votos
Genial, gracias. Definitivamente me pareció un error, sobre todo porque al evaluar un rango de valores parece dar una salpicadura de Inf's.
pbeta(seq(0.5555555, .56, length.out=1000), 1925.74, 33.7179, log=TRUE)