Обсуждение статьи "Статистические распределения в MQL5 - берем лучшее из R и делаем быстрее" - страница 18

 
Alexey Nikolaev:

Здравствуйте,
столкнулся с проблемой при вычислении квантиля гамма-распределения
в R:
> qgamma(0.05,2,scale=1)
[1] 0.3553615
> qgamma(0.05,10,scale=1)
[1] 5.425406

в mql5:

результаты:
0.3553615106986621
Error 4

build 1596

Изменен расчет квантилей гамма-распределения. Исправленная версия Gamma.mqh в приложении (заменить в MQL5\Include\Math\Stat\).

Результат расчета:

2017.11.06 21:03:56.580 TestExample (USDJPY,M5) 0.3553615106986623
2017.11.06 21:03:56.580 TestExample (USDJPY,M5) 5.425405697091294
Файлы:
Gamma.mqh  32 kb
 
На странице справки вместо MathProbabilityDensityGamma() значится MathProbabilityDensityNoncentralBeta()
 
Aleksey Nikolayev:
На странице справки вместо MathProbabilityDensityGamma() значится MathProbabilityDensityNoncentralBeta()

Спасибо, исправили

 

Некорректно вычисляется CDF гипергеометрического распределения функцией MathCumulativeDistributionHypergeometric(). По определению, функция распределения вероятностей должна быть определена для любого действительного числа. Ниже скрипт на mql5 с результатами его работы и, для сравнения, то же самое на R.

#include <Math\Stat\Hypergeometric.mqh>

input int nall=9;  // all
input int nsc=2;   // all success
input int nsm=8;   // sample size

void OnStart()
  { int er;
    double k[]={-1,0,0.5,1};
    for(int i=0; i<4; ++i)
      Print((string)k[i]+" "+(string)MathCumulativeDistributionHypergeometric(k[i],nall,nsc,nsm,er)+" "+(string)er);
  }

результат:

-1.0 nan 2

0.0 0.0 0

0.5 nan 2

zero divide in 'Hypergeometric.mqh' (241,35)

nall <- 9 # all
nsc <- 2  # all success
nsm <- 8  # sample size

k <- c(-1, 0, 0.5, 1)
phyper(k, nsc, nall-nsc, nsm)

результат:

[1] 0.0000000 0.0000000 0.0000000 0.2222222

 
Aleksey Nikolayev:

Некорректно вычисляется CDF гипергеометрического распределения функцией MathCumulativeDistributionHypergeometric().

Спасибо за сообщение, будем разбираться.

 
Есть пожелание, чтобы в библиотеку было добавлено распределение Колмогорова. Оно весьма полезно из-за использования в критерии Колмогорова-Смирнова и в задаче поиска разладки случайного процесса.
 

Если ничего не напутал, в функциях быстрой сортировки MathQuickSort*() не заполняется массив индексов исходного массива:

#include <Math\Stat\Math.mqh>

void OnStart()
  { double a[]={1.5, 2.0, -1.0, 0.0};
    int na=ArraySize(a);
    int ix[]; ArrayResize(ix,na);
    for(int i=0; i<na; ++i) ix[i]=0;
    
    //MathQuickSort(a,ix,1,2,1);
    //MathQuickSort(a,ix,1,2,-1);
    MathQuickSortAscending(a,ix,1,2);
    //MathQuickSortDescending(a,ix,1,2);
    
    for(int i=0; i<na; ++i)
      Print((string)ix[i]+" "+(string)a[i]);
  }

результат:

0 1.5

0 -1.0

0 2.0

0 0.0

 
Aleksey Nikolayev:

Если ничего не напутал, в функциях быстрой сортировки MathQuickSort*() не заполняется массив индексов исходного массива:

В нашей реализации массив индексов сам не заполняется, значения индексов нужно подготовить самому перед вызовом сортировки:

    for(int i=0; i<na; ++i) ix[i]=i;

или

    for(int i=0; i<na; ++i) ix[i]=i+1;
если требуется натуральный порядок.
 

Setslav

>>>Продукт был скрыт, чтобы обратить на него Ваше внимание.

Плюс, не нахожу кнопку опубликовать новый продукт в Маркете. Это у всех так, или опять-таки же только у меня? Как мне опубликовать версию для МТ5?

Если продукт скрыт модератором, то автор не может его вернуть. Это логично

 

Отрицательны некоторые (не все) биномиальные коэффициенты, например:

#include <Math\Stat\Math.mqh>

void OnStart()
  { Print(MathBinomialCoefficient(62,28));
  }

результат:     -309196571788882235

должно быть: 349615716557887488