44#include <initializer_list>
58#pragma clang diagnostic push
59#pragma clang diagnostic ignored "-Wdeprecated-declarations"
60#elif defined(__GNUC__)
61#pragma GCC diagnostic push
62#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
63#elif defined(_MSC_VER)
65#pragma warning(disable : 4996)
87template <
class Distribution>
90template <
class Distribution>
91concept FittableModel =
requires(Distribution distribution, std::span<const typename Distribution::value_type> sample,
93 { FitModel<Distribution>::parameters(distribution) } -> std::same_as<std::vector<FitParameter>>;
94 { FitModel<Distribution>::make(parameters) } -> std::same_as<Distribution>;
95 { FitModel<Distribution>::initial(sample, method, fixed) } -> std::same_as<Distribution>;
96 { FitModel<Distribution>::hasClosedForm(method) } -> std::same_as<bool>;
106 return std::log(value - *
parameter.lower);
108 return std::log(*
parameter.upper - value);
117 const double inverse = std::exp(-value);
124 return *
parameter.lower + std::exp(value);
126 return *
parameter.upper - std::exp(value);
132 if (!std::isfinite(value))
138 if (
parameter.integral && value != std::round(value))
148 std::string(distribution) +
" distribution: requested fitting method is not implemented");
151template <
class Distribution>
162 const long double sum = std::accumulate(sample.begin(), sample.end(), 0.0L);
163 const long double mean =
sum / sample.size();
165 for (
T value : sample) {
175 std::vector<T>
sorted(sample.begin(), sample.end());
176 std::ranges::sort(
sorted);
177 const double index = probability * (
sorted.size() - 1);
178 const std::size_t lower =
static_cast<std::size_t
>(index);
179 const std::size_t upper = std::min(lower + 1,
sorted.size() - 1);
180 const double fraction = index - lower;
184template <std::
size_t Rows, std::
size_t Columns>
188 const auto bracket = [](
const auto &
grid,
double value) {
189 const auto upper = std::ranges::upper_bound(
grid, value);
190 if (upper ==
grid.begin())
191 return std::pair<std::size_t, double>{0, 0};
192 if (upper ==
grid.end())
193 return std::pair<std::size_t, double>{
grid.size() - 2, 1};
194 const std::size_t
lowerIndex =
static_cast<std::size_t
>(upper -
grid.begin() - 1);
206 std::string_view distribution)
208 const auto found = fixed.find(name);
209 if (
found == fixed.end())
211 if (
found->second < 1 ||
found->second > std::numeric_limits<int>::max() ||
213 throw std::invalid_argument(
"Fixed " + std::string(distribution) +
" " + std::string(name) +
214 " should be a positive integer");
215 return static_cast<int>(
found->second);
218inline std::vector<std::vector<double>>
inverse(std::vector<std::vector<double>>
matrix)
220 const std::size_t n =
matrix.size();
221 std::vector<std::vector<double>>
result(n, std::vector<double>(n));
222 for (std::size_t
i = 0;
i < n; ++
i)
237 for (std::size_t
j = 0;
j < n; ++
j) {
241 for (std::size_t
row = 0;
row < n; ++
row) {
245 for (std::size_t
j = 0;
j < n; ++
j) {
254template <
class Distribution,
class LogLikelihood>
260 return std::isfinite(value) ? value : std::numeric_limits<double>::infinity();
261 }
catch (
const std::exception &) {
262 return std::numeric_limits<double>::infinity();
266template <
class Distribution,
class Objective>
275 const double nan = std::numeric_limits<double>::quiet_NaN();
276 for (std::size_t
i = 0;
i <
result.parameters.size(); ++
i) {
294 std::vector<double> parameters =
result.parameters;
301 if (covariance.empty()) {
312 covariance[
i][
i] >= 0 ? std::sqrt(covariance[
i][
i]) : std::numeric_limits<double>::quiet_NaN();
318template <std::
floating_po
int Real>
325 return {{
"location", distribution.
GetLocation(), std::nullopt, std::nullopt},
326 {
"variance",
static_cast<double>(distribution.
Variance()), 0.0, std::nullopt}};
342template <std::
floating_po
int Real>
349 return {{
"degree", distribution.
GetDegree(), 0.0, std::nullopt},
350 {
"location", distribution.
GetLocation(), std::nullopt, std::nullopt},
351 {
"scale", distribution.
GetScale(), 0.0, std::nullopt}};
356 return Distribution(parameters[0], parameters[1], parameters[2]);
372template <std::
floating_po
int Real>
379 return {{
"degree", distribution.
GetDegree(), 0.0, std::nullopt},
380 {
"noncentrality", distribution.
GetNoncentrality(), std::nullopt, std::nullopt}};
394 std::exp(0.5L * std::log(0.5L *
degree) + std::lgamma(0.5L * (
degree - 1)) - std::lgamma(0.5L *
degree));
401template <std::
floating_po
int Real>
408 return {{
"location", distribution.
GetLocation(), std::nullopt, std::nullopt},
409 {
"scale", distribution.
GetScale(), 0.0, std::nullopt}};
426template <std::
floating_po
int Real>
434 return {{
"exponent", distribution.
GetExponent(), 0.1, 2.0,
true,
true},
435 {
"skewness", distribution.
GetSkewness(), -1.0, 1.0,
true,
true},
436 {
"scale", distribution.
GetScale(), 0.0, std::nullopt},
437 {
"location", distribution.
GetLocation(), std::nullopt, std::nullopt}};
442 return Distribution(parameters[0], parameters[1], parameters[2], parameters[3], Parameterization::S0);
458 static constexpr std::array
nuAlphaGrid = {2.439, 2.5, 2.6, 2.7, 2.8, 3.0, 3.2, 3.5,
459 4.0, 5.0, 6.0, 8.0, 10.0, 15.0, 25.0};
460 static constexpr std::array
nuBetaGrid = {0.0, 0.1, 0.2, 0.3, 0.5, 0.7, 1.0};
462 std::array{2.000, 2.000, 2.000, 2.000, 2.000, 2.000, 2.000},
463 std::array{1.916, 1.924, 1.924, 1.924, 1.924, 1.924, 1.924},
464 std::array{1.808, 1.813, 1.829, 1.829, 1.829, 1.829, 1.829},
465 std::array{1.729, 1.730, 1.737, 1.745, 1.745, 1.745, 1.745},
466 std::array{1.664, 1.663, 1.663, 1.668, 1.676, 1.676, 1.676},
467 std::array{1.563, 1.560, 1.553, 1.548, 1.547, 1.547, 1.547},
468 std::array{1.484, 1.480, 1.471, 1.460, 1.448, 1.438, 1.438},
469 std::array{1.391, 1.386, 1.378, 1.364, 1.337, 1.318, 1.318},
470 std::array{1.279, 1.273, 1.266, 1.250, 1.210, 1.184, 1.150},
471 std::array{1.128, 1.121, 1.114, 1.101, 1.067, 1.027, 0.973},
472 std::array{1.029, 1.021, 1.014, 1.004, 0.974, 0.935, 0.874},
473 std::array{0.896, 0.892, 0.884, 0.883, 0.855, 0.823, 0.769},
474 std::array{0.818, 0.812, 0.806, 0.801, 0.780, 0.756, 0.691},
475 std::array{0.698, 0.695, 0.692, 0.689, 0.676, 0.656, 0.597},
476 std::array{0.593, 0.590, 0.588, 0.586, 0.579, 0.563, 0.513},
478 static constexpr std::array
betaTable = {
479 std::array{0.000, 2.160, 1.000, 1.000, 1.000, 1.000, 1.000},
480 std::array{0.000, 1.592, 3.390, 1.000, 1.000, 1.000, 1.000},
481 std::array{0.000, 0.759, 1.800, 1.000, 1.000, 1.000, 1.000},
482 std::array{0.000, 0.482, 1.048, 1.694, 1.000, 1.000, 1.000},
483 std::array{0.000, 0.360, 0.760, 1.232, 2.229, 1.000, 1.000},
484 std::array{0.000, 0.253, 0.518, 0.823, 1.575, 1.000, 1.000},
485 std::array{0.000, 0.203, 0.410, 0.632, 1.244, 1.906, 1.000},
486 std::array{0.000, 0.165, 0.332, 0.499, 0.943, 1.560, 1.000},
487 std::array{0.000, 0.136, 0.271, 0.404, 0.689, 1.230, 2.195},
488 std::array{0.000, 0.109, 0.216, 0.323, 0.539, 0.827, 1.917},
489 std::array{0.000, 0.096, 0.190, 0.284, 0.472, 0.693, 1.759},
490 std::array{0.000, 0.082, 0.163, 0.243, 0.412, 0.601, 1.596},
491 std::array{0.000, 0.074, 0.147, 0.220, 0.377, 0.546, 1.482},
492 std::array{0.000, 0.064, 0.128, 0.191, 0.330, 0.478, 1.362},
493 std::array{0.000, 0.056, 0.112, 0.167, 0.285, 0.428, 1.274},
514 if (!(scale > 0) || !std::isfinite(location))
527template <std::
floating_po
int Real>
536 return {{
"exponent", distribution.
GetExponent(), 0.1, 2.0,
true,
true},
537 {
"skewness", distribution.
GetSkewness(), -1.0, 1.0,
true,
true},
538 {
"scale", distribution.
GetScale(), 0.0, std::nullopt},
539 {
"location", distribution.
GetLocation(), std::nullopt, std::nullopt}};
544 return Distribution(parameters[0], parameters[1], parameters[2], parameters[3], Parameterization::S0);
549 if (std::ranges::any_of(sample, [](Real value) {
return !(value > 0); }))
553 for (Real value : sample)
557 Parameterization::S0);
563template <std::
floating_po
int Real>
570 return {{
"exponent", distribution.
GetExponent(), 0.0, 1.0},
571 {
"scale", distribution.
GetScale(), 0.0, std::nullopt},
572 {
"location", distribution.
GetLocation(), std::nullopt, std::nullopt}};
577 return Distribution(parameters[0], parameters[1], parameters[2]);
587 const double exponent = fixed.contains(
"exponent") ? fixed.at(
"exponent") : 0.5;
588 const double location =
589 fixed.contains(
"location") ? fixed.at(
"location") :
static_cast<double>(
minimum) - 0.05 *
spread;
592 const double scale = fixed.contains(
"scale")
601template <std::
floating_po
int Real>
608 return {{
"location", distribution.
GetLocation(), std::nullopt, std::nullopt},
609 {
"scale", distribution.
GetScale(), 0.0, std::nullopt}};
618 const double scale = std::sqrt(6 *
variance) / std::numbers::pi;
627template <std::
floating_po
int Real>
634 return {{
"shape", distribution.
GetShape(), 0.0, std::nullopt},
635 {
"scale", distribution.
GetScale(), 0.0, std::nullopt},
636 {
"location", distribution.
GetLocation(), std::nullopt, std::nullopt}};
641 return Distribution(parameters[0], parameters[1], parameters[2]);
657template <std::
floating_po
int Real>
664 return {{
"shape", distribution.
GetShape(), -0.5, std::nullopt},
665 {
"scale", distribution.
GetScale(), 0.0, std::nullopt}};
676 if (std::ranges::any_of(sample, [](Real value) {
return value < 0; }))
678 "Generalized Pareto distribution: exceedances should be non-negative");
682 "Generalized Pareto distribution: sample spread should be positive");
683 const double shape = std::clamp(0.5 * (1 -
mean *
mean /
variance), -0.4, 1.0);
690template <std::
floating_po
int Real>
697 return {{
"shape", distribution.
GetShape(), std::nullopt, std::nullopt},
698 {
"scale", distribution.
GetScale(), 0.0, std::nullopt},
699 {
"location", distribution.
GetLocation(), std::nullopt, std::nullopt}};
704 return Distribution(parameters[0], parameters[1], parameters[2]);
713 "Generalized extreme-value distribution: sample spread should be positive");
714 const double scale = std::sqrt(6 *
variance) / std::numbers::pi;
721template <std::
floating_po
int Real>
728 return {{
"degree1",
static_cast<double>(distribution.
GetFirstDegree()), 1.0, std::nullopt,
true,
false,
true},
729 {
"degree2",
static_cast<double>(distribution.
GetSecondDegree()), 1.0, std::nullopt,
true,
false,
true}};
734 return Distribution(
static_cast<int>(parameters[0]),
static_cast<int>(parameters[1]));
740 if (std::ranges::any_of(sample, [](Real value) {
return !(value > 0); }))
767template <std::
floating_po
int Real>
774 return {{
"shape", distribution.
GetShape(), 0.0, std::nullopt},
775 {
"rate", distribution.
GetRate(), 0.0, std::nullopt}};
783 if (std::ranges::any_of(sample, [](Real value) {
return !(value > 0); }))
788 "Inverse-gamma distribution: sample variance should be positive");
796template <std::
floating_po
int Real>
803 return {{
"mean", distribution.
GetMean(), 0.0, std::nullopt},
804 {
"shape", distribution.
GetShape(), 0.0, std::nullopt}};
812 if (std::ranges::any_of(sample, [](Real value) {
return !(value > 0); }))
814 "Inverse-Gaussian distribution: sample values should be positive");
818 "Inverse-Gaussian distribution: sample variance should be positive");
825template <std::
floating_po
int Real>
832 return {{
"degree", distribution.
GetDegree(), 0.0, std::nullopt},
841 if (std::ranges::any_of(sample, [](Real value) {
return value < 0; }))
843 "Noncentral chi-squared distribution: sample values should be non-negative");
853template <std::
floating_po
int Real>
860 const double scale = distribution.
GetScale();
861 return {{
"location", distribution.
GetLocation(), std::nullopt, std::nullopt},
862 {
"variance", scale * scale, 0.0, std::nullopt}};
871 distribution.
Fit(sample);
878template <std::
floating_po
int Real>
885 return {{
"rate", distribution.
GetRate(), 0.0, std::nullopt}};
901template <std::
floating_po
int Real>
908 return {{
"shape", distribution.
GetShape(), 0.0, std::nullopt},
909 {
"rate", distribution.
GetRate(), 0.0, std::nullopt}};
918 distribution.
Fit(sample);
925template <std::
floating_po
int Real>
932 return {{
"degree",
static_cast<double>(distribution.
GetDegree()), 1.0, std::nullopt,
true,
false,
true}};
937 return Distribution(
static_cast<std::size_t
>(parameters[0]));
965template <std::
floating_po
int Real>
972 return {{
"shape", distribution.
GetShape(), 1.0, std::nullopt,
true,
false,
true},
973 {
"rate", distribution.
GetRate(), 0.0, std::nullopt}};
978 return Distribution(
static_cast<int>(parameters[0]), parameters[1]);
984 if (std::ranges::any_of(sample, [](Real value) {
return !(value > 0); }))
988 const auto fixedRate = fixed.find(
"rate");
990 throw std::invalid_argument(
"Fixed Erlang rate should be positive");
1012template <std::
floating_po
int Real>
1019 return {{
"alpha", distribution.
GetAlpha(), 0.0, std::nullopt},
1020 {
"beta", distribution.
GetBeta(), 0.0, std::nullopt}};
1030 return distribution;
1036template <std::
floating_po
int Real>
1043 return {{
"shape", distribution.
GetShape(), 0.0, std::nullopt}};
1053 return distribution;
1059template <std::
floating_po
int Real>
1066 return {{
"alpha", distribution.
GetAlpha(), 0.0, std::nullopt},
1067 {
"beta", distribution.
GetBeta(), 0.0, std::nullopt}};
1076 distribution.
Fit(sample);
1077 return distribution;
1083template <std::
floating_po
int Real>
1090 return {{
"shape", distribution.
GetShape(), 0.0, std::nullopt},
1091 {
"scale", distribution.
GetScale(), 0.0, std::nullopt}};
1101 return distribution;
1107template <std::
floating_po
int Real>
1114 return {{
"scale", distribution.
GetScale(), 0.0, std::nullopt},
1115 {
"shape", distribution.
GetShape(), 0.0, std::nullopt}};
1123 if (std::ranges::any_of(sample, [](Real value) {
return !(value > 0); }))
1125 const long double sum = std::accumulate(sample.begin(), sample.end(), 0.0L);
1132template <std::
floating_po
int Real>
1139 return {{
"location", distribution.
GetShift(), std::nullopt, std::nullopt},
1140 {
"scale", distribution.
GetScale(), 0.0, std::nullopt}};
1149 distribution.
Fit(sample);
1150 return distribution;
1156template <std::
floating_po
int Real>
1163 return {{
"location", distribution.
GetLocation(), std::nullopt, std::nullopt},
1164 {
"scale", distribution.
GetScale(), 0.0, std::nullopt}};
1172 const long double sum = std::accumulate(sample.begin(), sample.end(), 0.0L);
1173 const double location =
static_cast<double>(
sum / sample.size());
1175 for (Real value : sample) {
1176 const long double difference = value - location;
1179 const double scale = std::sqrt(
static_cast<double>(3 *
squaredDeviation / sample.size())) / std::numbers::pi;
1188template <std::
floating_po
int Real>
1195 return {{
"location", distribution.
GetLocation(), std::nullopt, std::nullopt},
1196 {
"scale", distribution.
GetScale(), 0.0, std::nullopt}};
1209 const double location =
1213 return distribution;
1219template <std::
floating_po
int Real>
1226 return {{
"scale", distribution.
GetScale(), 0.0, std::nullopt}};
1236 return distribution;
1242template <std::
floating_po
int Real>
1249 return {{
"minimum", distribution.
MinValue(), std::nullopt, distribution.
MaxValue()},
1250 {
"maximum", distribution.
MaxValue(), distribution.
MinValue(), std::nullopt}};
1260 return distribution;
1273 return {{
"value", distribution.
GetValue(), std::nullopt, std::nullopt}};
1282 distribution.
Fit(sample);
1283 return distribution;
1289template <std::
integral Int>
1296 return {{
"rate", distribution.
GetRate(), 0.0, std::nullopt}};
1305 distribution.
Fit(sample);
1306 return distribution;
1319 return {{
"probability", distribution.
GetProbability(), 0.0, 1.0,
true,
true}};
1327 if (std::ranges::any_of(sample, [](
int value) {
return value != 0 && value != 1; }))
1329 const double sum = std::accumulate(sample.begin(), sample.end(), 0.0);
1336template <std::
integral Int>
1343 return {{
"probability", distribution.
GetProbability(), 0.0, 1.0,
false,
true}};
1351 if (std::ranges::any_of(sample, [](
Int value) {
return value < 0; }))
1353 const double sum = std::accumulate(sample.begin(), sample.end(), 0.0);
1360template <std::
integral Int>
1367 return {{
"number",
static_cast<double>(distribution.
GetNumber()), 1.0,
1368 static_cast<double>(std::numeric_limits<int>::max()),
true,
true,
true},
1369 {
"probability", distribution.
GetProbability(), 0.0, 1.0,
true,
true}};
1374 return Distribution(
static_cast<int>(parameters[0]), parameters[1]);
1383 "Binomial distribution: fitting currently requires a fixed number");
1386 return distribution;
1393template <std::
integral Int, std::
floating_po
int Shape>
1400 return {{
"number", distribution.
GetNumber(), 0.0, std::nullopt},
1413 distribution.
Fit(sample);
1414 return distribution;
1420template <std::
integral Int>
1427 return {{
"minimum",
static_cast<double>(distribution.
MinValue()),
1428 static_cast<double>(std::numeric_limits<Int>::lowest()),
static_cast<double>(distribution.
MaxValue()),
1430 {
"maximum",
static_cast<double>(distribution.
MaxValue()),
static_cast<double>(distribution.
MinValue()),
1431 static_cast<double>(std::numeric_limits<Int>::max()),
false,
true,
true}};
1436 return Distribution(
static_cast<Int>(parameters[0]),
static_cast<Int>(parameters[1]));
1443 distribution.
Fit(sample);
1444 return distribution;
1450template <
class Distribution,
class LogLikelihood>
1457 if constexpr (std::floating_point<typename Distribution::value_type>) {
1458 if (std::ranges::any_of(
initializationSample, [](
auto value) {
return !std::isfinite(value); }))
1462 throw std::invalid_argument(
"Fitting tolerance and iteration limit should be positive");
1468 std::vector<double> parameters;
1475 throw std::invalid_argument(
"Fixed parameter is outside its bounds: " +
1482 for (
const auto &[name, value] :
options.fixed) {
1487 throw std::invalid_argument(
"Unknown fixed parameter: " + name);
1493 for (std::size_t
i = 0;
i < parameters.size(); ++
i) {
1497 "Free integer parameters are not supported by continuous optimization");
1511 std::vector<double>
candidate = parameters;
1512 for (std::size_t
i = 0;
i <
free.size(); ++
i)
1536 result.parameters = std::move(parameters);
1537 result.fixed = std::move(fixed);
1549template <
class Distribution>
1553 const auto logLikelihood = [sample](
const Distribution &distribution) {
1554 return distribution.LogLikelihoodFunction(sample);
1559template <
class Distribution>
1565 return fit<Distribution>(sample, std::move(options));
1570#if defined(__clang__)
1571#pragma clang diagnostic pop
1572#elif defined(__GNUC__)
1573#pragma GCC diagnostic pop
1574#elif defined(_MSC_VER)
The ArcsineRand class Arcsine distribution.
Definition continuous/beta.hpp:340
void FitShape(long double lnG, long double lnG1m)
set α and β, estimated via maximum likelihood, using sufficient statistics instead of the whole sampl...
Definition continuous/beta.hpp:1185
double GetShape() const noexcept
Definition continuous/beta.hpp:351
The BernoulliRand class Bernoulli distribution.
Definition bernoulli.hpp:25
double GetAlpha() const noexcept
Definition continuous/beta.hpp:128
double GetBeta() const noexcept
Definition continuous/beta.hpp:132
The BetaPrimeRand class Beta-prime distribution.
Definition beta_prime.hpp:32
double GetAlpha() const noexcept
Definition beta_prime.hpp:44
void Fit(std::span< const RealType > sample)
fit shapes by maximum-likelihood
Definition beta_prime.hpp:320
double GetBeta() const noexcept
Definition beta_prime.hpp:45
The BetaRand class Beta distribution.
Definition continuous/beta.hpp:246
void FitShapes(long double lnG, long double lnG1m, long double mean, long double variance)
set α and β, estimated via maximum likelihood, using sufficient statistics instead of the whole sampl...
Definition continuous/beta.hpp:1112
double GetProbability() const noexcept
Definition binomial.hpp:76
void FitProbability(std::span< const IntType > sample)
Fit probability p with maximum-likelihood estimation.
Definition binomial.hpp:722
IntType GetNumber() const noexcept
Definition binomial.hpp:75
The BinomialRand class Binomial distribution.
Definition binomial.hpp:197
The CauchyRand class Cauchy distribution.
Definition cauchy.hpp:26
The ChiSquaredRand class Chi-squared distribution.
Definition continuous/gamma.hpp:355
size_t GetDegree() const
Definition continuous/gamma.hpp:360
The DegenerateRand class Degenerate distribution.
Definition degenerate.hpp:25
double GetValue() const noexcept
Definition degenerate.hpp:38
void Fit(std::span< const double > sample)
Definition degenerate.hpp:163
The ErlangRand class Erlang distibution.
Definition continuous/gamma.hpp:375
The ExponentialRand class Exponential distribution.
Definition exponential.hpp:28
The FisherFRand class F-distribution.
Definition fisher_f.hpp:23
int GetSecondDegree() const noexcept
Definition fisher_f.hpp:47
int GetFirstDegree() const noexcept
Definition fisher_f.hpp:46
The FrechetRand class Frechet distribution.
Definition frechet.hpp:19
double GetShape() const noexcept
Definition frechet.hpp:37
double GetScale() const noexcept
Definition frechet.hpp:38
double GetLocation() const noexcept
Definition frechet.hpp:39
void FitRate(std::span< const RealType > sample, bool unbiased=false)
set rate, estimated via maximum-likelihood method if unbiased = false, otherwise set rate,...
Definition continuous/gamma.hpp:922
double GetShape() const noexcept
Definition continuous/gamma.hpp:78
double GetRate() const noexcept
Definition continuous/gamma.hpp:86
The GammaRand class Gamma distribution.
Definition continuous/gamma.hpp:295
void Fit(std::span< const RealType > sample)
set shape and rate, estimated via maximum-likelihood method
Definition continuous/gamma.hpp:980
double GetScale() const noexcept
Definition geometric_stable.hpp:70
Definition generalized_extreme_value.hpp:17
double GetScale() const noexcept
Definition generalized_extreme_value.hpp:54
double GetLocation() const noexcept
Definition generalized_extreme_value.hpp:55
double GetShape() const noexcept
Definition generalized_extreme_value.hpp:53
Definition generalized_pareto.hpp:16
double GetScale() const noexcept
Definition generalized_pareto.hpp:51
double GetShape() const noexcept
Definition generalized_pareto.hpp:50
The GeometricRand class Geometric distribution.
Definition geometric.hpp:24
The GumbelRand class Gumbel distribution.
Definition gumbel.hpp:22
double GetScale() const noexcept
Definition gumbel.hpp:39
double GetLocation() const noexcept
Definition gumbel.hpp:38
The InverseGammaRand class Inverse-Gamma distribution.
Definition inverse_gamma.hpp:23
double GetRate() const noexcept
Definition inverse_gamma.hpp:49
double GetShape() const noexcept
Definition inverse_gamma.hpp:48
The InverseGaussianRand class Inverse Gaussian (Wald) distribution.
Definition inverse_gaussian.hpp:19
double GetMean() const noexcept
Definition inverse_gaussian.hpp:35
double GetShape() const noexcept
Definition inverse_gaussian.hpp:36
The LaplaceRand class Laplace distribution.
Definition laplace.hpp:150
void Fit(std::span< const RealType > sample)
Definition laplace.hpp:158
The LevyRand class Levy distribution.
Definition levy.hpp:29
void FitScale(std::span< const RealType > sample)
Fit scale using maximum-likelihoood estimator.
Definition levy.hpp:140
The LogNormalRand class Log-Normal distribution.
Definition log_normal.hpp:25
void Fit(std::span< const RealType > sample)
Fit parameters via maximum-likelihood.
Definition log_normal.hpp:334
double GetScale() const
Definition log_normal.hpp:65
double GetLocation() const
Definition log_normal.hpp:64
Exponential transform of a stable distribution.
Definition log_stable.hpp:25
double GetScale() const noexcept
Definition log_stable.hpp:60
double GetSkewness() const noexcept
Definition log_stable.hpp:59
typename StableRand< RealType >::Parameterization Parameterization
Definition log_stable.hpp:34
double GetLocation() const noexcept
Definition log_stable.hpp:61
double GetExponent() const noexcept
Definition log_stable.hpp:58
The LogisticRand class Logistic distribution.
Definition logistic.hpp:24
double GetScale() const noexcept
Definition logistic.hpp:42
double GetLocation() const noexcept
Definition logistic.hpp:41
T GetNumber() const noexcept
Definition negative_binomial.hpp:60
double GetProbability() const noexcept
Definition negative_binomial.hpp:59
The NegativeBinomialRand class Negative binomial distribution.
Definition negative_binomial.hpp:133
void Fit(std::span< const IntType > sample)
set number and probability, estimated via maximum-likelihood method
Definition negative_binomial.hpp:417
The NoncentralChiSquaredRand class Noncentral Chi-Squared distribution.
Definition noncentral_chi_squared.hpp:24
double GetNoncentrality() const noexcept
Definition noncentral_chi_squared.hpp:47
double GetDegree() const noexcept
Definition noncentral_chi_squared.hpp:46
Noncentral Student's t-distribution.
Definition noncentral_t.hpp:28
double GetDegree() const noexcept
Definition noncentral_t.hpp:58
double GetNoncentrality() const noexcept
Definition noncentral_t.hpp:59
The NormalRand class Normal distribution.
Definition normal.hpp:31
void Fit(std::span< const RealType > sample, bool unbiased=false)
set parameters, returned by maximium-likelihood estimator if unbiased = false, otherwise set paramete...
Definition normal.hpp:423
The ParetoRand class Pareto distribution.
Definition pareto.hpp:24
void Fit(std::span< const RealType > sample, bool unbiased=false)
Fit parameters to maximum-likelihood estimators or to UMVU if unbiased == true.
Definition pareto.hpp:350
double GetScale() const noexcept
Definition pareto.hpp:44
double GetShape() const noexcept
Definition pareto.hpp:43
The PoissonRand class Poisson distribution.
Definition poisson.hpp:26
double GetRate() const noexcept
Definition poisson.hpp:53
void Fit(std::span< const IntType > sample)
fit rate λ via maximum-likelihood method
Definition poisson.hpp:474
The RayleighRand class Rayleigh distribution.
Definition nakagami.hpp:191
void Fit(std::span< const RealType > sample, bool unbiased=false)
fit scale via maximum-likelihood method if unbiased = false, otherwise set scale, returned by uniform...
Definition nakagami.hpp:675
double GetScale() const noexcept
Definition nakagami.hpp:207
double GetShift() const noexcept
Definition laplace.hpp:98
Stable Count distribution.
Definition stable_count.hpp:39
double GetExponent() const noexcept
Definition stable_count.hpp:75
double GetLocation() const noexcept
Definition stable_count.hpp:77
double GetScale() const noexcept
Definition stable_count.hpp:76
double GetScale() const noexcept
Definition stable.hpp:164
long double Variance() const override
Definition stable.hpp:1800
double GetExponent() const noexcept
Definition stable.hpp:156
double GetLocation() const noexcept
Definition stable.hpp:168
double GetSkewness() const noexcept
Definition stable.hpp:160
The StableRand class Stable distribution.
Definition stable.hpp:521
typename StableDistribution< RealType >::Parameterization Parameterization
Definition stable.hpp:523
The StudentTRand class Student's t-distribution.
Definition student_t.hpp:22
double GetLocation() const noexcept
Definition student_t.hpp:47
double GetScale() const noexcept
Definition student_t.hpp:48
double GetDegree() const noexcept
Definition student_t.hpp:46
The WeibullRand class Weibull distribution.
Definition weibull.hpp:21
double GetScale() const noexcept
Definition weibull.hpp:38
double GetShape() const noexcept
Definition weibull.hpp:39
The fit_error class Thrown when a distribution cannot be fitted to a sample; code() tells why.
Definition errors.hpp:36
constexpr long double egamma
Definition constants.hpp:36
double toUnconstrained(double value, const FitParameter ¶meter)
Definition mle.hpp:99
std::map< std::string, double, std::less<> > FixedParameterMap
Definition mle.hpp:85
bool withinBounds(double value, const FitParameter ¶meter)
Definition mle.hpp:130
void addUncertainty(FitResult< Distribution > &result, std::span< const FitParameter > specifications, const Objective &naturalObjective)
Definition mle.hpp:267
double bilinearInterpolation(const std::array< double, Rows > &rowGrid, const std::array< double, Columns > &columnGrid, const std::array< std::array< double, Columns >, Rows > &values, double row, double column)
Definition mle.hpp:185
std::vector< std::vector< double > > inverse(std::vector< std::vector< double > > matrix)
Definition mle.hpp:218
FitResult< Distribution > fitLikelihood(std::span< const typename Distribution::value_type > initializationSample, FitOptions options, const LogLikelihood &logLikelihood, bool forceOptimization=false)
Definition mle.hpp:1451
double fromUnconstrained(double value, const FitParameter ¶meter)
Definition mle.hpp:112
double sampleQuantile(std::span< const T > sample, double probability)
Definition mle.hpp:173
DoublePair sampleMeanAndVariance(std::span< const T > sample)
Definition mle.hpp:160
std::optional< int > fixedPositiveInteger(const FixedParameterMap &fixed, std::string_view name, std::string_view distribution)
Definition mle.hpp:205
bool requiresOptimization(Method method, const FixedParameterMap &fixed)
Definition mle.hpp:152
double negativeLogLikelihood(std::span< const double > parameters, const LogLikelihood &logLikelihood)
Definition mle.hpp:255
Real standardNormal(G &g)
Ziggurat algorithm of Marsaglia and Tsang with 256 layers and an explicit sign bit.
Definition variates.hpp:45
void requireMethod(Method method, std::string_view distribution, std::initializer_list< Method > supported={Method::MLE, Method::MethodOfMoments})
Definition mle.hpp:143
MinimizeResult< Real > bfgs(const F &f, std::vector< Real > start, Real tolerance=1e-8, int maxIterations=1000)
Quasi-Newton minimization of Broyden, Fletcher, Goldfarb and Shanno with central-difference gradients...
Definition optimize.hpp:437
std::vector< std::vector< Real > > numericalHessian(const F &f, const std::vector< Real > &x)
Definition optimize.hpp:390
MinimizeResult< Real > nelderMead(const F &f, std::vector< Real > start, Real tolerance=1e-10, int maxIterations=20000)
Downhill simplex method of Nelder and Mead with the dimension-dependent coefficients of Gao and Han (...
Definition optimize.hpp:273
Definition bivariate_normal.hpp:10
@ WrongSample
the sample could not have been drawn from this distribution
@ NotApplicable
the method cannot be applied to this distribution or sample
@ WrongReturn
the method returned invalid parameters
@ TooFewElements
the sample is too small
Method
Definition result.hpp:12
Pair< double > DoublePair
Definition fwd.hpp:39
FitResult< Distribution > fit(std::span< const typename Distribution::value_type > sample, FitOptions options={})
Definition mle.hpp:1551
Method method
Definition result.hpp:28
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:1048
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:1041
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:1046
static bool hasClosedForm(Method)
Definition mle.hpp:1056
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:1317
static bool hasClosedForm(Method)
Definition mle.hpp:1333
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:1322
static Distribution initial(std::span< const int > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:1324
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:1064
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:1070
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:1072
static bool hasClosedForm(Method)
Definition mle.hpp:1080
static bool hasClosedForm(Method)
Definition mle.hpp:1033
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:1017
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:1023
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:1025
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:1372
static bool requiresOptimization(Method, const FixedParameterMap &)
Definition mle.hpp:1390
static bool hasClosedForm(Method)
Definition mle.hpp:1389
static Distribution initial(std::span< const Int > sample, Method method, const FixedParameterMap &fixed)
Definition mle.hpp:1377
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:1365
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:414
static bool hasClosedForm(Method)
Definition mle.hpp:423
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:412
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:406
static bool requiresOptimization(Method, const FixedParameterMap &)
Definition mle.hpp:962
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:935
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &fixed)
Definition mle.hpp:940
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:930
static bool hasClosedForm(Method)
Definition mle.hpp:961
static bool hasClosedForm(Method)
Definition mle.hpp:1286
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:1276
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:1271
static Distribution initial(std::span< const double > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:1278
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:976
static bool requiresOptimization(Method, const FixedParameterMap &)
Definition mle.hpp:1009
static bool hasClosedForm(Method)
Definition mle.hpp:1008
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &fixed)
Definition mle.hpp:981
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:970
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:888
static bool hasClosedForm(Method)
Definition mle.hpp:898
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:890
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:883
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &fixed)
Definition mle.hpp:737
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:732
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:726
static bool requiresOptimization(Method, const FixedParameterMap &)
Definition mle.hpp:764
static bool hasClosedForm(Method)
Definition mle.hpp:763
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:632
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:639
static bool hasClosedForm(Method)
Definition mle.hpp:654
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:644
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:912
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:914
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:906
static bool hasClosedForm(Method)
Definition mle.hpp:922
static bool hasClosedForm(Method)
Definition mle.hpp:718
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:707
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:702
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:695
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:668
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:673
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:662
static bool hasClosedForm(Method)
Definition mle.hpp:687
static Distribution initial(std::span< const Int > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:1348
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:1346
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:1341
static bool hasClosedForm(Method)
Definition mle.hpp:1357
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:614
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:612
static bool hasClosedForm(Method)
Definition mle.hpp:624
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:606
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:780
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:778
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:772
static bool hasClosedForm(Method)
Definition mle.hpp:793
static bool hasClosedForm(Method)
Definition mle.hpp:822
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:809
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:807
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:801
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:1145
static bool hasClosedForm(Method)
Definition mle.hpp:1153
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:1137
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:1143
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &fixed)
Definition mle.hpp:1201
static bool hasClosedForm(Method)
Definition mle.hpp:1216
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:1199
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:1193
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:858
static bool hasClosedForm(Method)
Definition mle.hpp:875
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:867
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:865
typename Distribution::Parameterization Parameterization
Definition mle.hpp:532
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:534
static bool hasClosedForm(Method method)
Definition mle.hpp:560
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &fixed)
Definition mle.hpp:547
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:542
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:1169
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:1167
static bool hasClosedForm(Method)
Definition mle.hpp:1185
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:1161
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:1398
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:1404
static bool hasClosedForm(Method)
Definition mle.hpp:1417
static Distribution initial(std::span< const Int > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:1409
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:830
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:836
static bool hasClosedForm(Method)
Definition mle.hpp:850
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:838
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &fixed)
Definition mle.hpp:385
static bool hasClosedForm(Method)
Definition mle.hpp:398
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:383
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:377
static bool hasClosedForm(Method)
Definition mle.hpp:339
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:331
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:329
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:323
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:1088
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:1096
static bool hasClosedForm(Method)
Definition mle.hpp:1104
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:1094
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:1294
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:1299
static Distribution initial(std::span< const Int > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:1301
static bool hasClosedForm(Method)
Definition mle.hpp:1309
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:1229
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:1231
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:1224
static bool hasClosedForm(Method)
Definition mle.hpp:1239
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &fixed)
Definition mle.hpp:580
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:575
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:568
static bool hasClosedForm(Method)
Definition mle.hpp:598
typename Distribution::Parameterization Parameterization
Definition mle.hpp:430
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:432
static bool hasClosedForm(Method method)
Definition mle.hpp:524
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:445
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:440
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:359
static bool hasClosedForm(Method)
Definition mle.hpp:369
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:347
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:354
static Distribution make(std::span< const double > parameters)
Definition mle.hpp:1118
static bool hasClosedForm(Method)
Definition mle.hpp:1129
static std::vector< FitParameter > parameters(const Distribution &distribution)
Definition mle.hpp:1112
static Distribution initial(std::span< const Real > sample, Method method, const FixedParameterMap &)
Definition mle.hpp:1120
double value
Definition mle.hpp:77
bool upperInclusive
Definition mle.hpp:81
std::optional< double > lower
Definition mle.hpp:78
std::optional< double > upper
Definition mle.hpp:79
bool integral
Definition mle.hpp:82
bool lowerInclusive
Definition mle.hpp:80
std::string_view name
Definition mle.hpp:76
The MinimizeResult struct Outcome of a multivariate minimization.
Definition optimize.hpp:255
std::vector< Real > x
point of the minimum
Definition optimize.hpp:256