2

一部のコードを JAGS から Stan に移行しようとしています。次のデータセットがあるとします。

N <- 10 
nchoices <- 3
ncontrols <- 3
toydata <- list("y" = rbinom(N, nchoices - 1, .5), 
                "controls" = matrix(runif(N*ncontrols), N, ncontrols), 
                "N" = N, 
                "nchoices" = nchoices,
                "ncontrols" = ncontrols)

そして、次のコードで多項ロジットを実行したい (ドキュメントのセクション 9.5 から取得):

data {
  int N;
  int nchoices;
  int y[N];
  int ncontrols;
  vector[ncontrols] controls[N];
}

parameters {
  matrix[nchoices, ncontrols] beta;
}

model {
  for (k in 1:nchoices)
    for (d in 1:ncontrols)
      beta[k,d] ~ normal(0,100);
  for (n in 1:N)
    y[n] ~ categorical(softmax(beta * controls[n]));
}

betaの最初の行をゼロに修正したいと思います。JAGS では、モデル ブロックで次のように宣言するだけです。

for (i in 1:ncontrols) {
   beta[1,i] <- 0 
}

しかし、スタンでこれを行う方法がわかりません。たとえば、ドキュメントのセクション 6.2 (部分的に既知のパラメーター) の行に沿って多くの組み合わせを試しました。

parameters {
  matrix[nchoices, ncontrols] betaNonObs;
}

transformed parameters {
  matrix[nchoices, ncontrols] beta;
  for (i in 1:ncontrols) beta[1][i] <- 0
  for (k in 2:nchoices) beta[k] <- betaNonObs[k - 1]
}

しかし、どれも機能しません。助言がありますか?

4

1 に答える 1

4

エラーメッセージを記載していただけると助かります。この場合、 beta が行列として宣言されている場合、必要な構文は R に似た構文です。

beta[1,i] <- 0.0; // you also omitted the semicolon 

より広範な質問に答えるために、最後のアプローチで正しい方向に進んでいたと思います。free_beta と呼ばれるパラメーター ブロックでパラメーターの行列を作成し、これらの要素を、固定ゼロの上部に 1 行余分にある beta と呼ばれるモデル ブロックで宣言された別の行列にコピーします。お気に入り

data {
  int N;
  int nchoices;
  int y[N];
  int ncontrols;
  vector[ncontrols] controls[N];
}

parameters {
  matrix[nchoices-1, ncontrols] free_beta;
}

model {
  // copy free beta into beta
  matrix[nchoices,ncontrols] beta;
  for (d in 1:ncontrols)
    beta[1,d] <- 0.0;
  for (k in 2:nchoices)
    for (d in 1:ncontrols)
      beta[k,d] <- free_beta[k-1,d];

  // priors on free_beta, which execute faster this way
  for (k in 1:(nchoices-1))
    row(free_beta,k) ~ normal(0.0, 100.0);

  // likelihood
  for (n in 1:N)
    y[n] ~ categorical(softmax(beta * controls[n]));
}
于 2012-10-21T11:30:46.860 に答える