Évaluer l'intervalle défini de la distribution normale

18

Je sais qu'une formule facile à manipuler pour le CDF d'une distribution normale manque quelque peu, en raison de la fonction d'erreur compliquée qu'elle contient.

Cependant, je me demande s'il existe une belle formule pour . Ou quelle pourrait être l'approximation de "l'état de l'art" pour ce problème.N(c-X<c+|μ,σ2)

bayerj
la source

Réponses:

31

Cela dépend exactement de ce que vous recherchez . Vous trouverez ci-dessous quelques brefs détails et références.

Une grande partie de la littérature pour les approximations se concentre sur la fonction

Q(X)=X12πe-u22u

pour . En effet, la fonction que vous avez fournie peut être décomposée en une simple différence de la fonction ci-dessus (éventuellement ajustée par une constante). Cette fonction est désignée par de nombreux noms, notamment "queue supérieure de la distribution normale", "intégrale normale droite" et "fonction gaussienne ", pour n'en nommer que quelques-uns. Vous verrez également des approximations du rapport de Mills , qui est où est le pdf gaussien.X>0Q

R(X)=Q(X)φ(X)
φ(X)=(2π)-1/2e-X2/2

Ici, je liste quelques références à diverses fins qui pourraient vous intéresser.

Informatique

La norme de facto pour le calcul de la fonction ou de la fonction d'erreur complémentaire associée estQ

WJ Cody, Rational Chebyshev Approximations for the Error Function , Math. Comp. , 1969, p. 631--637.

Chaque implémentation (qui se respecte) utilise ce document. (MATLAB, R, etc.)

Approximations "simples"

Abramowitz et Stegun en ont un basé sur une expansion polynomiale d'une transformation de l'entrée. Certaines personnes l'utilisent comme une approximation "haute précision". Je ne l'aime pas à cet effet car il se comporte mal autour de zéro. Par exemple, leur approximation ne donne pas , ce qui, je pense, est un gros no-no. Parfois, de mauvaises choses se produisent à cause de cela.Q^(0)=1/2

Borjesson et Sundberg donnent une approximation simple qui fonctionne assez bien pour la plupart des applications où l'on n'a besoin que de quelques chiffres de précision. L' erreur relative absolue n'est jamais pire que 1%, ce qui est assez bon compte tenu de sa simplicité. L'approximation de base est et leurs choix préférés des constantes sont et . Cette référence esta=0,339b=5,51

Q^(X)=1(1-une)X+uneX2+bφ(X)
une=0,339b=5,51

PO Borjesson et CE Sundberg. Approximations simples de la fonction d'erreur Q (x) pour les applications de communication . IEEE Trans. Commun. , COM-27 (3): 639–643, mars 1979.

Voici un graphique de son erreur relative absolue.

entrez la description de l'image ici

La littérature en génie électrique regorge de diverses approximations de ce type et semble s'y intéresser de manière excessive. Beaucoup d'entre eux sont pauvres ou développent des expressions très étranges et alambiquées.

Vous pourriez également regarder

W. Bryc. Une approximation uniforme de l'intégrale normale droite . Mathématiques appliquées et calcul , 127 (2-3): 365–374, avril 2002.

La fraction continue de Laplace

Laplace a une belle fraction continue qui donne des bornes supérieures et inférieures successives pour chaque valeur de . C'est, en termes de ratio de Mills,X>0

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

où la notation que j'ai utilisée est assez standard pour une fraction continue , c'est-à-dire . Cependant, cette expression ne converge pas très rapidement pour les petits , et elle diverge à .x x = 01/(X+1/(X+2/(X+3/(X+))))XX=0

