Взважена узагальнена регресія в BUGS, JAGS


10

В Rми можемо «до» ваги в glmрегресії через вагу параметр. Наприклад:

glm.D93 <- glm(counts ~ outcome + treatment, family = poisson(), weights=w)

Як це можна досягти в JAGSабоBUGS моделі моделі?

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


+1 дуже гарне запитання! Я запитував це у деяких фахівців-байесів, і вони говорять лише про те, що в деяких випадках (ваги відповідно до категорійного коваріату) ви можете обчислити задній розподіл параметрів (-ів) для кожної категорії, а потім об'єднати їх у середньозваженому значенні. Вони не давали мені загального рішення, тому мені було б дуже цікаво, існує воно чи ні!
Цікаво

Відповіді:


7

Може пізно ... але,

Зверніть увагу на 2 речі:

  • Додавання точок даних не рекомендується, оскільки це змінить ступінь свободи. Середні оцінки фіксованого ефекту можна добре оцінити, але слід уникати всіх висновків при таких моделях. Важко "нехай дані говорять", якщо ви їх зміните.
  • Звичайно, він працює лише з цілочисловими вагами (не можна дублювати 0,5 точок даних), що не є тим, що робиться в найбільш зваженій (lm) регресії. Загалом, зважування створюється на основі локальної мінливості, оціненої з реплік (наприклад, 1 / s або 1 / s ^ 2 у заданому "x") або на основі висоти відгуку (наприклад, 1 / Y або 1 / Y ^ 2, при заданий 'x').

У Jags, Bugs, Stan, proc MCMC, або в Bayesian взагалі, ймовірність не відрізняється, ніж у частолістських lm або glm (або будь-якої моделі), вона точно така ж !! Просто створіть для своєї відповіді новий стовпець "вага" і напишіть ймовірність як

y [i] ~ dnorm (mu [i], tau / вага [i])

Або зважений отрута:

y [i] ~ dpois (лямбда [i] * вага [i])

Цей код Bugs / Jags просто підводить. У вас все вийде правильно. Не забувайте продовжувати множення задньої частини тау на вагу, наприклад, коли робите прогнози та довіру / прогнозування інтервалів.


Якщо ми робимо це так, як заявлено, ми змінюємо середнє значення та дисперсію. Чому це не y [i] * вага [i] ~ dpois (лямбда [i] * вага [i])? Це може регулювати лише дисперсію. Проблема тут полягає в тому, що y [i] * weight [i] може бути реального типу.
користувач28937

Дійсно, зважена регресія означає зміну (адже зважування призводить регресію до наближення до точок, у яких багато ваг!), а дисперсія тепер є функцією ваг (отже, це не гомоскдастична модель). Варіантність (або точність) tau вже не має значення, але tau / вага [i] можна трактувати точно як точність моделі (для заданого "x"). Я б не радив помножувати дані (у) на ваги ... очікуйте, якщо це саме те, що ви хочете зробити, але я не розумію, що ви в цьому випадку модель ...
П'єр Лебрун

Я погоджуюсь з вами, це не змінює середнього значення в звичайному прикладі: y [i] ~ dnorm (mu [i], tau / вага [i]), але це робить у другому, оскільки лямбда [i] * вага [ i] стає "новою" лямбда для dpois, і це вже не збігається з y [i]. Я повинен виправити себе, це має бути: ty [i] * exp (weight [i]) ~ dpois (lambda [i] * weight [i]). Ідея множення у випадку Пуассона полягає в тому, що ми хочемо відрегулювати дисперсію, а також скорегувати середнє, тож чи не потрібно нам виправляти середнє?
користувач28937

Якщо вам потрібно відрегулювати дисперсію самостійно, можливо, замість Пуассона може стати в нагоді негативна біноміальна модель? Це додає параметр інфляції / дефляції дисперсії до Пуассона. За винятком того, що він дуже схожий.
П’єр Лебрун

П’єр гарна ідея. Думав також про безперервне подання розподілу пуассона,
user28937

4

По-перше, варто зазначити, що glmне виконує байєсівську регресію. Параметр "ваги" - це, в основному, коротка рука для "пропорції спостережень", яку можна замінити належним чином вибіркою вашого набору даних. Наприклад:

x=1:10
y=jitter(10*x)
w=sample(x,10)

augmented.x=NULL
augmented.y=NULL    
for(i in 1:length(x)){
    augmented.x=c(augmented.x, rep(x[i],w[i]))
    augmented.y=c(augmented.y, rep(y[i],w[i]))
}

# These are both basically the same thing
m.1=lm(y~x, weights=w)
m.2=lm(augmented.y~augmented.x)

Отже, щоб надати вагу балам у JAGS або BUGS, ви можете збільшити свій набір даних аналогічним чином, як вище.


2
це не спрацює, ваги - це звичайно реальні цифри, а не цілі числа
цікаво

Це не заважає вам наближати їх до цілих чисел. Моє рішення не ідеальне, але воно працює приблизно. Наприклад, враховуючи ваги (1/3, 2/3, 1), ви можете збільшити вибірку другого класу на коефіцієнт два, а третій - на три.
Девід Маркс

0

Спробував додати коментар вище, але мій реп.

Повинен

y[i] ~ dnorm(mu[i], tau / weight[i])

не бути

y[i] ~ dnorm(mu[i], tau * weight[i])

в JAGS? Я провожу кілька тестів, порівнюючи результати цього методу в JAGS з результатами зваженої регресії через lm () і можу знайти відповідність лише за допомогою останнього. Ось простий приклад:

aggregated <- 
  data.frame(x=1:5) %>%
  mutate( y = round(2 * x + 2 + rnorm(length(x)) ),
          freq = as.numeric(table(sample(1:5, 100, 
                 replace=TRUE, prob=c(.3, .4, .5, .4, .3)))))
x <- aggregated$x
y <- aggregated$y
weight <- aggregated$freq
N <- length(y)

# via lm()
lm(y ~ x, data = aggregated, weight = freq)

і порівняти

lin_wt_mod <- function() {

  for (i in 1:N) {
    y[i] ~ dnorm(mu[i], tau*weight[i])
    mu[i] <- beta[1] + beta[2] * x[i]
  }

  for(j in 1:2){
    beta[j] ~ dnorm(0,0.0001)
  }

  tau   ~ dgamma(0.001, 0.001)
  sigma     <- 1/sqrt(tau)
}

dat <- list("N","x","y","weight")
params <- c("beta","tau","sigma")

library(R2jags)
fit_wt_lm1 <- jags.parallel(data = dat, parameters.to.save = params,
              model.file = lin_wt_mod, n.iter = 3000, n.burnin = 1000)
fit_wt_lm1$BUGSoutput$summary

Незалежно від репутації коментарі не повинні даватися як відповіді.
Майкл Р. Черник
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.