Doxygen Source Code Documentation
p2t.c File Reference
#include "mrilib.h"
Go to the source code of this file.
Defines | |
#define | ZERO 0.0 |
#define | ONE 1.0 |
#define | ACU 1.0e-15 |
#define | SAE -15.0 |
#define | TWO 2.0 |
#define | THREE 3.0 |
#define | FOUR 4.0 |
#define | FIVE 5.0 |
#define | SIX 6.0 |
Functions | |
double | lnbeta (double, double) |
double | incbeta (double, double, double, double) |
double | incbeta_inverse (double, double, double, double) |
double | qginv (double) |
int | main (int argc, char *argv[]) |
Define Documentation
|
Definition at line 235 of file p2t.c. Referenced by incbeta(). |
|
Definition at line 316 of file p2t.c. Referenced by incbeta_inverse(). |
|
Definition at line 315 of file p2t.c. Referenced by incbeta_inverse(). |
|
Definition at line 234 of file p2t.c. Referenced by incbeta(), and incbeta_inverse(). |
|
use soper's reduction formulae * Definition at line 312 of file p2t.c. Referenced by incbeta_inverse(). |
|
Definition at line 317 of file p2t.c. Referenced by incbeta_inverse(). |
|
Definition at line 314 of file p2t.c. Referenced by incbeta_inverse(). |
|
Definition at line 313 of file p2t.c. Referenced by incbeta_inverse(). |
|
Definition at line 233 of file p2t.c. Referenced by incbeta(), and incbeta_inverse(). |
Function Documentation
|
Definition at line 237 of file p2t.c. References ACU, ONE, p, q, and ZERO. Referenced by correl_t2p(), incbeta_inverse(), student_t2p(), student_t2pp(), and student_t2z().
00238 { 00239 double betain , psq , cx , xx,pp,qq , term,ai , temp , rx ; 00240 int indx , ns ; 00241 00242 if( p <= ZERO || q <= ZERO || x < ZERO || x > ONE ) return -1.0 ; 00243 00244 if( x == ZERO ) return ZERO ; 00245 if( x == ONE ) return ONE ; 00246 00247 /** change tail if necessary and determine s **/ 00248 00249 psq = p+q ; 00250 cx = ONE-x ; 00251 if( p < psq*x ){ 00252 xx = cx ; 00253 cx = x ; 00254 pp = q ; 00255 qq = p ; 00256 indx = 1 ; 00257 } else { 00258 xx = x ; 00259 pp = p ; 00260 qq = q ; 00261 indx = 0 ; 00262 } 00263 00264 term = ONE ; 00265 ai = ONE ; 00266 betain = ONE ; 00267 ns = qq + cx*psq ; 00268 00269 /** use soper's reduction formulae **/ 00270 00271 rx = xx/cx ; 00272 00273 lab3: 00274 temp = qq-ai ; 00275 if(ns == 0) rx = xx ; 00276 00277 lab4: 00278 term = term*temp*rx/(pp+ai) ; 00279 betain = betain+term ; 00280 temp = fabs(term) ; 00281 if(temp <= ACU && temp <= ACU*betain) goto lab5 ; 00282 00283 ai = ai+ONE ; 00284 ns = ns-1 ; 00285 if(ns >= 0) goto lab3 ; 00286 temp = psq ; 00287 psq = psq+ONE ; 00288 goto lab4 ; 00289 00290 lab5: 00291 betain = betain*exp(pp*log(xx)+(qq-ONE)*log(cx)-beta)/pp ; 00292 if(indx) betain=ONE-betain ; 00293 00294 return betain ; 00295 } |
|
Definition at line 325 of file p2t.c. References a, FIVE, FOUR, incbeta(), MAX, ONE, p, q, r, SAE, SIX, THREE, TWO, and ZERO. Referenced by correl_p2t(), main(), and student_p2t().
00326 { 00327 int indx , iex ; 00328 double fpu , xinbta , a,pp,qq, r,y,t,s,h,w , acu , 00329 yprev,prev,sq , g,adj,tx,xin ; 00330 00331 fpu = pow(10.0,SAE) ; 00332 00333 if( p <= ZERO || q <= ZERO || alpha < ZERO || alpha > ONE ) return -1.0 ; 00334 00335 if( alpha == ZERO ) return ZERO ; 00336 if( alpha == ONE ) return ONE ; 00337 00338 /** change tail if necessary **/ 00339 00340 if( alpha > 0.5 ){ 00341 a = ONE-alpha ; 00342 pp = q ; 00343 qq = p ; 00344 indx = 1 ; 00345 } else { 00346 a = alpha ; 00347 pp = p ; 00348 qq = q ; 00349 indx = 0 ; 00350 } 00351 00352 /** calculate the initial approximation **/ 00353 00354 lab2: 00355 r = sqrt(-log(a*a)) ; 00356 y = r - (2.30753 + 0.27061*r) / (ONE+(0.99229+0.04481*r)*r) ; 00357 if(pp > ONE && qq > ONE) goto lab5 ; 00358 00359 r = qq+qq ; 00360 t = ONE/(9.0*qq) ; 00361 t = r * pow( (ONE-t+y*sqrt(t)) , 3.0 ) ; 00362 if( t <= ZERO ) goto lab3 ; 00363 00364 t = (FOUR*pp+r-TWO)/t ; 00365 if( t <= ONE ) goto lab4 ; 00366 00367 xinbta = ONE-TWO/(t+ONE) ; goto lab6 ; 00368 00369 lab3: 00370 xinbta = ONE-exp((log((ONE-a)*qq)+beta)/qq) ; goto lab6 ; 00371 00372 lab4: 00373 xinbta = exp((log(a*pp)+beta)/pp) ; goto lab6 ; 00374 00375 lab5: 00376 r = (y*y-THREE)/SIX ; 00377 s = ONE/(pp+pp-ONE) ; 00378 t = ONE/(qq+qq-ONE) ; 00379 h = TWO/(s+t) ; 00380 w = y*sqrt(h+r)/h-(t-s)*(r+FIVE/SIX-TWO/(THREE*h)) ; 00381 xinbta = pp/(pp+qq*exp(w+w)) ; 00382 00383 /** solve for x by a modified newton-raphson method **/ 00384 00385 lab6: 00386 r = ONE-pp ; 00387 t = ONE-qq ; 00388 yprev = ZERO ; 00389 sq = ONE ; 00390 prev = ONE ; 00391 if(xinbta < 0.0001) xinbta = 0.0001 ; 00392 if(xinbta > 0.9999) xinbta = 0.9999 ; 00393 00394 #if 0 00395 iex = -5.0 / (pp*pp) - 1.0/(a*a) - 13.0 ; if( iex < SAE ) iex = SAE ; 00396 acu = pow(10.0,iex) ; 00397 #else 00398 acu = fpu ; 00399 #endif 00400 00401 lab7: 00402 y = incbeta( xinbta , pp,qq,beta ) ; 00403 if( y < ZERO ) return -1.0 ; 00404 xin = xinbta ; 00405 y = (y-a)*exp(beta+r*log(xin)+t*log(ONE-xin)) ; 00406 if(y*yprev <= ZERO) prev = MAX(sq, fpu) ; 00407 g = ONE ; 00408 00409 lab9: 00410 adj = g*y ; 00411 sq = adj*adj ; 00412 if(sq >= prev) goto lab10 ; 00413 tx = xinbta-adj ; 00414 if(tx >= ZERO && tx <= ONE) goto lab11 ; 00415 00416 lab10: 00417 g = g/THREE ; goto lab9 ; 00418 00419 lab11: 00420 if(tx == ZERO || tx == ONE ) goto lab10 ; 00421 if(prev <= acu || y*y <= acu || fabs(xinbta-tx) < fpu) goto lab12 ; 00422 xinbta = tx ; 00423 yprev = y ; 00424 goto lab7 ; 00425 00426 lab12: 00427 xinbta = tx ; 00428 if (indx) xinbta = ONE-xinbta ; 00429 #if 0 00430 printf("alpha = %g incbeta = %g\n",alpha, incbeta(xinbta,p,q,beta) ); 00431 #endif 00432 return xinbta ; 00433 } |
|
if the math library doesn't have the log(gamma(x)) function (as on Linux, for example) Definition at line 219 of file p2t.c. Referenced by correl_p2t(), correl_t2p(), main(), student_p2t(), student_t2p(), student_t2pp(), and student_t2z().
|
|
\** File : SUMA.c
Input paramters :
Definition at line 22 of file p2t.c. References argc, incbeta_inverse(), lnbeta(), qginv(), stinv(), strtod(), and tt.
00023 { 00024 double pp , dof , tt , bb , binv ; 00025 double nn,ll,mm ; 00026 int quiet = 0 ; 00027 00028 if( argc < 2 || strncmp(argv[1],"-help",5) == 0 ){ 00029 printf("\n*** NOTE: This program has been superseded by program 'cdf' ***\n\n") ; 00030 00031 printf("Usage #1: p2t p dof\n" 00032 " where p = double sided tail probability for t-distribution\n" 00033 " dof = number of degrees of freedom to use\n" 00034 " OUTPUT = t value that matches the input p\n" 00035 "\n" 00036 "Usage #2: p2t p N L M\n" 00037 " where p = double sided tail probability of beta distribution\n" 00038 " N = number of measured data points\n" 00039 " L = number of nuisance parameters (orts)\n" 00040 " M = number of fit parameters\n" 00041 " OUTPUT = threshold for correlation coefficient\n" 00042 "\n" 00043 "Usage #3: p2t p\n" 00044 " where p = one sided tail probability of Gaussian distribution\n" 00045 " OUTPUT = z value for which P(x>z) = p\n" 00046 "\n" 00047 "Usage #4: p2t p dof N\n" 00048 " where p = double sided tail probability for distribution of\n" 00049 " the mean of N iid zero-mean t-variables\n" 00050 " dof = number of degrees of freedom of each t-variable\n" 00051 " N = number of t variables averaged\n" 00052 " OUTPUT = threshold for the t average statistic\n" 00053 " N.B.: The method used for this calculation is the Cornish-\n" 00054 " Fisher expansion in N, and is only an approximation.\n" 00055 " This also requires dof > 6, and the results will be\n" 00056 " less accurate as dof approaches 6 from above!\n" 00057 ) ; 00058 exit(0) ; 00059 } 00060 00061 if( strcmp(argv[1],"-q") == 0 ){ 00062 argv++ ; 00063 argc-- ; 00064 quiet = 1 ; 00065 if( argc < 2 ) exit(0) ; 00066 } 00067 00068 /** Gaussian statistic **/ 00069 00070 if( argc == 2 ){ 00071 pp = strtod( argv[1] , NULL ) ; 00072 if( !quiet && (pp < 1.e-20 || pp >= 0.9999999) ){ 00073 fprintf(stderr,"command line p value is illegal!\a\n") ; exit(-1) ; 00074 } 00075 tt = qginv(pp) ; 00076 if( quiet ) printf("%g\n",tt) ; 00077 else printf("p = %g z = %g\n",pp,tt) ; 00078 } 00079 00080 /** t statistic **/ 00081 00082 else if( argc == 3 ){ 00083 pp = strtod( argv[1] , NULL ) ; 00084 dof = strtod( argv[2] , NULL ) ; 00085 if( !quiet && (pp <= 1.e-10 || pp >= 0.9999999) ){ 00086 fprintf(stderr,"command line p value is illegal!\a\n") ; exit(-1) ; 00087 } 00088 if( dof <= 1.0 ){ 00089 fprintf(stderr,"command line dof value is illegal!\a\n") ; exit(-1) ; 00090 } 00091 00092 #ifdef USE_OLD_METHOD 00093 tt = stinv( pp , dof ) ; 00094 #else 00095 bb = lnbeta( 0.5*dof , 0.5 ) ; 00096 binv = incbeta_inverse( pp, 0.5*dof , 0.5 , bb ) ; 00097 tt = sqrt( dof*(1.0/binv-1.0) ) ; 00098 #endif 00099 00100 if( quiet ) printf("%g\n",tt) ; 00101 else printf("p = %g dof = %g t = %g\n",pp,dof,tt) ; 00102 00103 /** beta statistic **/ 00104 00105 } else if( argc == 5 ){ 00106 pp = strtod( argv[1] , NULL ) ; 00107 nn = strtod( argv[2] , NULL ) ; 00108 ll = strtod( argv[3] , NULL ) ; 00109 mm = strtod( argv[4] , NULL ) ; 00110 if( !quiet && (pp <= 1.e-20 || pp >= 0.9999999) ){ 00111 fprintf(stderr,"command line p value is illegal!\a\n") ; exit(-1) ; 00112 } 00113 if( mm < 1.0 || ll < 0.0 || nn-ll-mm < 1.0 ){ 00114 fprintf(stderr,"command line N,L,M values are illegal!\a\n");exit(1) ; 00115 } 00116 bb = lnbeta( 0.5*mm , 0.5*(nn-ll-mm) ) ; 00117 binv = incbeta_inverse( pp, 0.5*(nn-ll-mm) , 0.5*mm , bb ) ; 00118 tt = sqrt(1.0-binv) ; 00119 if( quiet ) printf("%g\n",tt) ; 00120 else printf("p = %g N = %g L = %g M = %g rho = %g\n", 00121 pp,nn,ll,mm,tt) ; 00122 00123 /** averaged t statistic **/ 00124 00125 } else if( argc == 4 ){ 00126 double ww , xx , gam2,gam4 ; 00127 00128 pp = strtod( argv[1] , NULL ) ; 00129 dof = strtod( argv[2] , NULL ) ; 00130 nn = strtod( argv[3] , NULL ) ; 00131 00132 if( !quiet && (pp <= 1.e-10 || pp >= 0.9999999) ){ 00133 fprintf(stderr,"command line p value is illegal!\a\n") ; exit(-1) ; 00134 } 00135 if( dof <= 6.01 || nn < 1.0 ){ 00136 fprintf(stderr,"command line dof or N value is illegal!\a\n");exit(-1); 00137 } 00138 00139 /* 4th and 6th order moments */ 00140 00141 gam2 = 6.0 / ( (dof-4.0) * nn ) ; 00142 gam4 = 240.0 / ( (dof-6.0) * (dof-4.0) * nn * nn ) ; 00143 00144 /* Cornish-Fisher expansion */ 00145 00146 xx = qginv( 0.5 * pp ) ; /* Gaussian approx */ 00147 00148 ww = xx + gam2 * xx * ( xx*xx - 3.0) / 24.0 00149 + gam4 * xx * ( xx*xx*xx*xx - 10.0*xx*xx + 15.0) / 720.0 00150 - gam2 * gam2 * xx * (3.0*xx*xx*xx*xx - 24.0*xx*xx + 29.0) / 384.0 ; 00151 00152 tt = sqrt( dof/(dof-2.0)/nn ) * ww ; 00153 00154 if( quiet ) printf("%g\n",tt) ; 00155 else{ 00156 printf("p = %g dof = %g N = %g 4-term t = %g",pp,dof,nn,tt) ; 00157 00158 ww = xx + gam2 * xx * ( xx*xx - 3.0) / 24.0 ; 00159 tt = sqrt( dof/(dof-2.0)/nn ) * ww ; 00160 printf(" [2-term=%g",tt) ; 00161 ww = xx ; 00162 tt = sqrt( dof/(dof-2.0)/nn ) * ww ; 00163 printf(" 1-term=%g]\n",tt) ; 00164 } 00165 } 00166 00167 exit(0) ; 00168 } |
|
solve for x by a modified newton-raphson method * Definition at line 438 of file p2t.c.
00439 { 00440 double dp , dx , dt , ddq , dq ; 00441 int newt ; 00442 00443 dp = (p <= 0.5) ? (p) : (1.0-p) ; /* make between 0 and 0.5 */ 00444 00445 if( dp <= 0.0 ){ 00446 dx = 13.0 ; 00447 return ( (p <= 0.5) ? (dx) : (-dx) ) ; 00448 } 00449 00450 /** Step 1: use 26.2.23 from Abramowitz and Stegun **/ 00451 00452 dt = sqrt( -2.0 * log(dp) ) ; 00453 dx = dt 00454 - ((.010328e+0*dt + .802853e+0)*dt + 2.525517e+0) 00455 /(((.001308e+0*dt + .189269e+0)*dt + 1.432788e+0)*dt + 1.e+0) ; 00456 00457 /** Step 2: do 3 Newton steps to improve this **/ 00458 00459 for( newt=0 ; newt < 3 ; newt++ ){ 00460 dq = 0.5e+0 * erfc( dx / 1.414213562373095e+0 ) - dp ; 00461 ddq = exp( -0.5e+0 * dx * dx ) / 2.506628274631000e+0 ; 00462 dx = dx + dq / ddq ; 00463 } 00464 00465 return ( (p <= 0.5) ? (dx) : (-dx) ) ; /* return with correct sign */ 00466 } |