HATA, JAGS'da ağırlıklı genel regresyon


10

Burada , ağırlık parametresi aracılığıyla Rbir glmgerilemeyi "önceden ağırlıklandırabiliriz" . Örneğin:

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

Bu bir JAGSveya BUGSmodelde nasıl yapılabilir ?

Bunu tartışan bazı makaleler buldum, ancak hiçbiri bir örnek vermiyor. Esas olarak Poisson ve lojistik regresyon örnekleriyle ilgileniyorum.


+1 çok iyi bir soru! Bunu bazı bayes uzmanlarına soruyordum ve sadece bazı durumlarda (kategorik değişkene göre ağırlıklar), her kategori için parametre (ler) in posterior dağılımını hesaplayabileceğinizi ve daha sonra bunları ağırlıklı bir ortalamada birleştirebileceğinizi söylüyorlar. Yine de bana genel bir çözüm vermediler, bu yüzden var olup olmadıklarını gerçekten merak ediyorum!
Meraklı

Yanıtlar:


7

Geç olabilir ... ama,

Lütfen 2 şeyi not edin:

  • Serbestlik derecelerini değiştireceği için veri noktalarının eklenmesi önerilmez. Sabit etki için ortalama tahminler iyi tahmin edilebilir, ancak bu modellerle tüm çıkarımlardan kaçınılmalıdır. Eğer değiştirirseniz "verilerin konuşmasına izin vermek" zordur.
  • Tabii ki sadece tamsayı değerli ağırlıklar (0.5 veri noktasını çoğaltamazsınız) ile çalışır, bu en ağırlıklı (lm) regresyonda yapılan şey değildir. Genel olarak, kopyalardan tahmin edilen yerel değişkenliğe (örneğin, belirli bir 'x' de 1 / s veya 1 / s ^ 2) veya yanıt yüksekliğine (örn. 1 / Y veya 1 / Y ^ 2, verilen bir 'x').

Jags, Bugs, Stan, proc MCMC veya genel olarak Bayesian'ta, sıklık lm veya glm'den (veya herhangi bir modelden) olasılık farklı değildir! Yanıtınız için yeni bir "ağırlık" sütunu oluşturun ve olasılığı şöyle yazın:

y [i] ~ norm (mu [i], tau / ağırlık [i])

Veya ağırlıklı bir poisson:

y [i] dpois (lambda [i] * ağırlık [i])

Bu Bugs / Jags kodu sadece hile için. Her şeyi doğru alacaksın. Tau posteriorunu ağırlıkla çarpmaya devam etmeyi unutmayın, örneğin tahmin ve güven / tahmin aralıkları yaparken.


Belirtildiği gibi yaparsak, ortalamayı ve varyansı değiştiririz. Neden y [i] * ağırlık [i] dpois (lambda [i] * ağırlık [i]) değil? Bu sadece varyansı ayarlayacaktır. Buradaki sorun, y [i] * ağırlık [i] türünün gerçek olabileceğidir.
user28937

Gerçekten de, ağırlıklı regresyon ortalama değiştirir (çünkü tartım, regresyonun çok fazla ağırlığa sahip noktalara yaklaşmasına neden olur!) ve varyans şimdi ağırlıkların bir fonksiyonudur (bu nedenle homoskedastik bir model değildir). Varyans (veya hassasiyet) tau'nun artık bir anlamı yoktur, ancak tau / ağırlık [i] tam olarak modelin hassasiyeti olarak yorumlanabilir (belirli bir "x" için). Verilerin (y) ağırlıklar ile çarpılmasını tavsiye etmem ... bunun tam olarak yapmak istediğiniz bir şey olup olmadığını bekleyin, ancak bu durumda modelinizi anlamıyorum ...
Pierre Lebrun

Seninle aynı fikirdeyim normal örnekte ortalamayı değiştirmez: y [i] ~ dnorm (mu [i], tau / ağırlık [i]), ama ikincisinde, lambda [i] * ağırlık [ i] dpois için "yeni" lambda olur ve bu artık y [i] ile eşleşmeyecektir. Kendimi düzeltmem gerekiyor: ty [i] * exp (ağırlık [i]) ~ dpois (lambda [i] * ağırlık [i]). Poisson davasında çarpma fikri, varyansı ayarlamak, aynı zamanda ortalamayı da ayarlamak istiyoruz, bu yüzden ortalamayı düzeltmemize gerek yok mu?
user28937

Varyansı bağımsız olarak ayarlamanız gerekiyorsa, bir Negatif Binom modeli Poisson yerine işe yarayabilir mi? Poisson'a bir varyans enflasyon / deflasyon parametresi ekler. Dışında çok benzer.
Pierre Lebrun

Pierre iyi fikir. Ayrıca linkd'de
user28937 30:30

4

İlk olarak, glmbayes gerilemesi yapmadığını belirtmek gerekir. 'Ağırlıklar' parametresi temel olarak "gözlemlerin oranı" için kısa bir eldir ve veri kümenizi uygun şekilde örneklemeyle değiştirebilir. Örneğin:

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)

Bu nedenle, JAGS veya HATA'daki noktalara ağırlık eklemek için veri kümenizi yukarıdaki gibi aynı şekilde artırabilirsiniz.


2
Bu işe yaramaz, ağırlıklar genellikle tamsayı değil, gerçek sayılardır
Meraklı

Bu, onları tamsayılarla yaklaştırmanızı engellemez. Çözümüm mükemmel değil, ama yaklaşık olarak çalışıyor. Örneğin, ağırlıklar göz önüne alındığında (1/3, 2/3, 1), ikinci sınıfı iki katına ve üçüncü sınıfı üç katına kadar örnekleyebilirsiniz.
David Marx

0

Yukarıdaki yoruma yorum eklemeyi denedim, ancak temsilcim çok düşük.

Meli

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

olmamak

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

JAGS? JAGS bu yöntem sonuçları lm () üzerinden ağırlıklı bir regresyon sonuçları karşılaştırarak bazı testler çalışıyorum ve sadece ikincisi kullanarak uygun bulabilirsiniz. İşte basit bir örnek:

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)

ve karşılaştır

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

İtibardan bağımsız olarak yorumlar cevap olarak verilmemelidir.
Michael R.Chickick
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.