Stan语法可根据参数创建乘积矢量,而无需对乘积进行采样

时间:2019-07-25 16:17:58

标签: stan

我有一个潜在变量模型,可以在其中产生一个乘积项。乘积项是对两个潜在变量的分数进行采样的乘积。目前,我的模型正在对乘积项进行采样。这大大增加了我模型中的参数数量。

我的原始模型采用非矩阵形式:

 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个因子的抽样得分的乘积中产生一个值。

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)定义为转换后的数据变量。

也许可以走得更远,直接定义muetamu_eta?)的元素,而无需先构造矩阵。