Avaliar intervalo definido de distribuição normal

18

Sei que falta uma fórmula fácil de manusear para o CDF de uma distribuição normal, devido à complicada função de erro nela.

No entanto, gostaria de saber se existe uma boa fórmula para . Ou qual seria a aproximação do "estado da arte" para esse problema.N(cx<c+|μ,σ2)

bayerj
fonte

Respostas:

31

Depende exatamente do que você está procurando . Abaixo estão alguns breves detalhes e referências.

Grande parte da literatura para aproximações se concentra na função

Q(x)=x12πeu22du

para . Isso ocorre porque a função que você forneceu pode ser decomposta como uma simples diferença da função acima (possivelmente ajustada por uma constante). Essa função é referida por muitos nomes, incluindo "cauda superior da distribuição normal", "integral normal direita" e " função gaussiana ", para citar alguns. Você também verá aproximações à razão de Mills , que é que é o pdf gaussiano.x>0Q

R(x)=Q(x)φ(x)
φ(x)=(2π)1/2ex2/2

Aqui, listo algumas referências para vários propósitos nos quais você pode estar interessado.

Computacional

O padrão de fato para calcular a função Q ou a função de erro complementar relacionada é

WJ Cody, aproximações do Rational Chebyshev para a função de erro , matemática. Comp. , 1969, pp.631-637.

Toda implementação (que se preze) usa este documento. (MATLAB, R, etc.)

Aproximações "simples"

Abramowitz e Stegun têm um baseado em uma expansão polinomial de uma transformação da entrada. Algumas pessoas o usam como uma aproximação de "alta precisão". Não gosto disso com esse objetivo, pois se comporta mal em torno de zero. Por exemplo, sua aproximação não gera , o que eu acho que é um grande não-não. Às vezes, coisas ruins acontecem por causa disso.Q^(0)=1/2

Borjesson e Sundberg fornecem uma aproximação simples que funciona muito bem para a maioria das aplicações em que apenas são necessários alguns dígitos de precisão. O erro relativo absoluto nunca é pior que 1%, o que é bastante bom, considerando sua simplicidade. A aproximação básica é e suas escolhas preferidas das constantes são e . Essa referência éum=0,339b=5,51

Q^(x)=1(1a)x+ax2+bφ(x)
a=0.339b=5.51

PO Borjesson e CE Sundberg. Aproximações simples da função de erro Q (x) para aplicativos de comunicação . IEEE Trans. Comum. , COM-27 (3): 639-643, março de 1979.

Aqui está um gráfico de seu erro relativo absoluto.

insira a descrição da imagem aqui

A literatura de engenharia elétrica está repleta de várias aproximações e parece ter um interesse excessivamente intenso por elas. Muitos deles são pobres, porém, ou se expandem para expressões muito estranhas e complicadas.

Você também pode olhar

W. Bryc. Uma aproximação uniforme da integral normal correta . Matemática Aplicada e Computação , 127 (2-3): 365–374, abril de 2002.

Fração continuada de Laplace

Laplace tem uma bela fração contínua que gera limites superiores e inferiores sucessivos para cada valor de . É, em termos da razão de Mills,x>0

R(x)=1x+1x+2x+3x+,

onde a notação que usei é bastante padrão para uma fração contínua , ou seja, . Porém, essa expressão não converge muito rápido para pequeno e diverge em .x x = 01/(x+1/(x+2/(x+3/(x+))))xx=0

Essa fração continuada realmente produz muitos dos limites "simples" em que foram "redescobertos" em meados do final do século XX. É fácil ver que, para uma fração contínua na forma "padrão" (ou seja, composta de coeficientes inteiros positivos), truncar a fração em termos ímpares (pares) gera um limite superior (inferior).Q(x)

Portanto, Laplace nos diz imediatamente que ambos limites que foram "redescobertos" em meados de 1900's. Em termos da função , isso é equivalente a Uma prova alternativa disso usando simples integração por partes pode ser encontrada em S. Resnick, Aventuras em processos estocásticos , Birkhauser, 1992, no capítulo 6 (movimento browniano). O erro relativo absoluto desses limites não é pior que , conforme mostrado nesta resposta relacionada .Q x

