00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "Numerics/sevd.h"
00034 #include "Numerics/studentttests.h"
00035
00036 namespace
00037 cmtk
00038 {
00039
00042
00043 template<class T>
00044 T
00045 MathUtil::Mean
00046 ( const unsigned int nValues, const T* values )
00047 {
00048 T mean = 0.0;
00049
00050 for ( unsigned int j = 0; j < nValues; j++ )
00051 mean += values[j];
00052 mean /= nValues;
00053
00054 return mean;
00055 }
00056
00057 template<class T>
00058 T
00059 MathUtil::Variance
00060 ( const unsigned int nValues, const T* values, const T mean, const bool unbiased )
00061 {
00062 T sumOfSquares = 0.0;
00063
00064 T sum = 0.0;
00065 for ( unsigned int j = 0; j < nValues; j++ )
00066 {
00067 const T s = values[j] - mean;
00068 sum += s;
00069 sumOfSquares += s*s;
00070 }
00071
00072 if ( unbiased )
00073 return (sumOfSquares - sum*sum/nValues) / (nValues-1);
00074 else
00075 return (sumOfSquares - sum*sum/nValues) / (nValues);
00076 }
00077
00078 template<class T>
00079 T
00080 MathUtil::Mean
00081 ( const std::vector<T>& values )
00082 {
00083 const size_t nValues = values.size();
00084
00085 T mean = 0.0;
00086 for ( size_t j = 0; j < nValues; j++ )
00087 mean += values[j];
00088 mean /= nValues;
00089
00090 return mean;
00091 }
00092
00093 template<class T>
00094 T
00095 MathUtil::Variance
00096 ( const std::vector<T>& values, const T mean, const bool unbiased )
00097 {
00098 const size_t nValues = values.size();
00099
00100 T sumOfSquares = 0.0;
00101 T sum = 0.0;
00102 for ( size_t j = 0; j < nValues; j++ )
00103 {
00104 const T s = values[j] - mean;
00105 sum += s;
00106 sumOfSquares += s*s;
00107 }
00108
00109 if ( unbiased )
00110 return (sumOfSquares - sum*sum/nValues) / (nValues-1);
00111 else
00112 return (sumOfSquares - sum*sum/nValues) / (nValues);
00113 }
00114
00115 template<class T>
00116 T
00117 MathUtil::Correlation
00118 ( const std::vector<T>& x, const std::vector<T>& y )
00119 {
00120 const size_t n = std::min( x.size(), y.size() );
00121
00122
00123 T meanx = 0, meany = 0;
00124 for ( size_t i = 0; i < n; ++i )
00125 {
00126 meanx += x[i];
00127 meany += y[i];
00128 }
00129 meanx /= n;
00130 meany /= n;
00131
00132
00133 T c = 0, xSq = 0, ySq = 0;
00134 T dx, dy;
00135 for ( size_t i = 0; i < n; ++i )
00136 {
00137 c += (dx=x[i]-meanx) * (dy=y[i]-meany);
00138 xSq += dx * dx;
00139 ySq += dy * dy;
00140 }
00141
00142 return static_cast<T>( c / (sqrt(xSq*ySq)+1e-20) );
00143 }
00144
00145 template<class T>
00146 T
00147 MathUtil::TTest
00148 ( const std::vector<T>& valuesX, const std::vector<T>& valuesY, T& t )
00149 {
00150 T averageX, averageY;
00151 return TTest( valuesX, valuesY, t, averageX, averageY );
00152 }
00153
00154 template<class T>
00155 T
00156 MathUtil::PairedTTest
00157 ( const std::vector<T>& valuesX, const std::vector<T>& valuesY, T& t, T& avgX, T& avgY )
00158 {
00159 const size_t nValues = valuesX.size();
00160
00161 avgX = Mean( valuesX );
00162 avgY = Mean( valuesY );
00163
00164 T SSD = 0;
00165 for ( size_t i = 0; i < nValues; ++i )
00166 SSD += Square( (valuesX[i]-avgX) - (valuesY[i]-avgY) );
00167
00168 t = (avgX - avgY) * sqrt( (nValues * (nValues-1)) / SSD );
00169
00170 double s = alglib::studenttdistribution(nValues-1, t);
00171 double p1 = 2 * ap::minreal(s, 1-s);
00172
00173 return (T) p1;
00174 }
00175
00178 template<class T>
00179 T
00180 MathUtil::TTest
00181 ( const std::vector<T>& valuesX, const std::vector<T>& valuesY, T& t, T& avgX, T& avgY )
00182 {
00183 const size_t nValuesX = valuesX.size();
00184 const size_t nValuesY = valuesY.size();
00185
00186 ap::real_1d_array apValuesX;
00187 apValuesX.setbounds( 0, nValuesX-1 );
00188 for (unsigned int i = 0; i < nValuesX; i++)
00189 apValuesX(i) = (double)(1.0 * valuesX[i]);
00190
00191 ap::real_1d_array apValuesY;
00192 apValuesY.setbounds( 0, nValuesY-1 );
00193 for (unsigned int i = 0; i < nValuesY; i++)
00194 apValuesY(i) = (double)(1.0 * valuesY[i]);
00195
00196 ap::real_value_type t_temp, p1, p2, p3;
00197
00198 avgX = MathUtil::Mean<T>( valuesX );
00199 avgY = MathUtil::Mean<T>( valuesY );
00200
00201 alglib::studentttest2( apValuesX, nValuesX, apValuesY, nValuesY, t_temp, p1, p2, p3 );
00202
00203 t = static_cast<T>( t_temp );
00204
00205 return static_cast<T>( p1 );
00206 }
00207
00210 template<class T>
00211 T
00212 MathUtil::TTest
00213 ( const std::vector<T>& valuesX, T& t, T& avgX )
00214 {
00215 const size_t nValuesX = valuesX.size();
00216
00217 avgX = Mean( valuesX );
00218 const T varianceX = Variance( valuesX, avgX, true );
00219
00220 t = avgX * nValuesX / sqrt( varianceX );
00221
00222 const double s = alglib::studenttdistribution(nValuesX-1, t);
00223 const double p1 = 2 * ap::minreal(s, 1-s);
00224
00225 return (T) p1;
00226 }
00227
00228 }