考虑观察到的数据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~preiors
其中w是y1和z的边际参数的向量,F_y1和F_z分别是y1和z的边际cdfs,phi是copula参数。
这怎么可能在斯坦模仿?我已经写了一个自定义概率函数来从copula产生的双变量可能性中抽样y1和z。我不知道该怎么做的是考虑(生成?)潜在变量z,以及如何指定y2和z之间的关系。
我已经查看了Probit regression with data augmentation in stan,但由于我的模型中的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));
}
答案 0 :(得分:3)
如果你需要潜在的参数表达式,那就像是probit回归的Albert和Chib特征。您需要做的是在参数中声明截断。在涉及多变量概率的回归的手册章节中有一个例子,说明了它是如何完成的。基本上,正值得到一个较低的= 0约束,而负值得到一个较高的= 0约束,然后你将两组参数放在一个z向量中(如果你真的需要把它重新组合在一起)。