xx2+1<R(x)<1x,
Qx-2
xx2+1φ(x)<Q(x)<1xφ(x).
x2

Observe, em particular, que as desigualdades acima implicam imediatamente que . Este fato pode ser estabelecido usando a regra de L'Hopital também. Isso também ajuda a explicar a escolha da forma funcional da aproximação de Borjesson-Sundberg. Qualquer escolha de mantém a equivalência assintótica como . O parâmetro serve como uma "correção de continuidade" próximo de zero.um [ 0 , 1 ] x bQ(x)φ(x)/xa[0,1]xb

Aqui está um gráfico da função e os dois limites de Laplace.Q

Limites de Laplace para a cauda superior da distribuição normal

CI. C. Lee tem um artigo do início dos anos 90 que faz uma "correção" para pequenos valores de . Vejox

CI. C. Lee. Em Laplace, fração continuada para a integral normal . Ann. Inst. Statist. Matemática. , 44 (1): 107-120, março de 1992.


Probabilidade de Durrett : teoria e exemplos fornece os limites superior e inferior clássicos em nas páginas 6–7 da 3ª edição. Elas são destinadas a valores maiores de (digamos, ) e são assintoticamente restritas.x x > 3Q(x)xx>3

Espero que isso ajude você a começar. Se você tiver um interesse mais específico, talvez eu possa apontar para algum lugar.

cardeal
fonte
9

Suponho que estou muito atrasado como herói, mas queria comentar no post do cardeal, e esse comentário ficou grande demais para a caixa pretendida.

Para esta resposta, estou assumindo ; fórmulas de reflexão apropriadas podem ser usadas para negativo .xx>0x

Estou mais acostumado a lidar com a função de erro , mas tentarei reformular o que sei em termos da razão de Mills (conforme definido na resposta do cardeal).R ( x )erf(x)R(x)

De fato, existem maneiras alternativas de calcular a função de erro (complementar) além do uso de aproximações de Chebyshev. Como o uso de uma aproximação Chebyshev requer o armazenamento de poucos coeficientes, esses métodos podem ter uma vantagem se as estruturas de matriz forem um pouco caras em seu ambiente de computação (você pode alinhar os coeficientes, mas o código resultante provavelmente parecerá um barroco bagunça).

Para "pequeno", Abramowitz e Stegun apresentam uma série bem comportada (pelo menos melhor que a usual série Maclaurin):|x|

R(x)=π2exp(x22)xj=02jj!(2j+1)!x2j
(adaptado da fórmula 7.1.6 )

Observe que os coeficientes de na série Podem ser calculados iniciando com e depois usando a fórmula de recursão . Isso é conveniente ao implementar a série como um loop de soma.x2jcj=2jj!(2j+1)!c0=1cj+1=cj2j+3


O cardeal deu à fração contínua do Laplaciano como uma forma de limitar a proporção de Mills para grandes; o que não é tão conhecido é que a fração continuada também é útil para avaliação numérica.|x|

Lentz , Thompson e Barnett derivaram um algoritmo para avaliar numericamente uma fração contínua como um produto infinito, o que é mais eficiente do que a abordagem usual de calcular uma fração contínua "para trás". Em vez de exibir o algoritmo geral, mostrarei como ele se especializa no cálculo da razão de Mills:

Y0=x,C0=Y0,D0=0
repeat for j=1,2,

Dj=1x+jDj1
Cj=x+jCj1
Hj=CjDj
Yj=HjYj1
until |Hj1|<tol
R(x)=1Yj

onde determina a precisão.tol

O CF é útil onde as séries mencionadas anteriormente começam a convergir lentamente; você precisará experimentar a determinação do "ponto de interrupção" apropriado para alternar da série para o CF no seu ambiente de computação. Existe também a alternativa de usar uma série assintótica em vez do CF Laplaciano, mas minha experiência é que o CF Laplaciano é bom o suficiente para a maioria das aplicações.


Finalmente, se você não precisar calcular a função de erro (complementar) com muita precisão (ou seja, com apenas alguns dígitos significativos), há aproximações compactas devido a Serge Winitzki. Aqui está um deles:

