EukPhylo/PTL2/Scripts-GRID/guidance.v2.02/libs/phylogeny/extremeValDistribution.cpp
Katzlab dd76ab1d12 Added PTL2 Scripts
These are PTL2 files from Auden 2/9
2023-02-14 11:20:52 -05:00

67 lines
1.7 KiB
C++

#include "extremeValDistribution.h"
#include <cmath>
using namespace std;
extremeValDistribution::extremeValDistribution()
: _alpha(0), _beta(0)
{
}
extremeValDistribution::extremeValDistribution(const extremeValDistribution& other)
{
_alpha = other._alpha;
_beta = other._beta;
}
extremeValDistribution& extremeValDistribution::operator=(const extremeValDistribution& other)
{
_alpha = other._alpha;
_beta = other._beta;
return *this;
}
extremeValDistribution::~extremeValDistribution()
{
}
/*fits the _alpha and _beta parameters based on a population mean and std.
Based on the following arguments:
1. If variable Z has a cumulative distribution F(Z) = exp(-exp((-z))
Then E(Z) = EULER_CONSTANT
Var(Z) = pi^2/6
2. We assign Z = (X-_alpha) / _beta --> X = _beta*Z + _alpha
and we get:
E(X) = _beta*E(Z)+_alpha = _beta*EULER_CONSTANT+_alpha
Var(X) = _beta^2*pi^2/6
3. We can now find _alpha and _beta based on the method of moments:
mean = _beta*EULER_CONSTANT+_alpha
s = _beta * pi / sqrt(6)
4. And solve:
_beta = s * qsrt(6) / pi
_alpha = mean - _beta*EULER_CONSTANT
*/
void extremeValDistribution::fitParametersFromMoments(MDOUBLE mean, MDOUBLE s)
{
_beta = s * sqrt(6.0) / PI;
_alpha = mean - (_beta * EULER_CONSTANT);
}
MDOUBLE extremeValDistribution::getCDF(MDOUBLE score) const
{
MDOUBLE res = exp(-exp(-(score-_alpha) / _beta));
return res;
}
//get y such that pVal = CDF(y):
// pVal = exp(-exp(-(y-alpha)/beta))
// ln(-ln(pVal)) = -(y-alpha)/beta
// y = alpha - beta*ln(-ln(pVal))
MDOUBLE extremeValDistribution::getInverseCDF(MDOUBLE pVal) const
{
MDOUBLE res = _alpha - _beta * log(-log(pVal));
return res;
}