/* Main function to be called */ void errbars (int numparams, double *p, struct kslice *ks, double **covar) { int ii, ij, ik; lapack_int n, lda, info, worksize; char c; double *fish, *fish2, *work, *rscale, *cscale; double row, col, amax; int *piv; printf("\tBEGIN ERROR BAR COMPUTATION\n\tUSER ENCOURAGED TO PRAY\n"); c = 'U'; fish = malloc(numparams*numparams*sizeof(double)); piv = malloc(numparams*numparams*sizeof(int)); fish2 = malloc(numparams*numparams*sizeof(double)); rscale = malloc(numparams*sizeof(double)); cscale = malloc(numparams*sizeof(double)); /* compute fisher information matrix */ fisher(numparams, p, ks, fish); fisher(numparams, p, ks, fish2); n = numparams; lda = numparams; dgeequ_(&n, &n, fish, &lda, rscale, cscale, &row, &col, &amax, &info); /* for (ii=0; ii<numparams; ii++) for (ij=0; ij<numparams; ij++) fish[ii*numparams+ij] *= rscale[ii]*cscale[ij]; */ n = numparams; lda = numparams; dgetrf_(&n, &n, fish, &lda, piv, &info); worksize = 32*n; work = malloc(worksize*sizeof(double)); dgetri_(&n, fish, &lda, piv, work, &worksize, &info); /* for (ii=0; ii<numparams; ii++) for (ij=0; ij<numparams; ij++) fish[ii*numparams+ij] *= rscale[ij]*cscale[ii]; */ /* compute inverse of fisher information matrix */ /* for (ii=0; ii<numparams; ii++) { for (ij=0; ij<numparams; ij++) printf("%d\t%d\t%e\n", ii, ij, (fish[ii*numparams+ij])); printf("\n"); } */ /* return */ *covar = fish; /* free local memory */ free(work); free(piv); }
virtual double execute( const GenoVec& geno, const PhenoVec& pheno, const unsigned cardGenotype, const unsigned cardPhenotype ) const { return fisher(geno, pheno, cardGenotype, cardPhenotype); }
double student ( int df, double t ) /******************************************************************************/ { return ( fisher ( 1, df, t*t ) ); }