Stan 语法,用于从参数创建产品向量而不对产品进行采样

Stan syntax to create vector of products from parameters without sampling the product

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

我的原始模型是非矩阵公式:

 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 长度向量,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 ;  

第一个模型不对 xi 矩阵的乘积进行采样,而第二个公式进行采样。有没有办法让我在 Stan 中指定它,这样 xi[,4] 就不会被抽样,而只是从 2 个因素的抽样分数的乘积中生成的值。

看来我解决了自己的问题。我想 post 为可能有类似问题的其他人提供这个答案。

 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) ;   

我必须将其表述为答案,因为我无法在评论中格式化代码。我建议声明 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?)的元素,而无需首先构造矩阵。