정규 분포의 명확한 구간 평가


18

정규 분포의 CDF에 대한 수식을 쉽게 처리 할 수 ​​있기 때문에 복잡한 오류 함수로 인해 다소 누락되었습니다.

그러나 대한 좋은 공식이 있는지 궁금합니다 . 또는이 문제에 대한 "최신 상태"의 근사값은 무엇입니까?(엑스<+|μ,σ2)

답변:


31

그것은 당신이 찾고있는 것에 정확히 달려 있습니다 . 다음은 간단한 세부 정보 및 참조입니다.

근사에 대한 많은 문헌은 함수

(엑스)=엑스12π이자형22

위한 . 제공 한 함수는 위 함수의 간단한 차이로 분해 될 수 있기 때문입니다 (상수에 의해 조정될 수 있음). 이 함수는 "정규 분포의 상단 꼬리", "올바른 정규 적분"및 "가우시안 Q 함수"를 포함하여 많은 이름으로 지칭됩니다 . 또한 근사치로 확인할 밀스 비율 이며, R ( X ) = Q ( X를 )엑스>0 여기서,φ(X)=을(2π)-1/2전자-X2/2가우시안 PDF 파일이다.

아르 자형(엑스)=(엑스)φ(엑스)
φ(엑스)=(2π)1/2이자형엑스2/2

여기에 여러분이 관심을 가질만한 다양한 목적을위한 참고 문헌이 있습니다.

계산

함수 또는 관련 보완 오류 함수 를 계산하기위한 사실상의 표준은 다음과 같습니다.

WJ Cody, 오류 함수에 대한 Rational Chebyshev 근사치 , 수학. Comp. 1969, 631--637 쪽.

모든 (자기 존중) 구현은이 백서를 사용합니다. (MATLAB, R 등)

"간단한"근사치

Abramowitz와 Stegun 은 입력 변환의 다항식 확장을 기반으로합니다. 어떤 사람들은 이것을 "정밀"근사치로 사용합니다. 나는 그것이 제로 주위에서 나쁘게 행동하기 때문에 그 목적을 좋아하지 않습니다. 예를 들어, 그 근사 않는 하지 수득 Q ( 0 ) = 1 / 2 I 더 큰 노 생각하지 않는다. 때때로 이로 인해 나쁜 일 이 발생합니다.^(0)=1/2

Borjesson과 Sundberg는 간단한 근사값을 제공합니다.이 근사값은 소수 자릿수 만 필요한 대부분의 응용 프로그램에서 잘 작동합니다. 절대 상대 오차는 결코 더 단순함을 고려 꽤 좋은 1 %보다 없습니다. 기본 근사치는 Q ( X ) = 1 와 상수의 바람직한 선택은a=0.339b=5.51입니다. 그 참조는

^(엑스)=1(1)엑스+엑스2+φ(엑스)
=0.339=5.51

PO Borjesson 및 CE Sundberg. 통신 애플리케이션에 대한 에러 함수 Q (x)의 간단한 근사치 . IEEE Trans. 코뮌. , COM-27 (3) : 639-643, 1979 년 3 월.

다음은 절대 상대 오차의 도표입니다.

여기에 이미지 설명을 입력하십시오

전기 공학 문헌은 다양한 근사치로 가득 차 있으며 지나치게 관심이있는 것으로 보입니다. 그러나 그들 중 다수는 가난하거나 매우 이상하고 복잡한 표현으로 확장됩니다.

당신은 또한 볼 수 있습니다

브라이. 올바른 정규 적분에 대한 균일 한 근사치 . 응용 수학과 계산 , 127 (2-3) : 365–374, 2002 년 4 월.

라플라스의 연속 분수

Laplace는 의 모든 값에 대해 연속 된 상한 및 하한을 산출하는 아름다운 연속 비율을 갖습니다 . 그것은 Mills '비율로엑스>0

아르 자형(엑스)=1엑스+1엑스+2엑스+엑스+,

