Ще одна грізна проблема в статистиці. Питання давнє, але вступні приклади в режимі он-лайн важко знайти. Тож дозвольте мені спростити два чудові приклади на випадок, якщо хтось слідкує за Марковим випадковим прогулянком по землях PageRank сюди, збентежених MCMC, і сповнений очікування для легкої відповіді. Наскільки ймовірно? Це може бути подальшим питанням.
FIRST EXAMPLE:
N(0,1)
Складність полягає в тому, що в реалізації після проходження всіх механічних кроків, є тільки один магічний трюк: бінарне рішення приймати чи відкидати на запропоноване значення .
xmean
0sd
1rnorm(10000)
eps
ϵxixi+1runif(1, - eps, eps)
xi
Кожне запропоноване значення таким чином відрізнятиметься від попереднього значення випадковим чином і в межах [- eps,+ eps]
.
Введіть ядро Маркова . Нам потрібно якось оцінити ймовірність переходу до нового запропонованого значення, як у матриці Маркова з переходом на заданий часi розповідає про ймовірність появи нового стану на час i + 1. Якщо ви сумніваєтесь, заходьте сюди або запитайте бабусю, яка звернула увагу на всі "Як би ви пояснили квантову фізику своїй няні?" тип питань (чи не виглядають матриці приємно? ;-)).
Щоб отримати таку ймовірність прийняття в букет зібраних значень, ми просто порівнюємо висоту N( 0 , 1 )щільність при запропонованому новому значенні (хi + 1) до попереднього (вже прийняте значення), (хi), саме так:
І ми беремо співвідношення обох значень: min(1, dnorm(candidate_value)/dnorm(x))
. Оскільки ми хочемо ймовірності, результат, що обчислюється, не може переходити1, що відбувається щоразу, коли N( 0 , 1 ) р. дf у хi + 1 (значення кандидата) більше, ніж на хi, що становить автоматичне прийняття запропонованого значення та пояснення min(1, ...)
частини коду. В іншому випадку, чим ближче dnorm
значення запропонованого значення до попереднього значення , тим вище шанси його прийняти.
Тож у нас є ймовірність прийняття, але нам потрібно прийняти бінарне рішення (прийняти нове запропоноване значення або відхилити його). І ось тут виникає магічний трюк: якщо ймовірність, обчислена як min(1, dnorm(candidate_value)/dnorm(x))
більша, ніж runif(1)
рівномірний розіграш0 до 1(якнайшвидше, як це дістанеться до кидання монети за безперервне значення), ми приймаємо та заповнюємо x[i+1]
запис ланцюжка запропонованою вартістю ; в іншому випадку ми заповнюємо це повтором попереднього значення , x[i]
... Ідея була б, краще дві однакові, ніж одна занадто далеко в хвости.
Ми робимо це тисячі разів і збираємо всі ці значення (тільки прийняті та повторювані значення), і коли будуємо гістограму, ми отримуємо хорошу нормальну криву з sd
близькою до1і зосереджена на 0.
Лише один заключний момент: з чого ми починаємо? Напевно, не має значення, але в моделюванні ми заповнюємо перше значення як0, x = 0; vec[1] = x
перш ніж проглядати всі решта ітерацій, і нехай процес піде за своїм ходом.
SECOND EXAMPLE:
Це більш захоплююче і посилається на оцінку параметрів кривої лінійної регресії шляхом обчислення ймовірності журналу для випадкових параметрів, заданих набором даних . Однак екзегезія рядків коду будується в збереженому тут конденсованому моделюванні , дотримуючись дуже схожих кроків з першим прикладом.