BUGS / JAGS / STANでプロポーションをモデリングするにはどうすればよいですか?


10

私は、応答が比例であるモデルを構築しようとしています(これは、実際に党が選挙区で獲得する投票のシェアです)。その分布は正規ではないため、ベータ分布でモデル化することにしました。私はいくつかの予測因子も持っています。

しかし、私はそれをBUGS / JAGS / STANで書く方法がわかりません(JAGSが私の最良の選択でしょうが、それは本当に重要ではありません)。私の問題は、予測子によってパラメーターの合計を作成することですが、それを使って何ができるでしょうか

コードは(JAG構文では)このようなものにy_hatなりyますが、およびパラメーターを「リンク」する方法がわかりません。

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

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

y_hatは、パラメーターと予測子のクロス積であり、したがって決定論的な関係です。aそしてb、私xが予測しようとする係数であり、予測子です)。

あなたの提案をありがとう!


a、b、y_hatとは何ですか?モデルを明確に定義する必要があります。ちなみに、バグの構文は数学の構文に近いです。したがって、数学言語でモデルを作成する方法を知っている場合、ほとんどすべての作業が完了します。
ステファン・ローラン

ステファン、ありがとう。質問を編集して、a、b、y_hatを定義しました。私はそう答えは確かに;-)はるかに簡単になり、どちらか数学的に答えを知らない
ジョエル

E(y)= alpha /(alpha + beta)という事実に基づいて構築できるのではないかと思いますが、その正確さを理解することはできません。
ジョエル

回答:


19

ベータ回帰アプローチは、および観点からパラメーターを再設定することです。ここで、は予測したy_hatと同等です。このパラメーター化では、とます。次に、を線形結合のロジットとしてモデル化できます。 は独自の事前分布(0より大きい必要があります)、または共変量でモデル化できます(指数関数など、リンク関数を選択して0より大きい値を維持します)。φ μ α = μ × φ β = 1 - μ × φ μ φμϕμα=μ×ϕβ=(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)

ありがとう、これはとても役に立ちます!モデルをあなたのアドバイスに合わせようとしています。
ジョエル

しかし、モデルを実行すると、「ノードy [6283]の親値が無効です」というエラーが発生します。ここで何が起こっているのでしょうか?
ジョエル

@ジョエル、y [6283]の値は?アルファとベータの値が正当な値に制限されていることを確認しましたか?何かが0以下になった可能性があり、エラーが発生することを期待しています。
グレッグスノー

いいえ、確認しました。すべてのy値が0よりも厳密に優れています(1よりも劣っています)。たぶん、私の事前分布は、ある時点で経験的なy値と衝突しますか?しかし、これを確認する方法がわからないので、私の事前知識は賢明なようです-少なくとも私には!
ジョエル

1
@colin、私はJAGSをよく知らないので、これはJAGS専用のフォーラムで質問される方がいいかもしれません。または、別のツールで試してみてください。最近ベイズのスタンが好きだと思います。
Greg Snow

18

グレッグ・スノーは素晴らしい答えを出しました。完全を期すために、これはStan構文の同等のものです。Stanには使用できるベータ分布がありますが、定数log(y)log(1-y)は最初に(y ~ beta(alpha,beta)呼び出されるたびにではなく)一度計算できるため、ベータ密度の対数を自分で計算する方が高速です。予約lp__変数をインクリメントすることにより(以下を参照)、サンプルの観測値に対するベータ密度の対数を合計できます。線形予測子のパラメーターベクトルにラベル「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
}

ベン、ありがとう!Stan構文も非常に便利です。
ジョエル

Stan v2には「beta_proportion」のサンプリングステートメントがあり、「lp__」を直接操作する必要がなくなると思います
THK
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.