BUGS / JAGS / STAN ile bir oranı nasıl modelleyebilirim?


10

Yanıtın bir oran olduğu bir model oluşturmaya çalışıyorum (aslında bir partinin seçim bölgelerinde aldığı oyların payıdır). Dağıtımı normal değil, bu yüzden bir beta dağıtımı ile modellemeye karar verdim. Ayrıca birkaç tahmin edicim var.

Ancak, HATA / JAGS / STAN'da nasıl yazacağımı bilmiyorum (JAGS benim en iyi seçimim olurdu, ama gerçekten önemli değil). Benim sorunum tahmin ediciler tarafından parametrelerin toplamı yapmak, ama sonra onunla ne yapabilirim?

Kod (JAGS sözdiziminde) böyle bir şey olurdu, ama y_hatve yparametreleri "bağlamak" bilmiyorum .

for (i in 1:n) {
 y[i] ~ dbeta(alpha, beta)

 y_hat[i] <- a + b * x[i]
}

( y_hatParametreler ve prediktörler sadece çapraz ürün, dolayısıyla deterministik ilişkidir. aVe bbir tahmin etmeye katsayısının, xbir göstergesi olarak).

Önerileriniz için teşekkürler!


A, b, y_hat nedir? Modelinizi açıkça tanımlamanız gerekir. Bu arada, BUGS sözdizimi matematiksel sözdizimine yakındır. Böylece modelinizi matematiksel dilde nasıl yazacağınızı biliyorsanız, hemen hemen tüm işler yapılır.
Stéphane Laurent

Stéphane, teşekkürler. A, b, y_hat tanımlamak için soruyu düzenledim. Cevabı matematiksel olarak da bilmiyorum, aksi takdirde cevap gerçekten daha kolay olurdu ;-)
Joël

E (y) = alfa / (alfa + beta) gerçeği üzerine inşa edebileceğimden şüpheleniyorum, ama tam olarak nasıl olduğunu tam olarak anlayamıyorum.
Joël

Yanıtlar:


19

Beta regresyon yaklaşımı ve ϕ açısından yeniden parametrelendirmektir . Nerede μ eşit olacaktır ne yapacağı tahmin olduğunu y_hat için. Bu parametrelendirmede α = μ × ϕ ve β = ( 1 - μ ) × ϕ olacaktır . O zaman μ modelini doğrusal kombinasyonun logit'i olarak modelleyebilirsiniz . ϕ ya kendi öncekine sahip olabilir (0'dan büyük olmalıdır) ya da ortak değişkenler üzerinde modellenebilir (üstel gibi 0'dan büyük tutmak için bir bağlantı fonksiyonu seçin).μφμα=μxφβ=(1-μ)xφμφ

Muhtemelen şöyle bir şey:

for(i in 1:n) {
  y[i] ~ dbeta(alpha[i], beta[i])
  alpha[i] <- mu[i] * phi
  beta[i]  <- (1-mu[i]) * phi
  logit(mu[i]) <- a + b*x[i]
}
phi ~ dgamma(.1,.1)
a ~ dnorm(0,.001)
b ~ dnorm(0,.001)

Teşekkür ederim, bu çok faydalı! Senin tavsiyen bir model koymaya çalışıyorum.
Joël

Ancak, modeli çalıştırdığımda, aşağıdaki gibi hatalar alıyorum: "Düğüm y hatası [6283] Geçersiz üst değerler". Burada neler olduğuna dair bir fikrin var mı?
Joël

@ Joël, y'nin değeri nedir [6283]? alfa ve betaların değerlerinin yasal değerlerle kısıtlandığından emin misiniz? Ben bir şey 0 ya da altına gitmiş olabilir ve bu hata verir bekliyoruz.
Greg Snow

Hayır, tüm y değerlerimin kesinlikle 0'dan (ve 1'den daha düşük) üstün olduğunu kontrol ettim. Belki benim önceliklerim bir noktada ampirik y değerleri ile çatışıyor? Ama bunu nasıl kontrol edeceğimi bilmiyorum ve önceliklerim mantıklı görünüyor - en azından benim için!
Joël

1
@colin, JAGS'ı çok iyi bilmiyorum, bu yüzden bu özellikle JAGS için bir forumda daha iyi sorulabilir. Ya da farklı bir araçta deneyin, bu gün Bayes için Stan'i sevdiğimi fark ettim.
Greg Snow

18

Greg Snow harika bir cevap verdi. Bütünlük için, Stan sözdizimindeki karşılığıdır. Stan'in kullanabileceğiniz bir beta dağılımı olmasına rağmen, beta yoğunluğunun logaritmasını kendiniz hesaplamak daha hızlıdır çünkü sabitler log(y)ve log(1-y)başlangıçta bir kez hesaplanabilir ( y ~ beta(alpha,beta)çağrılacak her zaman yerine ). Ayrılmış lp__değişkeni artırarak (aşağıya bakın), beta yoğunluğunun logaritmasını numunenizdeki gözlemler üzerinden toplayabilirsiniz. Doğrusal yordayıcıda parametre vektörü için "gamma" etiketini kullanıyorum.

data {
  int<lower=1> N;
  int<lower=1> K;
  real<lower=0,upper=1> y[N];
  matrix[N,K] X;
}
transformed data {
  real log_y[N];
  real log_1my[N];
  for (i in 1:N) {
    log_y[i] <- log(y[i]);
    log_1my[i] <- log1m(y[i]);
  }
}
parameters {
  vector[K] gamma;
  real<lower=0> phi;
}
model {
  vector[N] Xgamma;
  real mu;
  real alpha_m1;
  real beta_m1;
  Xgamma <- X * gamma;
  for (i in 1:N) {
    mu <- inv_logit(Xgamma[i]);
    alpha_m1 <- mu * phi - 1.0;
    beta_m1 <- (1.0 - mu) * phi - 1.0;
    lp__ <- lp__ - lbeta(alpha,beta) + alpha_m1 * log_y[i] + 
                                        beta_m1 * log_1my[i];
  }
  // optional priors on gamma and phi here
}

Teşekkürler Ben! Stan sözdizimine de sahip olmak çok yararlı.
Joël

Stan v2, "lp__" yi doğrudan manipüle etme ihtiyacını ortadan kaldırdığına inandığım bir "beta_proportion" örnekleme ifadesine sahiptir
THK
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.