내가 사용한 표기법은 연속 분수 , 즉 대해 상당히 표준입니다 . 이 식은 작은 x에 대해 매우 빠르게 수렴되지 않으며 x = 0 에서 분기됩니다 .1/(x+1/(x+2/(x+3/(x+))))xx=0

이 연속 분율은 실제로 1900 년대 중반에서 후반까지 "재발견 된" 에 대한 많은 "간단한"경계를 산출 합니다. "표준"형태의 연속 분수 (즉, 양의 정수 계수로 구성됨)에 대해 홀수 (짝수) 항에서 분수를 자르면 상한 (하한)이 생성됨을 쉽게 알 수 있습니다.Q(x)

따라서 Laplace는 둘 중반 1900 년대에 "재발견"한 경계입니다. Q 함수의관점에서 이것은 x 와 같습니다.

xx2+1<R(x)<1x,
부품에 의한 간단한 통합을 사용하여 이에 대한 대안적인 증거는 S. Resnick,StochasticProcesss의모험, Birkhauser, 1992 년 6 장 (Brownian motion)에서 찾을 수 있습니다. 이 관련 답변에서 볼 수 있듯이이러한 경계의 절대 상대 오차는x-2보다 나쁘지 않습니다.
xx2+1φ(x)<Q(x)<1xφ(x).
x2

Q(x)φ(x)/엑스a[0,1]x

정규 분포의 상단 꼬리에 대한 Laplace 경계

엑스

CI. C. 리. Laplace에서 정규 적분에 대한 분수가 계속되었습니다 . 앤 Inst. 통계 학자. 수학. , 44 (1) : 107-120, 1992 년 3 월.


Q(엑스)엑스엑스>

잘만되면 이것이 당신을 시작할 것입니다. 좀 더 구체적으로 관심이 있으시면 어딘가에 가리킬 수 있습니다.


9

나는 영웅이 너무 늦었다 고 생각하지만 추기경의 게시물에 댓글을 달고 싶었고이 댓글은 의도 된 상자에 비해 너무 커졌습니다.

엑스>0엑스

이자형아르 자형에프(엑스)아르 자형(엑스)

Chebyshev 근사값을 사용하는 것 외에 (보완 적) 오류 함수를 계산하는 대체 방법이 있습니다. Chebyshev 근사법을 사용하려면 몇 가지 계수를 저장해야하므로 컴퓨팅 환경에서 배열 구조가 약간 비싸면 이러한 방법이 우위에있을 수 있습니다 (계수를 인라인 할 수는 있지만 결과 코드는 바로크처럼 보일 수 있습니다. 음식물).

|엑스|

아르 자형(엑스)=π2특급(엑스22)엑스제이=02제이제이!(2제이+1)!엑스2제이

엑스2제이제이=2제이제이!(2제이+1)!0=1제이+1=제이2제이+


|엑스|

Lentz , Thompson 및 Barnett 는 연속 분수를 무한 곱으로 수치 적으로 평가하는 알고리즘을 도출했습니다. 이는 연속 분수 "뒤로"를 계산하는 일반적인 방법보다 효율적입니다. 일반적인 알고리즘을 표시하는 대신 Mills 's ratio 계산에 전문화되는 방법을 보여 드리겠습니다.

와이0=엑스,0=와이0,0=0
반복하다 제이=1,2,

제이=1엑스+제이제이1
제이=엑스+제이제이1
H제이=제이제이
와이제이=H제이와이제이1
...까지 |H제이1|<
아르 자형(엑스)=1와이제이

CF는 앞에서 언급 한 시리즈가 느리게 수렴하기 시작하는 경우에 유용합니다. 컴퓨팅 환경에서 시리즈를 CF로 전환하기 위해 적절한 "브레이크 포인트"를 결정하는 실험을해야합니다. Laplacian CF 대신 Asymptotic 시리즈를 사용하는 대안이 있지만 필자의 경험에 따르면 Laplacian CF는 대부분의 응용 프로그램에 충분합니다.


마지막으로, (상보적인) 오류 함수를 매우 정확하게 계산할 필요가없는 경우 (즉, 소수의 유효 숫자 만) Serge Winitzki로 인해 간결한 근사 가 있습니다 . 다음 중 하나입니다.

