double LogLikGamma(Vec_I_DP &x) { //This function returns the negative value of the LogLikelihood const double dPi=3.1415926535897932384626433832795; int i,j; double dTemp=0.; double dLog10=log(10.); RevTransform(x); int nSize=g_vHistNode.size(); int nComponents=g_GammaTrialNode.nNumComponents; int nFuncKey=g_GammaTrialNode.nFuncKey; double dX,dX0,dX1; const double dH=g_GammaTrialNode.dH; double dLogLik=0.; double dLik=0.,dExp=0.,dDenorm=0.; double dR,dW,dArea; dX0=g_GammaTrialNode.fFittingRange.fLeft; dX1=g_GammaTrialNode.fFittingRange.fRight; dArea=0.; for(j=0;j<nComponents;j++) { dR=g_GammaResultNode.dRol[j]; dW=g_GammaResultNode.dWeights[j]; dTemp=GammaDistribution_Area(dH,dR,dX0,dX1); dArea+=dTemp; } switch (nFuncKey) { case 1: for(i=0;i<nSize;i++) { dLik=0.; dX=g_vHistNode[i].dLeft; for(j=0;j<nComponents;j++) { dR=g_GammaResultNode.dRol[j]; dW=g_GammaResultNode.dWeights[j]; dTemp=GammaDistribution(dH,dR,dX); dLik+=dTemp; } dLogLik+=log(dLik*dArea)/dLog10; } break; case 2: for(i=0;i<nSize;i++) { dLik=0.; dX0=g_vHistNode[i].dLeft; dX1=g_vHistNode[i].dRight; for(j=0;j<nComponents;j++) { dR=g_GammaResultNode.dRol[j]; dW=g_GammaResultNode.dWeights[j]; dTemp=GammaDistribution_Area(dH,dR,dX0,dX1); dLik+=dTemp; } dLogLik+=log(dLik*dArea*g_vHistNode[i].dData)/dLog10; } break; } return -dLogLik; }
Real ChiSquareDistribution::operator()(Real x) const { return GammaDistribution(0.5*df_)(0.5*x); }