Пробит регрессии с увеличением данных в стан

Я пытаюсь сделать пробную модель с дополнением данных с использованием stan. Вот где у нас есть результаты y либо 0/1, которые говорят нам знак скрытой переменной ystar, Это то, что я имею до сих пор, но я не уверен, как добавить информацию в model раздел о y, Какие-нибудь мысли?

data {
  int<lower=0> N; // number of obs
  int<lower=0> K; // number of predictors
  int<lower=0,upper=1> y[N]; // outcomes
  matrix[N, K] x; // predictor variables
}
parameters {
  vector[K] beta; // beta coefficients
  vector[N] ystar; // latent variable
}
model {
  vector[N] mu; 
  beta ~ normal(0, 100);
  mu <- x*beta;
  ystar ~ normal(mu, 1);
}

1 ответ

Решение

Вы могли бы сделать data { int<lower=0> N; // number of obs int<lower=0> K; // number of predictors vector<lower=-1,upper=1> sign; // y = 0 -> -1, y = 1 -> 1 matrix[N, K] x; // predictor variables } parameters { vector[K] beta; // beta coefficients vector<lower=0>[N] abs_ystar; // latent variable } model { beta ~ normal(0, 100); // ignore the warning about a Jacobian from the parser sign .* abs_ystar ~ normal(x * beta, 1); }

Тем не менее, нет никаких оснований для увеличения данных в Stan для бинарной пробитной модели, если только не были пропущены некоторые результаты или что-то еще. Это более просто (и уменьшает пространство параметров до K вместо K + N), чтобы сделать data { int<lower=0> N; // number of obs int<lower=0> K; // number of predictors int<lower=0,upper=1> y[N]; // outcomes matrix[N, K] x; // predictor variables } parameters { vector[K] beta; // beta coefficients } model { vector[N] mu; beta ~ normal(0, 100); mu <- x*beta; for (n in 1:N) mu[n] <- Phi(mu[n]); y ~ bernoulli(mu); } Если вы действительно заботитесь о скрытой утилите, вы можете сгенерировать ее с помощью выборки отклонения в generated quantities блок, как это generated quantities { vector[N] ystar; { vector[N] mu; mu <- x * beta; for (n in 1:N) { real draw; draw <- not_a_number(); if (sign[n] == 1) while(!(draw > 0)) draw <- normal_rng(mu[n], 1); else while(!(draw < 0)) draw <- normal_rng(mu[n], 1); ystar[n] <- draw; } } }

Другие вопросы по тегам