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