Оцініть певний інтервал нормального розподілу


18

Я знаю, що легкої в обробці формули для CDF нормального розподілу дещо відсутня через складну функцію помилок у ній.

Однак мені цікаво, чи є приємна формула для . Або яким може бути наближення "найсучаснішого" до цієї проблеми.N(c-х<c+|мк,σ2)

Відповіді:


31

Це залежить від того, що саме ви шукаєте . Нижче наведені короткі деталі та довідки.

Значна частина літератури для апроксимацій зосереджується навколо функції

Q(x)=x12πeu22du

для x>0 . Це тому, що надану вами функцію можна розкласти як просту різницю функції вище (можливо, скориговану на константу). Ця функція посилається на багато імен, включаючи "верхній хвіст нормального розподілу", "правильний нормальний інтеграл" та "Гауссова Q функція", щоб назвати декілька. Ви також побачите наближення до коефіцієнта Міллса , яке

R(x)=Q(x)φ(x)
де φ(x)=(2π)1/2ex2/2 - це гауссовий pdf.

Тут я перелічу кілька посилань для різних цілей, які можуть вас зацікавити.

Обчислювальна

Стандартним фактором для обчислення Q функції або відповідної додаткової функції помилок є

WJ Коді, Раціональне наближення Чебишева до функції помилок , математика. Склад. , 1969. С. 631--637.

Кожна (поважаюча себе) реалізація використовує цей документ. (MATLAB, R тощо)

"Прості" наближення

Абрамовіц і Стегун мають один на основі многочленного розширення перетворення вхідного сигналу. Деякі люди використовують це як "високоточне" наближення. Мені це не подобається з цією метою, оскільки він погано поводиться біля нуля. Наприклад, їх апроксимація не дає , що, на мою думку, є великим ні-ні. Іноді через це трапляються погані речі .Q^(0)=1/2

Borjesson та Sundberg дають просте наближення, яке працює досить добре для більшості застосунків, де потрібно лише кілька цифр точності. Абсолютна відносна похибка ніколи не гірше , ніж на 1%, що цілком непогано , з огляду на його простоту. Основним наближенням є і їх кращий вибір констант: і . Це посилання єa=0,339b=5,51

Q^(х)=1(1-а)х+ах2+бφ(х)
а=0,339б=5.51

PO Borjesson та CE Sundberg. Прості наближення функції помилки Q (x) для програм зв'язку . IEEE Trans. Комун. , COM-27 (3): 639–643, березень 1979 року.

Ось сюжет його абсолютної відносної похибки.

введіть тут опис зображення

Електротехнічна література рясніє різними подібними наближеннями і, здається, викликає в них надто інтенсивний інтерес. Багато з них є бідними, але розширюються до дуже дивних і перекручених виразів.

Ви також можете подивитися

В. Брайк. Рівномірне наближення до правильного нормального інтеграла . Прикладна математика та обчислення , 127 (2-3): 365–374, квітень 2002.

Продовження фракції Лапласа

У Лапласа є прекрасна тривала фракція, яка дає послідовну верхню та нижню межі для кожного значення . Це, з точки зору коефіцієнта Фрези,х>0

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

де позначення, які я використав, є досить стандартними для продовження дробу , тобто . Цей вираз не збігається дуже швидко для малого , однак він розходиться при .x x = 01/(х+1/(х+2/(х+3/(х+))))хх=0

Ця тривала фракція фактично дає багато «простих» меж на які були «повторно розкриті» в середині-наприкінці 1900-х років. Неважко помітити, що для триваючого дробу у "стандартній" формі (тобто, складеної з додатних цілих коефіцієнтів), обрізання дробу на непарних (парних) умовах дає верхню (нижню) межу.Q(х)

Отже, Лаплас нам одразу каже, що обидва з яких є межею, які були "знову розкриті" в середині- 1900-ті роки. З точки зору функції це еквівалентно Альтернативний доказ цього за допомогою простої інтеграції за частинами можна знайти у С. Реснік, Пригоди в стохастичних процесах , Біркхаузер, 1992, у розділі 6 (броунівський рух). Абсолютна відносна похибка цих меж не гірше , як показано у відповідній відповіді .Q x

хх2+1<R(х)<1х,
Qх-2
xx2+1φ(х)<Q(х)<1хφ(х).
х-2

