Normal dağılımın belirli aralıklarını değerlendirin


18

Normal bir dağılımın CDF'si için kullanımı kolay bir formülün, içindeki karmaşık hata fonksiyonu nedeniyle biraz eksik olduğunu biliyorum.

Bununla birlikte, için güzel bir formül olup olmadığını merak ediyorum . Veya bu sorun için "son teknoloji" yaklaşım ne olabilir.N(cx<c+|μ,σ2)

Yanıtlar:


33

Tam olarak ne aradığınıza bağlıdır . Aşağıda bazı kısa ayrıntılar ve referanslar verilmiştir.

Yaklaşık literatürün çoğu

Q(x)=x12πeu22du

için . Bunun nedeni, sağladığınız işlevin yukarıdaki işlevin basit bir farkı olarak ayrıştırılabilmesidir (muhtemelen bir sabit tarafından ayarlanabilir). Bu fonksiyona "normal dağılımın üst kuyruğu", "sağ normal integral" ve "Gauss fonksiyonu" dahil birçok isim denir . Ayrıca , olan Değirmenlerin oranını da göreceksiniz , burada 2/2 Gauss pdf'dir.x>0Q

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

Burada ilginizi çekebilecek çeşitli amaçlar için bazı referansları listeliyorum.

Hesaplamalı

işlevini veya ilgili tamamlayıcı hata işlevini hesaplamak için fiili standartQ

WJ Cody, Rasyonel Chebyshev Hata Fonksiyonu Yaklaşımları , Matematik. Zorunlu. , 1969, sayfa 631-637.

Her (kendine saygılı) uygulama bu makaleyi kullanır. (MATLAB, R vb.)

"Basit" Yaklaşımlar

Abramowitz ve Stegun , girdinin dönüşümünün polinom genişlemesine dayanan bir tanesine sahiptir. Bazı insanlar bunu "yüksek hassasiyetli" bir yaklaşım olarak kullanır. Bu amaç için sevmiyorum çünkü sıfır civarında kötü davranıyor. Örneğin, kendi yaklaşım etmez olup verim hiçbir-no büyük olduğunu düşünüyorum. Bazen bu yüzden kötü şeyler olur.Q^(0)=1/2

Borjesson ve Sundberg, sadece birkaç basamak hassasiyet gerektiren çoğu uygulama için oldukça iyi çalışan basit bir yaklaşım sağlar. Mutlak bağıl hata asla kötü sadeliği göz önüne alındığında oldukça iyi% 1, aşıyor. Temel yaklaşım ve sabitlerin tercih ettikleri seçenekleri ve . Bu referansa=0.339b=5.51

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

Borjesson ve CE Sundberg Karşılaştırması. İletişim uygulamaları için Q (x) hata fonksiyonunun basit tahminleri . IEEE Çev. Commun. , COM-27 (3): 639–643, Mart 1979.

İşte mutlak göreceli hatasının bir grafiği.

resim açıklamasını buraya girin

Elektrik mühendisliği literatürü bu gibi çeşitli yaklaşımlarla çalkalanmaktadır ve bunlara aşırı derecede ilgi duymaktadır. Birçoğu olsa fakirdir veya çok garip ve kıvrımlı ifadelere genişler.

Şuna da bakabilirsiniz:

W. Bryc. Sağ normal integrale düzgün bir yaklaşım . Uygulamalı Matematik ve Hesaplama , 127 (2-3): 365-374, Nisan 2002.

Laplace'ın devam eden kesiri

Laplace, her değeri için art arda üst ve alt sınırlar veren güzel bir sürekli fraksiyona sahiptir . Mills'in oranı açısından,x>0

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

burada kullandığım gösterim sürekli bir kesir için oldukça standarttır , yani . Bu ifade, küçük için çok hızlı yakınsama yapmaz ve ayrılır .1/(x+1/(x+2/(x+3/(x+))))x = 0xx=0

