STAN - 给定分类向量的实参数
STAN - Real parameter given a categorical vector
我是一个使用 stan 的初学者(顺便说一句,还有 Whosebug,我完全不知道你是如何在上面漂亮地打印数据框的,找不到如何,抱歉)。
假设我想制作以下模型:
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 和 sigma。
我不想让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,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
我是一个使用 stan 的初学者(顺便说一句,还有 Whosebug,我完全不知道你是如何在上面漂亮地打印数据框的,找不到如何,抱歉)。
假设我想制作以下模型:
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 和 sigma。
我不想让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,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