Стэн: Копула на наблюдаемой переменной и латентной переменной

Рассмотрим наблюдаемые данные y1 и y2. y1 измеряется в непрерывной шкале, а y2 измеряется в двоичной шкале. Предполагается, что непрерывная скрытая переменная z генерирует y2 как: y2 = I(z > 0). (Если z нормально, то y2 - бинарный пробит незначительно). Кроме того, связка используется для моделирования зависимости между y1 и z. Эта модель может быть написана иерархически (с некоторым злоупотреблением обозначениями) как:

y2 = I (z> 0)
(y1, z) ~ C (F_y1 (| w), F_z (| w) | phi)
w, phi ~ priors

где w - вектор предельных параметров для y1 и z, F_y1 и F_z - соответствующие предельные cdfs для y1 и z, phi - параметр связки.

Как это можно смоделировать в Стэне? Я написал пользовательскую функцию вероятности для выборки y1 и z из двухфакторной вероятности, полученной связкой. Чего я не знаю, как это сделать, так это учесть (сгенерировать?) Скрытую переменную (и) z и как определить связь между y2 и z.

Я уже рассмотрел регрессию Пробита с увеличением данных в stan, но это не кажется полезным из-за связки, которая есть в моей модели.

Редактировать: я могу ошибаться из-за того, что приведенная выше ссылка бесполезна. Я написал следующий код, был бы признателен за комментарии, если он выглядит правильно (теоретически).

functions {
real copulapdf_log(real[] y1, real[] z, vector mu1, vector mu2, real sigma1, real phi, int n){
  real logl;
  real s;
  logl <- 0.0;
  for (i in 1:n){
    s <- log(dCphi_du1du2_s(normal_cdf(y1[i],mu1[i],sigma1), logistic_cdf(z[i],mu2[i],1), phi)) + normal_log(y1[i],mu1[i],sigma1) + logistic_log(z[i],mu2[i],1); 
    logl <- logl + s;
  }
  return logl;
}  
}

data {
  int<lower=0> n; // number of subjects
  int<lower=0> k1; // number of predictors for y1
  int<lower=0> k2; // number of predictors for y2
  real y1[n]; // continuous data
  real y2[n]; // 0/1 binary data
  matrix[n, k1] x1; // predictor variables for y1
  matrix[n, k2] x2; // predictor variables for y2
}

transformed data{
  int<lower=-1, upper=1> sign[n];
  for (i in 1:n) {
    if (y2[i]==1) 
      sign[i] <- 1;
    else
      sign[i] <- -1;
  }
}

parameters {
  real phi; // frank copula param
  vector[k1] b1; // beta coefficients for y1
  vector[k2] b2; // beta coefficients for y2
  real<lower=0> abs_z[n]; // abs value of latent variable
  real<lower=0> sigma1; // sd for y1's normal distribution
}

transformed parameters {
  real v[n];
  vector[n] mu1; // location for y1
  vector[n] mu2; // location for z
  for (i in 1:n) {
    v[i] <- sign[i] * abs_z[i];
  }
  mu1 <- x1 * b1;
  mu2 <- x2 * b2;
}

model {
  b1 ~ normal(0, 100);
  b2 ~ normal(0, 100);
  phi ~ normal(0, 10);
  increment_log_prob(copulapdf_log(y1, v, mu1, mu2, sigma1, phi, n));
}

1 ответ

Если вам нужна формулировка скрытых параметров, это похоже на характеристику пробертной регрессии Альберта и Чиба. Что вам нужно сделать, это объявить усечение в параметрах. В главе руководства по регрессии есть пример с многомерным пробитом, который показывает, как это делается. В основном положительные значения получают ограничение нижнего =0, а отрицательные - ограничение верхнего =0, а затем вы объединяете оба набора параметров в вектор z (если вам действительно нужно соединить их вместе).

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