STAN——给定分类向量的实参数



我是一个使用stan的初学者(顺便说一句,我完全不知道你是如何在上面漂亮地打印数据帧的,找不到如何打印,对不起(。

假设我想制作以下模型:

y ~ normal(I*S + P*J,sigma)
P ~ normal(dP,1)

(为了简化这个例子,我将p周围的偏差固定为1(

其中,一方面,I是n,p矩阵预测器,S是相应的回归系数(大小p(

另一方面,dP和J只能有3个不同的值,但我的数据帧是这样构建的(R项目(:

dp <- c(0,0,0,0,0,0,0,2,2,2,2,2,2,2,1,1,1,1,1,1)
J <- c(5.2,5.2,....,2.3,2.3,....,7.5,7.5,...)

参数是S、p和西格玛。

我不希望stan改变p的每个分量,dp代表3种类型的数据,我只希望p的三个不同值对应于dp的3个差值。然而,我的数据帧的每一行都包含不同的I.值

编辑:用另一种方式说:对于每一行k,我想要:

y[k] ~ I[k,1]*S[1]+I[k,2]*S[2]...+ real_value_P * J[k]

我怎样才能做到这一点?

这是我的代码:

data {
int < lower = 1 > NR; // Number of rows
int < lower = 1 > NC; // Number of columns

matrix [NR,NC] I ;// Predictor I
vector [NR] dP;
vector [NR] J ;
vector [NR] y; // Outcome
}
parameters {
real < lower = 0 > sigma; // Error SD
vector [NC] S ;
vector [NC] P ;     
}
model {
P ~ normal(dP,1)
y ~ normal(I*S+P*J,sigma) ;
}

我不确定我是否真的很清楚,统计数据对我来说仍然是一个棘手的问题,我的模型比现在更复杂。

感谢

;技巧";似乎在矢量(这里的"索引"(中指示要取P的哪个值(1,1,1,1,1,…2,2,2,2,2,…,3,3,3,3(,然后在参数中对其进行循环以分配正确的值:

transformed parameters {
vector [NR] JP ; //J*P
for (k in 1:NR){ 
JP[k]=True_P[indices[k]]*J[k] ;
}

因此,完整的代码:

data {
int < lower = 1 > NR; // Number of rows
int < lower = 1 > NC; // Number of columns

matrix [NR,NC] I ;// Predictor I

int indices[NR]; // indices
vector [3] P ; 
vector [NR] dP ;
vector [NR] J ; 
vector [NR] y; // Outcome
}
parameters {
real < lower = 0 > sigma; // Error SD
vector < lower = 0 > [NC] S ;     // regression coefficients for predictors I
vector [2] True_P ;
}
transformed parameters {
vector [NR] JP ; //J*P
for (k in 1:NR){ 
JP[k]=True_P[indices[k]]*J[k] ;
}
}
model {
for (k in 1:3){
P[k] ~ normal(True_P[k],1) ; 
}
y ~ normal(I*S+JP,sigma) ;
}
generated quantities {
} // The posterior predictive distributiondistribution

最新更新