1

考虑观察到的数据 y1 和 y2。y1 以连续刻度测量,y2 以二进制刻度测量。假设连续潜变量 z 生成 y2 为:y2 = I(z > 0)。(如果 z 是正常的,那么 y2 是二进制概率)。此外,使用 copula 对 y1 和 z 之间的依赖关系进行建模。该模型可以分层编写(有一些符号滥用)为:

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

其中 w 是 y1 和 z 的边际参数向量,F_y1 和 F_z 分别是 y1 和 z 的边际 cdf,phi 是 copula 参数。

这怎么能在 Stan 中建模呢?我编写了一个自定义概率函数来从 copula 产生的二元似然中采样 y1 和 z。我不知道如何解释(生成?)潜在变量 z,以及如何指定 y2 和 z 之间的关系。

我已经在 stan 中查看了使用数据增强的 Probit 回归,但这似乎没有帮助,因为我的模型中有 copula。

编辑:我可能误认为上面的链接没有用。我已经编写了以下代码,如果它看起来正确(理论上),将不胜感激。

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));
}
4

1 回答 1

3

如果您需要潜在参数公式,那就像概率回归的 Albert 和 Chib 表征一样。您需要做的是在参数中声明截断。在涉及多元概率的回归的手册章节中有一个示例,说明了它是如何完成的。基本上,正值得到一个 lower=0 约束,负值得到一个 upper=0 约束,然后你将两组参数放在一起到 az 向量中(如果你真的需要把它放回一起)。

于 2016-03-17T20:17:57.857 回答