Làm cách nào tôi có thể mô hình hóa tỷ lệ với BUGS / JAGS / STAN?


10

Tôi đang cố gắng xây dựng một mô hình trong đó phản hồi là một tỷ lệ (thực ra đó là tỷ lệ phiếu bầu mà một đảng nhận được trong các khu vực bầu cử). Phân phối của nó không bình thường, vì vậy tôi quyết định mô hình hóa nó với phân phối beta. Tôi cũng có một vài dự đoán.

Tuy nhiên, tôi không biết cách viết nó bằng BUGS / JAGS / STAN (JAGS sẽ là lựa chọn tốt nhất của tôi, nhưng nó không thực sự quan trọng). Vấn đề của tôi là tôi tạo ra một tổng các tham số bằng các yếu tố dự đoán, nhưng sau đó tôi có thể làm gì với nó?

Mã sẽ giống như thế này (theo cú pháp JAGS), nhưng tôi không biết cách "liên kết" các tham số y_haty.

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

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

( y_hatchỉ là sản phẩm chéo của các tham số và yếu tố dự đoán, do đó có mối quan hệ xác định. ablà các hệ số mà tôi cố gắng ước tính, xlà một yếu tố dự báo).

Cảm ơn lời đề nghị của bạn!


A, b, y_ là gì? Bạn nên xác định rõ mô hình của bạn. Nhân tiện, cú pháp BUGS gần với cú pháp toán học. Do đó, nếu bạn biết cách viết mô hình của mình bằng ngôn ngữ toán học thì hầu như tất cả các công việc đều được thực hiện.
Stéphane Laurent

Stéphane, cảm ơn. Tôi đã chỉnh sửa câu hỏi để xác định a, b, y_hat. Tôi cũng không biết câu trả lời về mặt toán học, nếu không thì câu trả lời thực sự sẽ dễ dàng hơn nhiều ;-)
Joël

Tôi nghi ngờ rằng tôi có thể dựa trên thực tế rằng E (y) = alpha / (alpha + beta), nhưng tôi thực sự không thể tìm ra chính xác như thế nào.
Joël

Câu trả lời:


19

Phương pháp hồi quy beta là xác định lại thông số theo và . Trong đó sẽ tương đương với y_hat mà bạn dự đoán. Trong tham số hóa này, bạn sẽ có và . Sau đó, bạn có thể mô hình hóa làm logit của tổ hợp tuyến tính. có thể có trước của chính nó (phải lớn hơn 0) hoặc cũng có thể được mô hình hóa trên các đồng biến (chọn một hàm liên kết để giữ cho nó lớn hơn 0, chẳng hạn như hàm mũ).μϕμα=μ×ϕβ=(1μ)×ϕμϕ

Có thể một cái gì đó như:

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)

Cảm ơn bạn, điều này rất hữu ích! Tôi đang cố gắng để phù hợp với một mô hình với lời khuyên của bạn.
Joël

Tuy nhiên, khi tôi chạy mô hình, tôi gặp các lỗi như: "Lỗi trong nút y [6283] Giá trị cha không hợp lệ". Bất cứ ý tưởng những gì đang xảy ra ở đây?
Joël

@ Joël, giá trị của y [6283] là gì? Bạn có chắc chắn rằng các giá trị của bảng chữ cái và betas được giới hạn trong các giá trị pháp lý? Tôi hy vọng rằng một cái gì đó có thể đã về 0 hoặc thấp hơn và điều đó gây ra lỗi.
Greg Snow

Không, tôi đã kiểm tra rằng, tất cả các giá trị y của tôi hoàn toàn vượt trội so với 0 (và kém hơn 1). Có thể các linh mục của tôi đụng độ với các giá trị y theo kinh nghiệm tại một số điểm? Nhưng tôi không biết làm thế nào để kiểm tra điều này, và các linh mục của tôi có vẻ hợp lý - ít nhất là với tôi!
Joël

1
@colin, tôi không biết rõ về JAGS, vì vậy điều này có thể được hỏi tốt hơn trên một diễn đàn dành riêng cho JAGS. Hoặc thử nó trong một công cụ khác, tôi thấy rằng tôi thích Stan cho Bayes những ngày này.
Greg Snow

18

Greg Snow đã đưa ra một câu trả lời tuyệt vời. Để đầy đủ, đây là tương đương trong cú pháp Stan. Mặc dù Stan có bản phân phối beta mà bạn có thể sử dụng, nhưng việc xử lý logarit của mật độ beta sẽ nhanh hơn vì các hằng số log(y)log(1-y)có thể được tính một lần ngay từ đầu (thay vì mỗi lần y ~ beta(alpha,beta)sẽ được gọi). Bằng cách tăng lp__biến dự trữ (xem bên dưới), bạn có thể tính tổng logarit của mật độ beta so với các quan sát trong mẫu của bạn. Tôi sử dụng nhãn "gamma" cho vectơ tham số trong bộ dự báo tuyến tính.

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
}

Cảm ơn Ben! Rất hữu ích để có cú pháp Stan là tốt.
Joël

Stan v2 có một tuyên bố lấy mẫu "beta_proportion" mà tôi tin rằng không cần phải thao túng trực tiếp "lp__"
THK
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.