/* * Contributed by David Bauer, copied from chisq_poisson, with trivial * modifications to change it to use the geometric distribution. */ double chisq_geometric(unsigned int *observed,double prob,int kmax,unsigned int nsamp) { unsigned int k; double *expected; double delchisq,chisq,pvalue; /* * Allocate a vector for the expected value of the bin frequencies up * to kmax-1. */ expected = (double *)malloc(kmax*sizeof(double)); for(k = 0;k<kmax;k++){ expected[k] = nsamp*gsl_ran_geometric_pdf(k+1,prob); } /* * Compute Pearson's chisq for this vector of the data with poisson * expected values. */ chisq = 0.0; for(k = 0;k < kmax;k++){ delchisq = ((double) observed[k] - expected[k])* ((double) observed[k] - expected[k])/expected[k]; chisq += delchisq; if(verbose == D_CHISQ || verbose == D_ALL){ printf("%u: observed = %f, expected = %f, delchisq = %f, chisq = %f\n", k,(double)observed[k],expected[k],delchisq,chisq); } } if(verbose == D_CHISQ || verbose == D_ALL){ printf("Evaluated chisq = %f for %u k values\n",chisq,kmax); } /* * Now evaluate the corresponding pvalue. The only real question * is what is the correct number of degrees of freedom. We have * kmax bins, so it should be kmax-1. */ pvalue = gsl_sf_gamma_inc_Q((double)(kmax-1)/2.0,chisq/2.0); if(verbose == D_CHISQ || verbose == D_ALL){ printf("pvalue = %f in chisq_geometric.\n",pvalue); } free(expected); return(pvalue); }
double test_geometric1_pdf (unsigned int n) { return gsl_ran_geometric_pdf (n, 1.0); }