Bu devam eden fraksiyon aslında üzerinde 1900'lerin ortasından sonuna kadar yeniden keşfedilen " basit" sınırların çoğunu verir . "Standart" formdaki (örneğin, pozitif tamsayı katsayılarından oluşan) devam eden bir kesir için, kesiri tek (çift) terimlerle kesmenin bir üst (alt) bağlanma verdiğini görmek kolaydır.Q(x)

Laplace bize derhal olduğunu söyler her ikisi de ortada "yeniden keşfedilen" sınırlardır. 1900. işlevi açısından , bu Parçalarla basit entegrasyon kullanılarak bunun alternatif bir kanıtı S. Resnick, Stokastik Süreçlerde Maceralar , Birkhauser, 1992, Bölüm 6'da (Brown hareketi) bulunabilir. Bu sınırların mutlak göreceli hatası, bu ilgili cevapta gösterildiği gibi den daha kötü değildir .

xx2+1<R(x)<1x,
xQ
xx2+1φ(x)<Q(x)<1xφ(x).
x2

Özellikle, yukarıdaki eşitsizliklerin derhal anlamına geldiğine dikkat edin . Bu gerçek L'Hopital'in kuralı kullanılarak da kurulabilir. Bu aynı zamanda Borjesson-Sundberg yaklaşımının fonksiyonel formunun seçimini açıklamaya yardımcı olur. herhangi seçimi , asimptotik eşdeğeri olarak korur . Parametre sıfıra yakın bir "süreklilik düzeltmesi" olarak işlev görür.a [ 0 , 1 ]Q(x)φ(x)/xa[0,1]bxb

İşte fonksiyonunun ve iki Laplace sınırının bir grafiği .Q

Normal dağılımın üst kuyruğu için Laplace sınırları

CI. C. Lee 1990'ların başlarından itibaren küçük değerleri için bir "düzeltme" yapan bir makaleye sahiptir . Görmekx

CI. C. Lee. Laplace'da normal integral için devam eden kesir . Ann. Öğr. Devletçi. Matematik. , 44 (1): 107–120, Mart 1992.


Durrett'in Olasılığı: Teori ve Örnekler , 3. baskının 6-7. Sayfalarında üzerindeki klasik üst ve alt sınırları sağlar . Daha büyük değerleri içindir (örneğin, ) ve asimptotik olarak sıkıdırlar.x x > 3Q(x)xx>3

Umarım bu başlamanıza yardımcı olur. Daha özel bir ilginiz varsa, sizi bir yere yönlendirebilirim.


10

Sanırım kahramanı çok geç kaldım, ama kardinalin gönderisi hakkında yorum yapmak istedim ve bu yorum amaçlanan kutu için çok büyük oldu.

Bu cevap için ; negatif için uygun yansıma formülleri kullanılabilir .xx>0x

Daha fazla hata fonksiyonu ile başa çıkmak için alışkınım , ama Mills'in oranı (kardinal cevabında tanımlandığı gibi açısından bildiğim şeyi yeniden düzenlemeye çalışacağım .R ( x )erf(x)R(x)

Aslında Chebyshev yaklaşımlarını kullanmak dışında (tamamlayıcı) hata fonksiyonunu hesaplamanın alternatif yolları vardır. Bir Chebyshev yaklaşımının kullanımı birkaç katsayının saklanmasını gerektirmediğinden, dizi yapıları bilgisayar ortamınızda biraz pahalıysa bu yöntemlerin bir kenarı olabilir (katsayıları satır içine alabilirsiniz, ancak sonuçta ortaya çıkan kod muhtemelen bir barok gibi görünecektir) dağınıklık).

"Küçük" için, Abramowitz ve Stegun güzel davranan bir seri verir (en azından normal Maclaurin serisinden daha iyi davranır):|x|

