我有一个潜在变量模型,可以在其中产生一个乘积项。乘积项是对两个潜在变量的分数进行采样的乘积。目前,我的模型正在对乘积项进行采样。这大大增加了我模型中的参数数量。
我的原始模型采用非矩阵形式:
vector [N] mueta;
matrix [N ,2] xi ;
mueta = b1[1] +
b1[2]*xi[,1] +
b1[3]*xi[,2] +
b1[4]*(xi[,2].*xi[,1]) ;
我将其更改为矩阵公式,其中xi[,1]
是N
的{{1}}长度向量是因子得分,而1s (intercept), xi[,2:3]
是交互作用。
xi[,4]
第一个模型不抽样 vector [N] mueta;
xi[,1] = rep_vector(1, N);
xi[,2:3] = zi * diag_pre_multiply(sigmaxi,L1)' ;
xi[,4] = (xi[,2].*xi[,3]);
mueta = xi * b1 ;
矩阵的乘积,第二个模型抽样。有没有一种方法可以让我在Stan中进行指定,以便不对xi
进行抽样,而只是从2个因子的抽样得分的乘积中产生一个值。
答案 0 :(得分:0)
看来我解决了自己的问题。我想将这个答案发布给其他可能遇到类似问题的人。
vector [N] mueta;
xi[,1] = rep_vector(1, N);
xi[,2:3] = zi * diag_pre_multiply(sigmaxi,L1)' ;
mueta = (append_col(xi,(xi[,2].*xi[,3])) * b1) ;
答案 1 :(得分:0)
我必须将此公式化为答案,因为我无法格式化注释中的代码。我建议声明xi
大一号并将其计算为
vector[N] mueta;
xi[ , 1] = rep_vector(1, N);
xi[ , 2:3] = zi * diag_pre_multiply(sigmaxi, L1)' ;
xi[ , 4] = xi[ , 2] .* xi[ , 3];
mueta = xi * b1
如果xi[ , 2]
和xi[ , 3]
是数据,那么您也可以预先计算它们的元素乘积。因此可以是:
transformed data {
vector[N] intercept = rep_vector(1, N);
vector[N] xi2_3 = xi[ , 2] .* xi[ , 3];
...
vector[N] mueta
= append_row(intercept,
append_row(zi * diag_pre_multiply(sigmaxi, L1)',
xi2_3))
* b1;
最好重组预测变量,以便将append_row(intercept, xi2_3)
定义为转换后的数据变量。
也许可以走得更远,直接定义mueta
(mu_eta
?)的元素,而无需先构造矩阵。