Як взяти вибірку з звичайного розподілу з відомими середніми та дисперсійними за допомогою звичайної мови програмування?


36

Я ніколи не проходив курсу статистики, тому сподіваюся, що тут я прошу в потрібному місці.

Припустимо, у мене є лише два дані, що описують нормальний розподіл: середнє та дисперсія . Я хочу використовувати комп'ютер для випадкового вибірки з цього розподілу, щоб я поважав ці дві статистичні дані.μσ2

Цілком очевидно, що я можу впоратися із середнім значенням, просто нормалізуючи приблизно 0: просто додати до кожного зразка перед виведенням вибірки. Але я не бачу, як програмно генерувати зразки для поваги .μσ2

Моя програма буде звичайною мовою програмування; У мене немає доступу до жодних статистичних пакетів.


Чи має ваша мова генератор випадкових чисел? Це генератор тільки з рівномірного розподілу або він може генерувати і від звичайного розподілу?
ttnphns

@ttnphns: В основному кожна комп'ютерна мова оснащена генератором випадкових чисел. Вони є надзвичайно рівномірними генераторами на деякій кінцевій області.
Fixee

Відповіді:


33

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

σх+мк
мкσ2σмк

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

Редагувати: У світлі коментарів, деяких інших відповідей та того факту, що Fixee прийняв цю відповідь, я наведу ще детальну інформацію про те, як можна використовувати перетворення уніфікованих змінних для отримання нормальних змінних.

  • Один з методів, вже згадуваний у коментарі VitalStatistix , - це метод Бокса-Мюллера, який бере дві незалежні рівномірні випадкові величини та виробляє дві незалежні нормальні випадкові величини. Аналогічний метод, який дозволяє уникнути обчислення двох трансцендентальних функцій sin і cos за рахунок ще декількох симуляцій, був опублікований як відповідь francogrex .
  • Цілком загальний метод - це перетворення рівномірної випадкової величини функцією оберненого розподілу. Якщо рівномірно розподілено на то має стандартний нормальний розподіл. Хоча для немає явної аналітичної формули , вона може бути обчислена точними числовими наближеннями. Поточна реалізація в R (востаннє я перевірив) використовує цю ідею. Метод концептуально дуже простий, але вимагає точної реалізації , що, мабуть, не настільки поширене, як (інші) трансцендентні функції log , sin та cos .[ 0 , 1 ] Φ - 1 ( U ) Φ - 1 Φ - 1U[0,1]
    Φ-1(U)
    Φ-1Φ-1
  • У кількох відповідях згадується можливість використання центральної граничної теореми для апроксимації нормального розподілу як середнього рівня однорідних випадкових величин. Це, як правило, не рекомендується. Представлені аргументи, такі як відповідність середнього значення 0 та дисперсії 1, та міркування підтримки розподілу не є переконливими. У вправі 2.3 в "Введення методів Монте-Карло з R" Крістіаном П. Робертом та Джорджем Казеллою цей генератор називають застарілим, а наближення називається дуже поганим .
  • Існує дивовижна кількість інших ідей. Глава 3 і, зокрема, Розділ 3.4, у «Мистецтві комп’ютерного програмування», т. 2 Дональд Е. Кнут - класична довідка про генерацію випадкових чисел. Брайан Ріплі написав Комп'ютерне покоління випадкових змінних: Навчальний посібник , який може бути корисним. Книга, згадана Робертом і Казеллою, чи, можливо, Глава 2 в їхній іншій книзі «Статистичні методи Монте-Карло», також рекомендується.

Зрештою, правильно реалізований метод не кращий від рівномірного генератора псевдовипадкових чисел. Особисто я вважаю за краще покладатися на бібліотеки спеціального призначення, які я вважаю надійними. Я майже завжди покладаюся на методи, реалізовані в R, або безпосередньо в R, або через API в C / C ++. Очевидно, що це рішення не для всіх, але я недостатньо знайомий з іншими бібліотеками, щоб рекомендувати альтернативи.


(+1) Гарна відповідь та порада для ОП.
кардинал

18
Я не впевнений, чи роблю я тут непотрібний коментар, але, якщо у вас є лише доступ до уніфікованого генератора випадкових чисел, ви можете використовувати перетворення Box-Muller для створення незалежних N (0,1) випадкових чисел. У двох словах, якщо U_1 і U_2 є незалежними малюнками з розподілу Уніфікованої (0,1), тоді і
2log(U1)cos(2πU2)
розподіляються як незалежні N (0,1) випадкові величини. Основна ідея
2log(U1)sin(2πU2)
VitalStatistix

