如何使用 BUGS/JAGS/STAN 建模比例?

机器算法验证 贝叶斯 锯齿 错误 贝塔回归 斯坦
2022-01-26 15:48:39

我正在尝试建立一个模型,其中响应是一个比例(它实际上是一个政党在选区中获得的选票份额)。它的分布不正常,所以我决定用 beta 分布对其进行建模。我也有几个预测因素。

但是,我不知道如何在 BUGS/JAGS/STAN 中编写它(JAGS 是我最好的选择,但这并不重要)。我的问题是我通过预测变量对参数进行了总和,但是我能用它做什么呢?

代码将是这样的(在 JAGS 语法中),但我不知道如何“链接” y_hatandy参数。

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

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

y_hat只是参数和预测变量的叉积,因此是确定性关系。a并且b是我试图估计的系数,x作为预测变量)。

感谢您的建议!

2个回答

beta 回归方法是根据重新参数化。其中将等同于您预测的 y_hat。在此参数化中,您将有然后您可以将建模为线性组合的 logit。 可以有自己的先验(必须大于 0),也可以在协变量上建模(选择一个链接函数以使其大于 0,例如指数)。μϕμα=μ×ϕβ=(1μ)×ϕμϕ

可能是这样的:

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)

格雷格·斯诺给出了一个很好的答案。为了完整起见,这里是 Stan 语法中的等价物。log(y)尽管 Stan 有一个您可以使用的 beta 分布,但您自己计算出 beta 密度的对数会更快,因为这些常数log(1-y)可以在一开始就计算一次(而不是每次y ~ beta(alpha,beta)都被调用)。通过增加保留lp__变量(见下文),您可以对样本中的观测值求和 beta 密度的对数。我对线性预测器中的参数向量使用标签“gamma”。

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
}