00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00027 #ifndef _LTQNORM_H
00028 #define _LTQNORM_H
00029
00030 #ifdef HAVE_GSL
00031 #include "gsl/gsl_cdf.h"
00032 #endif
00033
00034
00035 extern "C"
00036 {
00037 double ltqnorm(double p);
00038
00040 double gaussianPvalue(double r, double mean = 0, double sigma = 1);
00041 }
00042
00043 const double LTQNORM_LARGEST_Z = 8.20954;
00044
00045
00046 const double LTQNORM_SMALLEST_INVERSE = 1.11022e-16;
00047
00048
00049
00050
00054 inline MyNT computeInverseNormalPvalueTransform(MyNT x)
00055 {
00056 #ifdef HAVE_GSL
00057 return(gsl_cdf_ugaussian_Qinv(x));
00058 #else
00059
00060
00061 if (x <= LTQNORM_SMALLEST_INVERSE)
00062 return(LTQNORM_LARGEST_Z);
00063 return(ltqnorm(1 - x));
00064 #endif
00065 }
00066
00069 struct inverseNormalPvalueTransform : public unary_function< MyNT, MyNT >
00070 {
00071 MyNT operator()(const MyNT __x) const
00072 {
00073 return(computeInverseNormalPvalueTransform(__x));
00074 }
00075
00076 };
00077
00084 inline void ltqnormThreshold(MyNT &x, MyNT &inverse, unsigned int num = 100)
00085 {
00086 x = 1;
00087 while (true)
00088 {
00089
00090 inverse = computeInverseNormalPvalueTransform(x);
00091
00092 cout << "x = " << x << ", inverse = " << inverse << endl;
00093
00094 x = x/2;
00095
00096
00097 num--;
00098 if (0 == num)
00099 break;
00100 }
00101
00102
00103 }
00104
00105
00106
00107 #endif // _LTQNORM_H