Cette fraction continue donne en fait un grand nombre des bornes "simples" sur qui ont été "redécouvertes" entre le milieu et la fin des années 1900. Il est facile de voir que pour une fraction continue sous forme "standard" (c'est-à-dire composée de coefficients entiers positifs), la troncature de la fraction en termes impairs (pairs) donne une borne supérieure (inférieure).Q(X)

Par conséquent, Laplace nous dit immédiatement que deux étant des bornes qui ont été "redécouvertes" au milieu Années 1900. En termes de fonction , cela équivaut à Une preuve alternative de cela en utilisant une intégration simple par parties peut être trouvée dans S. Resnick, Adventures in Stochastic Processes , Birkhauser, 1992, au Chapitre 6 (Mouvement brownien). L'erreur relative absolue de ces bornes n'est pas pire que , comme le montre cette réponse connexe .Q x

XX2+1<R(X)<1X,
Q
XX2+1φ(X)<Q(X)<1Xφ(X).
X-2

Notez, en particulier, que les inégalités ci-dessus impliquent immédiatement que . Ce fait peut également être établi en utilisant la règle de L'Hopital. Cela permet également d'expliquer le choix de la forme fonctionnelle de l'approximation de Borjesson-Sundberg. Tout choix de maintient l'équivalence asymptotique comme . Le paramètre sert de "correction de continuité" proche de zéro.Q(X)φ(X)/Xune[0,1]Xb

Voici un tracé de la fonction et des deux bornes de Laplace.Q

Limites de Laplace pour la queue supérieure de la distribution normale

CI. C. Lee a un article du début des années 1990 qui fait une "correction" pour les petites valeurs de . VoirX

CI. C. Lee. Sur Laplace, fraction continue pour l'intégrale normale . Ann. Inst. Statist. Math. , 44 (1): 107–120, mars 1992.


La probabilité de Durrett : théorie et exemples fournit les limites supérieures et inférieures classiques sur aux pages 6 à 7 de la 3e édition. Ils sont destinés à de plus grandes valeurs de (disons, ) et sont asymptotiquement serrés.Q(X)XX>3

J'espère que cela vous aidera à démarrer. Si vous avez un intérêt plus spécifique, je pourrais peut-être vous indiquer quelque part.

cardinal
la source
9

Je suppose que je suis trop tard pour le héros, mais je voulais commenter le post du cardinal, et ce commentaire est devenu trop grand pour sa boîte prévue.

X>0X

erF(X)R(X)

Il existe en fait des manières alternatives de calculer la fonction d'erreur (complémentaire) en dehors des approximations de Chebyshev. Étant donné que l'utilisation d'une approximation de Chebyshev nécessite le stockage de quelques coefficients, ces méthodes peuvent avoir un avantage si les structures de tableaux sont un peu coûteuses dans votre environnement informatique (vous pouvez aligner les coefficients, mais le code résultant ressemblera probablement à un baroque désordre).

|X|

R(x)=π2exp(x22)xj=02jj!(2j+1)!x2j

x2jcj=2jj!(2j+1)!c0=1cj+1=cj2j+3


|x|

Lentz , Thompson et Barnett ont dérivé un algorithme pour évaluer numériquement une fraction continue comme un produit infini, qui est plus efficace que l'approche habituelle de calculer une fraction continue "en arrière". Au lieu d'afficher l'algorithme général, je montrerai comment il se spécialise dans le calcul du ratio de Mills:

Y0=x,C0=Y0,0=0
répéter pour j=1,2,

j=1X+jj-1
Cj=X+jCj-1
Hj=Cjj
Ouij=HjOuij-1
jusqu'à |Hj-1|<tol
R(X)=1Ouij

tol

Le CF est utile lorsque la série mentionnée précédemment commence à converger lentement; vous devrez expérimenter la détermination du «point de rupture» approprié pour passer de la série au CF dans votre environnement informatique. Il existe également l'alternative d'utiliser une série asymptotique au lieu du Laplacian CF, mais mon expérience est que le Laplacian CF est assez bon pour la plupart des applications.


Enfin, si vous n'avez pas besoin de calculer la fonction d'erreur (complémentaire) de manière très précise (c'est-à-dire avec seulement quelques chiffres significatifs), il existe des approximations compactes dues à Serge Winitzki. Voici l'un d'entre eux:

R(X)2π+X(π-2)2+X2π+X2(π-2)

1,84×dix-2X

JM n'est pas un statisticien
la source
8

(Cette réponse est apparue à l'origine en réponse à une question similaire, fermée par la suite en double. Le PO ne voulait que "une" mise en œuvre de l'intégrale gaussienne, pas nécessairement "l'état de la technique". Dans ses commentaires, il est devenu évident qu'un système relativement simple , une courte mise en œuvre serait préférable.)


8.5+8.5

Une version MatLab (avec les attributions appropriées) est disponible à http://people.sc.fsu.edu/~jburkardt/m_src/asa005/alnorm.m . Une version complètement non documentée du code Fortran d'origine apparaît sur un site "Koders Code Search" (sic).

Il y a de nombreuses années, j'ai porté cela sur AWK. Cette version peut être plus agréable à porter pour le développeur moderne en raison de sa syntaxe de type C (plutôt que de Fortran) et de quelques commentaires supplémentaires que j'ai insérés lors de son développement et de son test, car j'avais besoin d'améliorer sa précision. Il apparaît ci-dessous.

Pour ceux qui n'ont pas beaucoup d'expérience dans le portage de code scientifique / mathématique / statistiques, quelques conseils : une seule erreur typographique peut créer de graves erreurs qui pourraient ne pas être facilement détectables. (Faites-moi confiance à ce sujet, j'en ai fait beaucoup.) Toujours, créez toujours un test minutieux et exhaustif. Parce que la fonction normale intégrale / intégrale / erreur gaussienne est disponible dans de nombreux tableaux et dans de nombreux logiciels, il est simple et rapide de tabuler un grand nombre de valeurs de votre fonction portée et de comparer systématiquement (c'est-à-dire avec l'ordinateur, pas à l'œil nu) les valeurs pour les corriger. Vous pouvez voir un tel test au début de mon code: il produit une table de valeurs en -8,5: 8,5 (par 0,1) qui peut être canalisée (via STDOUT) vers un autre programme pour une vérification systématique.

Une autre approche de test - pour ceux qui ont suffisamment de connaissances en analyse numérique pour savoir comment estimer les erreurs attendues - serait de différencier numériquement les valeurs et de les comparer au PDF (qui est facilement calculé).

0-Xμσz=(X-μ)/σalnorm

Éditer

alnorm1-Φ(z)z1alnorm

Alnorm

4×dix-11 z=16zz=(2×708)37,6

alnorm[-6.0]9.865 876 450 315E-dix12erfc(32)9.865 876 450 377E-dix

UPPER_TAIL_IS_ZERO15.16.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
la source
J'ai utilisé boost en C ++ pour calculer le CDF de la distribution normale. Mais parfois, lorsque je calcule P (x> mean1 + sigma1) pour la normale (mean1, sigma1), puis recalcule la P (x> mean2 + sigma2) pour la pour la normale (mean2, sigma2), cela donne toujours la même chose valeur de probabilité! Même si j'essaye avec d'autres valeurs légèrement différentes de moyenne et de sigma. Cela a-t-il une signification?
shn
Pr(Z>1)Z=(X-meunen1)/σ1Z=(X-meunen2)/σ2 a une distribution normale standard (de moyenne zéro et unité SD). C'est facile à comprendre comme un changement d'unités: c'est comme compter le nombre de jours où la température a dépassé 86 degrés (F) et noter que c'est exactement le même nombre de jours où la température a dépassé 30 degrés (C).
whuber
Oh super alors, je pensais que c'était une erreur dans mon code.
shn
Et oui, en fait, ce n'est pas la même probabilité, mais très proches les uns des autres, comme 0.158655273989975 et 0.158655230168700
shn
1
@Cardinal: c'est fait.
whuber