아르 자형(엑스)2π+엑스(π2)2+엑스2π+엑스2(π2)

1.84×102엑스


8

(이 답변은 원래 유사한 질문에 대한 응답으로 나타 났으며, 이후 복제본으로 마감되었습니다. OP는 반드시 "최첨단 기술"이 아닌 가우시안 적분의 "구현"만 원했습니다. 짧은 구현이 선호됩니다.)


8.5+8.5

MatLab 버전 (적절한 속성이있는)은 http://people.sc.fsu.edu/~jburkardt/m_src/asa005/alnorm.m 에서 구할 수 있습니다 . 원본 포트란 코드의 완전히 문서화되지 않은 버전이 "코더 코드 검색" (sic) 사이트에 나타납니다 .

몇 년 전에 나는 이것을 AWK로 옮겼다. 이 버전은 Fortran이 아닌 C와 유사한 구문과 개발 및 테스트시 삽입 한 추가 주석으로 인해 최신 개발자가 포팅하는 데 더 적합 할 수 있습니다. 정확도를 향상시켜야했기 때문입니다. 아래에 나타납니다.

과학 / 수학 / 통계 코드를 이식 한 경험이없는 사람들을위한 몇 가지 조언 : 한 번의 인쇄상의 실수로 쉽게 감지 할 수없는 심각한 오류가 발생할 수 있습니다. (내가 이것을 신뢰하고, 나는 그것들을 많이 만들었다.) 항상, 항상 신중하고 철저한 테스트를 만든다. 일반적인 적분 / 가우시안 적분 / 오류 기능은 수많은 테이블과 소프트웨어에서 사용할 수 있기 때문에 포팅 된 기능의 많은 수의 값을 체계적으로 비교하고 체계적으로 비교할 수 있습니다 (예 : 눈으로 보지 않고 컴퓨터로). 값을 정정하기위한 값. 내 코드의 시작 부분에서 이러한 테스트를 볼 수 있습니다. 시스템 검사를 위해 다른 프로그램에 (STDOUT을 통해) 파이프 될 수있는 -8.5 : 8.5 (0.1)의 값 테이블을 생성합니다.

예상 수치를 추정하는 방법을 알기에 충분한 수치 분석 배경을 가진 사람들을위한 또 다른 테스트 방법은 수치를 수치 적으로 구분하여 PDF와 쉽게 비교하는 것입니다 (쉽게 계산 됨).

0엑스μσ=(엑스μ)/σalnorm

편집하다

alnorm1Φ()1alnorm

알 노름

4×1011 =16=(2×708)37.6

alnorm[-6.0]9.865 876 450 315이자형1012erfc(2)9.865 876 450 377이자형10

UPPER_TAIL_IS_ZERO15.16.1516

#----------------------------------------------------------------------#
#   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 ###

정규 분포의 CDF를 계산하기 위해 C ++에서 boost를 사용했습니다. 그러나 때로는 정규 (mean1, sigma1)에 대해 P (x> mean1 + sigma1)을 계산 한 다음 normal (mean2, sigma2)에 대한 P (x> mean2 + sigma2)를 다시 계산할 때 항상 동일한 결과를 제공합니다 확률값! 다른 약간의 평균과 시그마 값으로 시도하더라도. 이것은 어떤 의미가 있습니까?
15시

홍보(>1)=(엑스미디엄이자형1)/σ1=(엑스미디엄이자형2)/σ2 표준 정규 분포 (평균 및 단위 SD)가 있습니다. 단위 변경으로 이해하기 쉽습니다. 온도가 86도 (F)를 초과 한 일 수를 세고 온도가 30도 (C)를 초과 한 일 수를 정확히 나타내는 것과 같습니다.
whuber

그때 훌륭합니다. 코드에 오류가 있다고 생각했습니다.
15

그리고 실제로 그것은 같은 확률은 아니지만 0.158655273989975 및 0.158655230168700과 같이 서로 매우 가깝습니다.
shn

1
@Cardinal : 완료.
whuber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.