Martin and others,

Following up, I have a particular example for which both Q and P variants
of inverse functions fail.

where as scipy beta.ppf (equivalent to gsl_cdf_beta_Pinv) does the right
thing and converges to 1 or nearest double.

I am attaching a very simple example with exact same data, the gsl function
fails where as scipy function does the right thing.

Any thoughts? any workarounds? Maybe there is a way I can specify
convergence criteria?

Thanks,
Vasu


On Wed, Jan 8, 2020 at 12:42 PM Vasu Jaganath <vadie.develo...@gmail.com>
wrote:

> Thanks Martin,
>
> I will test it out.
>
> On Tue, Jan 7, 2020 at 11:16 PM Martin Jansche <mjans...@gmail.com> wrote:
>
>> There are many more floating point values between 0.0 and 0.001 than
>> there are between 0.999 and 1.0. The difference between 1.0 and the next
>> smaller double value is only around 1e-16, but the next larger double value
>> after 0.0 is about 1e-303. So beta_P(0.9, 1, 17) will be necessarily
>> equivalent to 1.0 due to lack of precision, whereas beta_Q(0.9, 1, 17) will
>> be 1e-17. (Haven't tried this in GSL. You may want to try and report back.)
>>
>> On Wed, Jan 8, 2020 at 1:35 AM Vasu Jaganath <vadie.develo...@gmail.com>
>> wrote:
>>
>>> Hi all,
>>>
>>> This is probably a very silly question,
>>>
>>> I don't understand why there are two separate  P and Q variants for CDFs?
>>> particularly for beta distribution?
>>>
>>>
>>> https://www.gnu.org/software/gsl/doc/html/randist.html#the-beta-distribution
>>>
>>> Thanks,
>>> Vasu
>>>
>>
#include <stdio.h>
#include <math.h>
#include <gsl/gsl_rng.h> // for beta-PDF,GSL library
#include <gsl/gsl_randist.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_integration.h>

int main ()
{
  double aa = 5.3729222;
  double bb = 0.018122864;
  double x = 0.67276126;
  //printf ("beta CDF = % .18f\n", gsl_cdf_beta_Qinv(x,aa,bb));
  printf ("beta CDF = % .18f\n", gsl_cdf_beta_Pinv(x,aa,bb));

  return 0;
}
#!/usr/bin/env python3

from scipy.stats import beta

aa = 5.3729222;
bb = 0.018122864;
x = 0.67276126;

#ppf is the inverse CDF_P in scipy
print(beta.ppf(x,aa,bb))

Reply via email to