Зауважте, зокрема, що вищезгадані нерівності означають, що . Цей факт можна встановити, використовуючи також правило L'Hopital. Це також допомагає пояснити вибір функціональної форми наближення Борсессона-Сундберга. Будь-який вибір підтримує асимптотичну еквівалентність як . Параметр служить "корекцією безперервності" біля нуля.a [ 0 , 1 ] x bQ(х)φ(х)/ха[0,1]хб

Ось сюжет функції та два межі Лапласа.Q

Межі Лапласа для верхнього хвоста нормального розподілу

CI. C. Lee має документ з початку 1990-х років, який робить "корекцію" для малих значень . Побачитих

CI. C. Лі. Продовження дробу Лапласа для нормального інтеграла . Енн. Інст. Статист. Математика. , 44 (1): 107–120, березень 1992 року.


Вірогідність Даретта : теорія та приклади подають класичну верхню та нижню межі на на сторінках 6–7 3-го видання. Вони призначені для більших значень (скажімо, ) і є асимптотично щільними.x x > 3Q(х)хх>3

Сподіваємось, це змусить вас розпочати роботу. Якщо у вас є більш конкретний інтерес, я можу вам десь вказати.


9

Я вважаю, що я запізнився герой, але я хотів прокоментувати допис кардинала, і цей коментар став занадто великим для передбачуваної скриньки.

Для цієї відповіді я припускаю ; відповідні формули відображення можуть бути використані для негативного .xх>0х

Я більше звик сам працювати з функцією помилок , але спробую переробити те, що я знаю, у співвідношенні Міллса (як визначено у відповіді кардинала).R ( x )еrf(х)R(х)

Насправді існують альтернативні способи обчислення функції (додаткової) помилки, крім використання наближень Чебишева. Оскільки використання наближення Чебишева вимагає збереження не декількох коефіцієнтів, ці методи можуть мати перевагу, якщо структури масиву трохи затратні у вашому обчислювальному середовищі (ви можете вбудувати коефіцієнти, але отриманий код, мабуть, буде схожий на бароко безлад).

Для "малих", Абрамовіц і Стегун дають чудово поведені серії (принаймні, краще, ніж звичайні серії Маклауріна):|х|

R(х)=π2досвід(х22)-хj=02jj!(2j+1)!х2j
(адаптовано за формулою 7.1.6 )

Зауважимо, що коефіцієнти у ряду Можна обчислити, починаючи з і потім використовуючи формулу рекурсії . Це зручно при реалізації серії як цикл підсумовування.х2jcj=2jj!(2j+1)!c0=1cj+1=cj2j+3


кардинал дав лаплаціанської тривалої фракції як спосіб пов'язати відношення Міллса для великих; що не так добре відомо, що триваюча частка також є корисною для числового оцінювання.|х|

Ленц , Томпсон і Барнетт вивели алгоритм чисельної оцінки тривалої дроби як нескінченного продукту, який є більш ефективним, ніж звичайний підхід обчислення тривалої дроби "назад". Замість показу загального алгоритму я покажу, як він спеціалізується на обчисленні коефіцієнта Міллса:

Y0=х,С0=Y0,D0=0
повторити для j=1,2,

Dj=1х+jDj-1
Сj=х+jСj-1
Нj=СjDj
Yj=НjYj-1
до тих пір, поки |Нj-1|<тол
R(х)=1Yj

де визначає точність.тол

CF корисний, коли раніше згадана серія починає повільно сходитися; вам доведеться поекспериментувати з визначенням відповідної "точки розриву" для переходу з серії на CF у вашому обчислювальному середовищі. Існує також альтернатива використання асимптотичного ряду замість Laplacian CF, але мій досвід полягає в тому, що Laplacian CF досить хороший для більшості застосувань.


Нарешті, якщо вам не потрібно дуже точно обчислювати (додаткову) функцію помилок (тобто лише до декількох значущих цифр), існують компактні наближення завдяки Сергію Вінцкі. Ось один із них:

R(х)2π+х(π-2)2+х2π+х2(π-2)

Максимальна відносна похибка цього наближення становить і стає більш точною, оскільки зростає.1,84×10-2х


8

(Ця відповідь спочатку з'явилася у відповідь на аналогічне запитання, згодом була закрита як дублікат. ОП хотіла лише "впровадження інтегралу Гаусса, а не обов'язково" сучасного рівня ". У його коментарі стало очевидним, що відносно просто , краща реалізація буде кращою.)