R(x)2π+x(π2)2+x2π+x2(π2)

Essa aproximação tem um erro relativo máximo de e se torna mais precisa à medida que aumenta.1.84×102x

JM não é estatístico
fonte
8

(Essa resposta apareceu originalmente em resposta a uma pergunta semelhante, posteriormente encerrada como duplicada. O OP queria apenas "uma" implementação da integral gaussiana, não necessariamente "estado da arte". Em seus comentários, tornou-se evidente que uma relativamente simples , uma implementação curta seria preferida.)


Como apontam os comentários, você precisa integrar o PDF . Existem muitas maneiras de executar a integral. Há muito tempo, quando os cálculos eram lentos e caros, David Hill elaborou uma aproximação usando aritmética simples (funções racionais e exponenciação). Possui precisão de dupla precisão para argumentos típicos (entre e , aproximadamente). Em 1973, ele publicou uma versão Fortran na Applied Statistics chamada ALNORM.F. Ao longo dos anos, eu o transformei em vários ambientes que não tinham uma integral normal (gaussiana) ou que tinham suspeitas (como o Excel).8.5+8.5

Uma versão do MatLab (com atribuições apropriadas) está disponível em http://people.sc.fsu.edu/~jburkardt/m_src/asa005/alnorm.m . Uma versão completamente não documentada do código Fortran original aparece em um site "Koders Code Search" (sic).

Muitos anos atrás, eu enviei isso para o AWK. Esta versão pode ser mais agradável para o desenvolvedor moderno portar devido à sua sintaxe do tipo C (em vez do Fortran) e a alguns comentários adicionais inseridos ao desenvolvê-lo e testá-lo, porque eu precisava aprimorar sua precisão. Aparece abaixo.

Para aqueles sem muita experiência em portar códigos científicos / matemáticos / estatísticas, algumas dicas : um único erro tipográfico pode criar erros graves que podem não ser facilmente detectáveis. (Confie em mim, já fiz muitos deles.) Sempre, sempre crie um teste cuidadoso e exaustivo. Como a função integral integral / integral gaussiana / erro está disponível em muitas tabelas e em tantos softwares, é simples e rápido tabular um grande número de valores de sua função portada e comparar sistematicamente (ou seja, com o computador, não a olho nu) os valores para corrigir. Você pode ver esse teste no início do meu código: ele produz uma tabela de valores em -8,5: 8,5 (por 0,1) que pode ser canalizada (via STDOUT) para outro programa para verificação sistemática.

Outra abordagem de teste - para aqueles com experiência em análise numérica suficiente para saber como estimar erros esperados - seria diferenciar numericamente os valores e compará-los ao PDF (que é prontamente calculado).

A propósito: esse código é apenas para o caso com média de e desvio padrão unitário ("sigma"). Mas é tudo o que precisamos: integrar de a quando a média for e o SD for , apenas calcule e aplique a ela.0xμσz=(xμ)/σalnorm

Editar

Testei uma porta de alnormao Mathematica, que calcula os valores de precisão arbitrária. Para comparar os resultados, aqui está um gráfico do log natural das relações dos valores superiores da cauda com . (Um erro relativo positivo significa que é muito grande.)1Φ(z)z1alnorm

Alnorm

Os valores são sempre precisos para relação às probabilidades de cauda extremamente pequenas . Você pode ver onde o cálculo muda para uma fórmula assintótica (em ) e é evidente que essa fórmula se torna extremamente precisa à medida que aumenta. A plotagem para em porque é aqui que a exponenciação de precisão dupla começa subindo.4×1011 z=16zz=(2×708)37.6

Por exemplo, alnorm[-6.0]retorna enquanto o valor verdadeiro, igual a , é aproximadamente , primeiro diferindo no décimo segundo dígito decimal.9.865 876 450 315E1012erfc(32)9.865 876 450 377E10

Nota: Como parte desta edição, mudei UPPER_TAIL_IS_ZEROde 15.para 16.no código: torna o resultado um pouco mais preciso para entre e . (Fim da edição.)Z1516

