Discussão do artigo "Distribuições estatísticas no MQL5 - tirando o melhor de R" - página 18

 
Alexey Nikolaev:

Olá,
encontrei um problema ao calcular o quantil da distribuição gama
em R:
> qgamma(0.05,2,scale=1)
[1] 0.3553615
> qgamma(0.05,10,scale=1)
[1] 5.425406

em mql5:

Resultados:
0.3553615106986621
Erro 4

build 1596

Alterado o cálculo dos quantis da distribuição gama. Versão corrigida do Gamma.mqh no apêndice (substituir em MQL5\Include\Math\Stat\).

Resultado do cálculo:

2017.11.06 21:03:56.580 TestExample (USDJPY,M5) 0.3553615106986623
2017.11.06 21:03:56.580 TestExample (USDJPY,M5) 5.425405697091294
Arquivos anexados:
Gamma.mqh  32 kb
 
A página de ajuda diz MathProbabilityDensityGamma() em vez de MathProbabilityDensityNoncentralBeta()
 
Aleksey Nikolayev:
A página de ajuda diz MathProbabilityDensityGamma() em vez de MathProbabilityDensityNoncentralBeta()

Obrigado, corrigido

 

O CDF da distribuição hipergeométrica é calculado incorretamente pela função MathCumulativeDistributionHypergeometric(). Por definição, a função de distribuição de probabilidade deve ser definida para qualquer número real. Abaixo está um script no mql5 com seus resultados e, para comparação, o mesmo no R.

#include <Math\Stat\Hypergeometric.mqh>

input int nall=9;  // todos
input int nsc=2;   // todo sucesso
input int nsm=8;   // tamanho da amostra

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);
  }

resultado:

-1,0 nan 2

0.0 0.0 0

0,5 nan 2

divisão por zero em '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)

result:

[1] 0.0000000 0.0000000 0.0000000 0.2222222

 
Aleksey Nikolayev:

O CDF da distribuição hipergeométrica é calculado incorretamente por MathCumulativeDistributionHypergeometric().

Obrigado pela mensagem, vamos dar uma olhada nisso.

 
Há um desejo de adicionar a distribuição de Kolmogorov à biblioteca. Ela é muito útil devido ao seu uso no critério de Kolmogorov-Smirnov e no problema de busca da discórdia de um processo aleatório.
 

Se eu não tiver bagunçado nada, as funções de classificação rápida MathQuickSort*() não preenchem a matriz de índice da matriz original:

#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]);
  }

resultado:

0 1.5

0 -1.0

0 2.0

0 0.0

 
Aleksey Nikolayev:

A menos que eu esteja confuso, as funções de classificação rápida MathQuickSort*() não preenchem a matriz de índice da matriz original:

Em nossa implementação, a matriz de índice em si não é preenchida, os valores de índice devem ser preparados por você mesmo antes de chamar a classificação:

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

ou

    for(int i=0; i<na; ++i) ix[i]=i+1;
se a ordem natural for necessária.
 

Setslav

>>>O produtofoi ocultado para chamar sua atenção para ele.

Além disso, não consigo encontrar um botão para publicar um novo produto no Market. É assim para todo mundo ou é só para mim? Como posso publicar a versão MT5?

Se um produto for ocultado por um moderador, o autor não poderá devolvê-lo. Isso é lógico. Isso é lógico

 

Alguns (não todos) coeficientes binomiais são negativos, por exemplo:

#include <Math\Stat\Math.mqh>

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

resultado: -309196571788882235

deveria ser: 349615716557887488