Як зазначають коментарі, вам потрібно інтегрувати PDF-файл . Існує багато способів виконання інтеграла. Давно, коли обчислення були повільними і дорогими, Девід Хілл розробив наближення, використовуючи просту арифметику (раціональні функції та експоненцію). Він має подвійну точність точності для типових аргументів ( приблизно від до , приблизно). У 1973 році він опублікував версію Fortran у прикладі статистики під назвою ALNORM.F. Протягом багатьох років я переносив це в різні середовища, які не мали нормального (гауссового) інтеграла або мали підозрілі (наприклад, Excel).-8.5+8.5

Версія MatLab (з відповідними атрибутами) доступна на веб-сайті http://people.sc.fsu.edu/~jburkardt/m_src/asa005/alnorm.m . Повністю недокументована версія оригінального коду Fortran з’являється на сайті «Код кодексу» (sic).

Багато років тому я переніс це AWK. Ця версія може бути більш приємною для порту сучасного розробника завдяки синтаксису подібного С (а не до Fortran) та додаткових коментарів, які я вставляв під час розробки та тестування, оскільки мені потрібно було підвищити його точність. Це відображається нижче.

Для тих, хто не має великого досвіду переносу наукового / математичного / статистичного коду, кілька порад : одна єдина типографічна помилка може створити серйозні помилки, які не можуть бути легко виявити. (Повірте мені в цьому, я зробив їх багато.) Завжди завжди створюйте ретельний і вичерпний тест. Оскільки нормальна інтегральна / гауссова інтегральна / помилкова функція доступна у стільки таблиць і стільки програмного забезпечення, легко та швидко підвести таблицю величезної кількості значень вашої перенесеної функції та систематично порівнювати (тобто з комп’ютером, а не на очі) значення для виправлення. Ви можете побачити такий тест на початку мого коду: він створює таблицю значень в -8,5: 8,5 (на 0,1), яка може бути передана (через STDOUT) до іншої програми для систематичної перевірки.

Іншим підходом до тестування - для тих, хто має достатній чисельний аналіз, щоб знати, як оцінити очікувані помилки - було б числове розмежування значень та порівняння їх з PDF (який легко обчислюється).

До речі: цей код є лише для випадку із середнім значенням та одиничним стандартним відхиленням ("сигма"). Але це все, що потрібно: інтегрувати від до коли середнє значення - а SD - , просто обчислити і застосувати до нього.0-хмкσz=(х-мк)/σalnorm

Редагувати

Я випробував порт alnormдля Mathematica, яка обчислює значення для довільної точності. Для порівняння результатів наводимо сюжет природного журналу співвідношень верхніх значень хвоста з . (Позитивна відносна помилка означає занадто багато.)1-Φ(z)z1alnorm

Анорма

Значення завжди точні до щодо малих імовірностей хвоста . Ви можете бачити, де обчислення переходить на асимптотичну формулу (при ), і очевидно, що ця формула стає надзвичайно точною, оскільки збільшується. Ділянка зупиняється на оскільки тут починається переповнення подвійної точності.4×10-11 z=16zz=(2×708)37.6

Наприклад, alnorm[-6.0]повертає тоді як справжнє значення, рівне , становить приблизно , спочатку відрізняється дванадцятою десятковою цифрою.9.865 876 450 315Е-1012erfc(32)9.865 876 450 377Е-10

NB У рамках цього редагування, я змінився UPPER_TAIL_IS_ZEROз 15.до 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 ###

Я використовував підвищення на C ++ для обчислення CDF нормального розподілу. Але іноді, коли я обчислюю P (x> mean1 + sigma1) для нормального (mean1, sigma1), а потім перераховую P (x> mean2 + sigma2) для нормального (mean2, sigma2), він завжди дає те саме значення ймовірності! Навіть якщо я спробую з іншими дещо різними значеннями середнього значення та сигми. Чи має це якесь означення?
шн

@ user995434 Це гарне спостереження. Це адресовано в останньому рядку моєї відповіді: обидва обчислення еквівалентні де або має стандартну норму розподіл (нульової середньої та одиничної SD). Це легко зрозуміти як зміну одиниць: це як підрахувати кількість днів, коли температура перевищила 86 градусів (F), і зазначити, що це точно така ж кількість днів, коли температура перевищила 30 градусів (C). Пр(Z>1)Z=(Х-меан1)/σ1Z=(Х-меан2)/σ2
whuber

Ну чудово тоді, я думав, що це помилка в моєму коді.
шн

І так , на самому ділі це не те ж ймовірність, але дуже близько один до одного, як 0.158655273989975 і 0.158655230168700
SHN

1
@Cardinal: зроблено.
whuber
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.