Statistics
Statistics
The Statistical Library provides a convenient way of working with the basic statistical distributions.
The library provides 5 functions for each distribution:
- Calculation of probability density – functions of the form MathProbabilityDensityX()
- Calculation of probabilities – functions of the form MathCumulativeDistributionX()
- Calculation of distribution quantiles – functions of the form MathQuantileX()
- Generation of random numbers with the specified distribution – functions of the form MathRandomX()
- Calculation of the theoretical moments of the distributions – functions of the form MathMomentsX()
In addition to calculation of values for the individual random variables, the library also provides overloads for the functions, which perform the same calculations for arrays.
- Statistical Characteristics
- Normal Distribution
- Log-normal distribution
- Beta distribution
- Noncentral beta distribution
- Gamma distribution
- Chi-squared distribution
- Noncentral chi-squared distribution
- Exponential distribution
- F-distribution
- Noncentral F-distribution
- t-distribution
- Noncentral t-distribution
- Logistic distribution
- Cauchy distribution
- Uniform distribution
- Weibull distribution
- Binomial distribution
- Negative binomial distribution
- Geometric distribution
- Hypergeometric distribution
- Poisson distribution
- Subfunctions
Example:
//+------------------------------------------------------------------+
//| NormalDistributionExample.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
//--- include the functions for calculating the normal distribution
#include <Math\Stat\Normal.mqh>
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- set the parameters of the normal distribution
double mu=5.0;
double sigma=1.0;
PrintFormat("Normal distribution with parameters mu=%G and sigma=%G, calculation examples:",mu,sigma);
//--- set the interval
double x1=mu-sigma;
double x2=mu+sigma;
//--- variables for probability calculation
double cdf1,cdf2,probability;
//--- variables for error codes
int error_code1,error_code2;
//--- calculate the values of distribution functions
cdf1=MathCumulativeDistributionNormal(x1,mu,sigma,error_code1);
cdf2=MathCumulativeDistributionNormal(x2,mu,sigma,error_code2);
//--- check the error codes
if(error_code1==ERR_OK && error_code2==ERR_OK)
{
//--- calculate probability of a random variable in the range
probability=cdf2-cdf1;
//--- output the result
PrintFormat("1. Calculate probability of a random variable within the range of %.5f<x<%.5f",x1,x2);
PrintFormat(" Answer: Probability = %5.8f",probability);
}
//--- Find the value range of random variable x, corresponding to the 95% confidence level
probability=0.95; // set the confidence probability
//--- set the probabilities at the interval bounds
double p1=(1.0-probability)*0.5;
double p2=probability+(1.0-probability)*0.5;
//--- calculate the interval bounds
x1=MathQuantileNormal(p1,mu,sigma,error_code1);
x2=MathQuantileNormal(p2,mu,sigma,error_code2);
//--- check the error codes
if(error_code1==ERR_OK && error_code2==ERR_OK)
{
//--- output the result
PrintFormat("2. For confidence interval = %.2f, find the range of random variable",probability);
PrintFormat(" Answer: range is %5.8f <= x <=%5.8f",x1,x2);
}
PrintFormat("3. Compute the first 4 calculated and theoretical moments of the distribution");
//--- Generate an array of random numbers, calculate the first 4 moments and compare with the theoretical values
int data_count=1000000; // set the number of values and prepare an array
double data[];
ArrayResize(data,data_count);
//--- generate random values and store them into the array
for(int i=0; i<data_count; i++)
{
data[i]=MathRandomNormal(mu,sigma,error_code1);
}
//--- set the index of the initial value and the amount of data for calculation
int start=0;
int count=data_count;
//--- calculate the first 4 moments of the generated values
double mean=MathMean(data,start,count);
double variance=MathVariance(data,start,count);
double skewness=MathSkewness(data,start,count);
double kurtosis=MathKurtosis(data,start,count);
//--- variables for the theoretical moments
double normal_mean=0;
double normal_variance=0;
double normal_skewness=0;
double normal_kurtosis=0;
//--- display the values of the calculated moments
PrintFormat(" Mean Variance Skewness Kurtosis");
PrintFormat("Calculated %.10f %.10f %.10f %.10f",mean,variance,skewness,kurtosis);
//--- calculate the theoretical values of the moments and compare them with the obtained values
if(MathMomentsNormal(mu,sigma,normal_mean,normal_variance,normal_skewness,normal_kurtosis,error_code1))
{
PrintFormat("Theoretical %.10f %.10f %.10f %.10f",normal_mean,normal_variance,normal_skewness,normal_kurtosis);
PrintFormat("Difference %.10f %.10f %.10f %.10f",mean-normal_mean,variance-normal_variance,skewness-normal_skewness,kurtosis-normal_kurtosis);
}
}Last updated on