R(x)=π2exp(x22)xj=02jj!(2j+1)!x2j
( formül 7.1.6'dan uyarlanmıştır )

Katsayıları bu Not serisi İle başlanarak hesaplanabilir yineleme formülü ile ve daha sonra . Bu seriyi bir toplama döngüsü olarak uygularken kullanışlıdır.x2jcj=2jj!(2j+1)!c0=1cj+1=cj2j+3


kardinal Laplacian devam kesirine Mills'in büyük oranını sınırlama yolu olarak verdi; iyi bilinmeyen, devam eden fraksiyonun sayısal değerlendirme için de yararlı olduğudur.|x|

Lentz , Thompson ve Barnett , devam eden bir fraksiyonun sonsuz bir ürün olarak sayısal olarak değerlendirilmesi için bir algoritma türetmiştir; bu, devam eden bir fraksiyonun "geriye" hesaplanması için olağan yaklaşımdan daha etkilidir. Genel algoritmayı görüntülemek yerine, Mills'in oranının hesaplanmasında nasıl uzmanlaştığını göstereceğim:

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

burada doğruluğu belirler.tol

CF, daha önce bahsedilen serilerin yavaşça yakınsamaya başladığı durumlarda kullanışlıdır; bilgi işlem ortamınızdaki seriden CF'ye geçmek için uygun "kırılma noktasını" belirlemeyi denemeniz gerekir. Laplacian CF yerine asimtotik bir seri kullanmanın alternatifi de var, ancak deneyimim Laplacian CF'nin çoğu uygulama için yeterince iyi olması.


Son olarak, (tamamlayıcı) hata işlevini çok doğru bir şekilde hesaplamanız gerekmiyorsa (yani, sadece birkaç önemli basamak için), Serge Winitzki'ye bağlı olarak kompakt yaklaşımlar vardır . İşte bunlardan biri:

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

Bu yaklaşımın maksimum göreceli hatası ve arttıkça daha doğru olur .1.84×102x


8

(Bu cevap başlangıçta benzer bir soruya yanıt olarak ortaya çıktı, daha sonra bir kopya olarak kapatıldı. OP sadece Gauss integralinin "mutlaka" en son teknoloji değil "uygulanmasını istedi." Yorumlarında nispeten basit olduğu anlaşıldı. , kısa uygulama tercih edilir.)


Yorumların işaret ettiği gibi , PDF'yi entegre etmeniz gerekir . İntegrali gerçekleştirmenin birçok yolu vardır . Uzun zaman önce, hesaplamalar yavaş ve pahalı olduğunda, David Hill basit aritmetik (rasyonel fonksiyonlar ve bir üs alma) kullanarak bir yaklaşım geliştirdi. Tipik argümanlar için iki kat doğrulukta hassasiyete sahiptir ( yaklaşık ile arasında ). 1973 yılında Uygulamalı İstatistik'te ALNORM.F adlı Fortran versiyonunu yayınladı. Yıllar boyunca bunu Normal (Gaussian) integrali olmayan veya şüpheli olanlara (Excel gibi) sahip çeşitli ortamlara taşıdım.-8.5+8.5

MatLab sürümü (uygun özniteliklere sahip) http://people.sc.fsu.edu/~jburkardt/m_src/asa005/alnorm.m adresinde bulunabilir . Bir "Koders Kod Arama" (sic) sitesinde orijinal Fortran kodunun tamamen belgelenmemiş bir sürümü görünür .

Yıllar önce bunu AWK'ya taşıdım. Bu sürüm, modern geliştiricinin C benzeri (Fortran yerine) sözdizimi ve geliştirirken ve test ederken eklediğim bazı ek yorumlar nedeniyle bağlantı noktası olarak daha uygun olabilir, çünkü doğruluğunu arttırmam gerekiyordu. Aşağıda görünür.

Bilimsel / matematik / istatistik kodunu taşıma konusunda fazla deneyimi olmayanlar için, bazı tavsiye sözcükleri : tek bir tipografik hata, kolayca algılanamayan ciddi hatalar oluşturabilir. (Bana güvenin, çok şey yaptım.) Her zaman, her zaman dikkatli ve kapsamlı bir test oluşturun. Normal integral / Gauss integrali / hata fonksiyonu birçok tabloda ve çok fazla yazılımda mevcut olduğundan, taşınan işlevinizin çok sayıda değerini tablo haline getirmek ve sistematik olarak karşılaştırmak (yani, gözle değil, bilgisayarla) basit ve hızlıdır. değerleri düzeltmek için. Kodumun başında böyle bir test görebilirsiniz: -8.5: 8.5 (0.1'e kadar) değerlerinde, STDOUT aracılığıyla sistematik kontrol için başka bir programa bağlanabilen bir değer tablosu oluşturur.

Başka bir test yaklaşımı - yeterli sayısal analiz geçmişine sahip olanlar için, beklenen hataların nasıl tahmin edileceğini bilmek için - değerleri sayısal olarak ayırt etmek ve bunları PDF ile karşılaştırmak (kolayca hesaplanır) olacaktır.

Bu arada: bu kod sadece ortalama ve birim standart sapması ("sigma") olan durumlar içindir. Ancak bunların hepsi yeterlidir: ortalama ve SD olduğunda entegre etmek için sadece hesaplayın ve uygulayın .0-xμσz=(x-μ)/σalnorm

Düzenle

Ben bir liman test alnormetmek Mathematica, keyfi hassas değerleri hesaplar. Sonuçları karşılaştırmak için, üst kuyruk değerleri ile oranlarının doğal günlüğünün bir grafiği . (Olumlu göreli hata aracı çok büyük.)1-Φ(z)z1alnorm

Alnorm

Değerler , kaybolan küçük kuyruk olasılıklarına göre daima doğrudur . Hesaplamanın asimtotik bir formüle nerede döndüğünü görebilirsiniz ( ) ve arttıkça bu formülün son derece hassas hale geldiği açıktır . Çizim değerinde durur çünkü burada çift duyarlıklı üs alma işlemi akmaya başlar.4x10-11 z=16zz=(2x708)37.6

Örneğin, alnorm[-6.0]döner gerçek değeri ise, e eşit , yaklaşık , ilk olarak onikinci ondalık basamaktan farklı.9,865 876 450 315E-1012erfc(32)9,865 876 450 377E-10

Bu düzenlemenin bazı NB itibariyle kısmı, ben değiştim UPPER_TAIL_IS_ZEROgelen 15.için 16.kod: ne için sonuç bir nebze daha doğru hale getirir arasındaki ve . (Düzenleme sonu.)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 ###

Normal dağılımın CDF'sini hesaplamak için C ++ 'da boost kullandım. Ancak bazen normal (ortalama1, sigma1) için P (x> ortalama1 + sigma1) hesaplayıp, normal (ortalama2, sigma2) için P (x> ortalama2 + sigma2) değerini yeniden hesapladığımda, her zaman aynı olasılık değeri! Biraz farklı ortalama ve sigma değerleri ile denesem bile. Bunun bir anlamı var mı?
shn

@ user995434 Bu iyi bir gözlem. son satırında ele alındı: her iki hesaplama da ile eşdeğerdir; burada veya standart bir normal dağılım (sıfır ortalama ve birim SD). Birimlerin değişmesi olarak anlaşılması kolaydır: sıcaklığın 86 dereceyi (F) aştığı gün sayısını saymak ve sıcaklığın 30 dereceyi (C) aştığı günlerin tam olarak aynı gün olduğunu not etmek gibidir. Pr(Z>1)Z=(Xmean1)/σ1Z=(Xmean2)/σ2
whuber

Ah o zaman harika, kodumda bir hata olduğunu düşündüm.
shn

Ve evet aslında aynı olasılık değil, ama birbirine çok yakın, örneğin 0.158655273989975 ve 0.158655230168700
shn

1
@Cardinal: bitti.
whuber
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.