void test_multinomial(void){ double p[SIZE] = { .1, .2, .3, .4 }; int n[SIZE] = { 0, 0, 0, 0 }; int numdraws = 100; double prob; gsl_ran_multinomial(rng, SIZE, numdraws, p, n); printf("gsl_ran_multinomial\t%d\t", numdraws); print_double_array(p, SIZE); printf("\t"); print_int_array(n, SIZE); printf("\n"); prob = gsl_ran_multinomial_pdf(SIZE, p, n); printf("gsl_ran_multinomial_pdf\t"); print_double_array(p, SIZE); printf("\t"); print_int_array(n, SIZE); printf("\t%.12f\n", prob); prob = gsl_ran_multinomial_lnpdf(SIZE, p, n); printf("gsl_ran_multinomial_lnpdf\t"); print_double_array(p, SIZE); printf("\t"); print_int_array(n, SIZE); printf("\t%.12f\n", prob); }
CAMLprim value ml_gsl_ran_multinomial_pdf(value p, value n) { const size_t K = Double_array_length(p); LOCALARRAY(unsigned int, N, K); double r; register int i; for(i=0; i<K; i++) N[i] = Int_val(Field(n, i)); r = gsl_ran_multinomial_pdf(K, Double_array_val(p), N); return copy_double(r); }
double test_multinomial_pdf (unsigned int n_0) { /* The margional distribution of just 1 variate is binomial. */ size_t K = 2; /* Test use of weights instead of probabilities */ double p[] = { 0.4, 1.6}; const unsigned int sum_n = BINS; unsigned int n[2]; n[0] = n_0; n[1] =sum_n - n_0; return gsl_ran_multinomial_pdf (K, p, n); }
void pvalue_all_3d(gsl_rng * r, gsl_vector_uint *x, gsl_vector_uint *sums) { assert(x->size == sums->size); size_t i,j,k; size_t dim=x->size; unsigned int N=0; unsigned int NN=0; for(i=0;i<dim;i++) { N+=ELT(x,i); NN+=ELT(sums,i); } double *p=(double*)malloc(sizeof(double)*dim); for(i=0;i<dim;i++) { p[i]=((double)ELT(sums,i))/NN; } double cutoff = logRV(dim,x,sums,NN); fprintf(stderr,"cutoff = %f\n",cutoff); double rv; unsigned int positives=0; gsl_vector_uint *n=gsl_vector_uint_alloc(dim); FILE *graph_pos,*graph_neg; char buff[256]; sprintf(buff,"pvalue_graph_pos-%i-%i-%i.dat",x->data[0],x->data[1],x->data[2]); if ( (graph_pos=fopen(buff,"w+"))==NULL) { fprintf(stderr,"ERROR: Can't open pvalue_graph_pos.dat"); exit(-1); } sprintf(buff,"pvalue_graph_neg-%i-%i-%i.dat",x->data[0],x->data[1],x->data[2]); if ( (graph_neg=fopen(buff,"w+"))==NULL) { fprintf(stderr,"ERROR: Can't open pvalue_graph_neg.dat"); exit(-1); } double pr; double pv=0; unsigned int positivos=0; unsigned int total=0; pr=gsl_ran_multinomial_pdf(dim,p,x->data); printf("pr(x) = %f\n",pr); for (i=0; i <= N;i+=1) { SET_ELT(n,0,i); for(j=0; i+j<= N;j+=1) { SET_ELT(n,1,j); SET_ELT(n,2,N-(i+j)); rv=logRV(dim,n,sums,NN); pr=gsl_ran_multinomial_pdf(dim,p,n->data); //printf("%f %f\n",rv,cutoff); if (rv <= cutoff) { pv+=pr; positives++; fprintf(graph_pos,"%u %u %f\n",i,j,pr); } else { fprintf(graph_neg,"%u %u %f\n",i,j,pr); } total++; } } printf("pos = %u total = %u: ratio = %f\n",positives,total,((double)positives)/total); printf("pvalue2 = %f\n",pv); fclose(graph_pos); fclose(graph_neg); /*for (i = 0; i < runs; i++) { gsl_ran_multinomial (r, dim, N, p, n->data); rv=logRV(dim,n,sums,NN); if (rv <= cutoff) positives++; //fprintf(stderr,"%i: %i %i\t%f\t%i\n",i,n[0],n[1],rv,); }*/ free(p); //free(n); gsl_vector_uint_free(n); }