#----------------------------------------------------------------------#
#   ALNORM.AWK
#   Compute values of the cumulative normal probability function.
#   From G. Dallal's STAT-SAK (Fortran code).
#   Additional precision using asymptotic expression added 7/8/92.
#----------------------------------------------------------------------#
BEGIN {
    for (i=-85; i<=85; i++) {
        x = i/10
        p = alnorm(x, 0)
        printf("%3.1f %12.10f\n", x, p)
    }
    exit
}
function alnorm(z,up,    y,aln,w) {
#
#    ALGORITHM AS 66 APPL. STATIST. (1973) VOL.22, NO.3:
#    Hill,  I.D.  (1973).  Algorithm AS 66.  The normal  integral.
#                          Appl. Statist.,22,424-427.
#
#    Evaluates the tail area of the standard normal curve from
#    z to infinity if up, or from -infinity to z if not up.
#
#    LOWER_TAIL_IS_ONE, UPPER_TAIL_IS_ZERO, and EXP_MIN_ARG
#    must be set to suit this computer and compiler.

    LOWER_TAIL_IS_ONE = 8.5     # I.e., alnorm(8.5,0) = .999999999999+
    UPPER_TAIL_IS_ZERO = 16.0   # Changes to power series expression
    FORMULA_BREAK = 1.28        # Changes cont. fraction coefficients
    EXP_MIN_ARG = -708          # I.e., exp(-708) is essentially true 0

    if (z < 0.0) {
        up = !up
        z = -z
    }
    if ((z <= LOWER_TAIL_IS_ONE) || (up && z <= UPPER_TAIL_IS_ZERO)) {
        y = 0.5 * z * z
        if (z > FORMULA_BREAK) {
            if (-y > EXP_MIN_ARG) {
                aln = .398942280385 * exp(-y) / \
                  (z - 3.8052E-8 + 1.00000615302 / \
                  (z + 3.98064794E-4 + 1.98615381364 / \
                  (z - 0.151679116635 + 5.29330324926 / \
                  (z + 4.8385912808 - 15.1508972451 / \
                  (z + 0.742380924027 + 30.789933034 / \
                  (z + 3.99019417011))))))
            } else {
                aln = 0.0
            }
        } else {
            aln = 0.5 - z * (0.398942280444 - 0.399903438504 * y / \
              (y + 5.75885480458 - 29.8213557808 / \
              (y + 2.62433121679 + 48.6959930692 / \
              (y + 5.92885724438))))
        }
    } else {
        if (up) {   # 7/8/92
            # Uses asymptotic expansion for exp(-z*z/2)/alnorm(z)
            # Agrees with continued fraction to 11 s.f. when z >= 15
            # and coefficients through 706 are used.
            y = -0.5*z*z
            if (y > EXP_MIN_ARG) {
                w = -0.5/y  # 1/z^2
                aln = 0.3989422804014327*exp(y)/ \
                    (z*(1 + w*(1 + w*(-2 + w*(10 + w*(-74 + w*706))))))
                # Next coefficients would be -8162, 110410
            } else {
                aln = 0.0
            }
        } else {
            aln = 0.0
        }
    }
    return up ? aln : 1.0 - aln
}
### end of file ###
whuber
fonte
Eu usei o boost em C ++ para calcular o CDF da distribuição normal. Mas, às vezes, quando eu calculo P (x> mean1 + sigma1) para o normal (mean1, sigma1) e recomputo P (x> mean2 + sigma2) para o normal (mean2, sigma2), sempre dá o mesmo valor de probabilidade! Mesmo se eu tentar com outros valores ligeiramente diferentes de média e sigma. Isso tem algum significado?
shn 6/06/12
Z = ( X - m e a n 1 ) / σ 1 Z = ( X - m e a n 2 ) / σ 2Pr(Z>1)Z=(Xmean1)/σ1Z=(Xmean2)/σ2
Oh, ótimo então, eu pensei que era um erro no meu código.
shn 06/06/12
E sim, na verdade, não é a mesma probabilidade, mas muito próximos uns dos outros, como ,158655273989975 e ,158655230168700
shn
1
@ Cardinal: pronto.
whuber