2
@Vital: Не зайвий коментар; хороший. Перетворення Box-Muller, мабуть, найпростіше програмувати з мінімальними шансами ненароком зробити щось погане. Це не найшвидший , але досить конкурентоспроможний. Однак, використання встановленої бібліотеки кодів, мабуть, безпечніше, тим більше, що місце, де найбільш ймовірно зробити помилку, полягає в тому, як генеруються рівномірні випадкові введення змінних !
кардинал

@Vital: Спасибі, саме це я шукав. Якщо ви хочете перетворити ваш коментар у відповідь, я б із задоволенням його схвалив.
Fixee

1
@VitalStatistix, це чудовий коментар, і, здається, саме це шукала ОП. Чому б не перетворити його на відповідь і, можливо, трохи розробити його на загальній ідеї використання перетворень уніфікованих випадкових змінних. Я вагався, роблячи це з тієї причини, яку Кардинал згадує здебільшого тому, що я не знаю, чи хороший генератор уніфікованої форми за будь-якою мовою.
NRH

10

Це дійсно коментар до відповіді Майкла Лева та коментаря Fixee, але він розміщений як відповідь, оскільки я не маю репутації на цьому сайті для коментарів.

[0,1]61

E[i=112Xi]=i=112E[Xi]=12×12=6
var[i=112Xi]=i=112var[Xi]=12×112=1.
i=112Xi610/12i=112Xi6[6,6]6

5

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

1. Утворіть u і v як два рівномірно розподілених випадкових числа в діапазоні від -1 до 1 на
u = 2 r1 - 1іv = 2 r2 - 1

2.розрахувати, w = u^2 + v^2якщо w> 1 - повернутися до 1

3. повернути u * z і y = v * z з z= sqrt(-2ln(w)/w) кодом зразка виглядатиме так:

u = 2 * random() - 1;
v = 2 * random() - 1;
w = pow(u, 2) + pow(v, 2);
if (w < 1) {
    z = sqrt((-2 * log(w)) / w);
    x = u * z;
    y = v * z;
    }

то використовуйте те, що MHR запропонував вище, щоб отримати випадкові відхилення N(mu, sigma^2).


Коли я опублікував свою відповідь вище, я не помітив, що @vitalStatistix дав вам алгоритм трансформації Box-Muller. Та, яку я даю вище, також є такою ж хорошою, як я думаю.
франкогрекс

2
Не могли б ви пояснити причину генерування нормальних змінних за допомогою рівномірного розподілу (крім алгоритмічної точки зору), а не просто використання pdf розподілу Гаусса / Нормального безпосередньо? Або це зовсім неправильно?
Арун

4
@Arun Одна з причин: полярний метод Марсаглії корисний, коли у вас є лише RNG, який генерує рівномірні відхилення.
chl

1
@Arun це найпростіший спосіб. Ви також можете генерувати з pdf безпосередньо, використовуючи, наприклад, метод "відхилення прийняття". Я розмістив для вас простий приклад на своєму сайті (тому що тут недостатньо місця у полі для коментарів).
франкогрекс

4

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

Скажіть, що ваші рівномірні випадкові величини рівномірно розподілені між 0 і 1. Сума тоді буде від 0 до 10. Відніміть 5 від суми, а середнє отримане розподіл буде дорівнює 0. Тепер результат ділите на стандартне відхилення (близьке) нормальне розподіл і помножте результат на потрібне стандартне відхилення. На жаль, я не впевнений, що таке стандартне відхилення суми десяти рівномірних випадкових випадків, але якщо нам пощастить, хтось скаже нам у коментарі!

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


Тут ви використовуєте центральний граничний Thm (що купа випадкових змінних iid дорівнює звичайній випадковій змінній). Я не вважав це, тому що думав, що це буде занадто повільно, але ви кажете, що 10 достатньо ?! Це краще, ніж обчислення журналу та sin / cos та sqrt!
Fixee

Також середнє значення рівномірного rv на [0,1] дорівнює 0,5 з відхиленням 1/12. Якщо підсумовувати 10 з них, ви отримуєте середнє значення 5 та дисперсію 10/12 = 5/6.
Fixee

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

1
журналгріхcos

1
@Michael: Заявляючи це дає «право» розподіл є трохи розтягнути, в зокрема , так як розподіл аппроксимирующего має компактний носій і, в багатьох випадках, один робить турботу про те , наскільки ефективно це змінних може бути отримано. :) Справа в тому, що є кілька набагато кращих варіантів. Але я все ж думаю, що це дає щось корисне педагогічно.
кардинал
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.