【问题标题】:Stan syntax to create vector of products from parameters without sampling the productStan 语法从参数创建产品向量而不对产品进行采样
【发布时间】:2019-07-25 16:17:58
【问题描述】:

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

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

 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] 就不会被采样,而只是两个因素的采样分数的乘积生成的值。

【问题讨论】:

    标签: stan


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复@BobCarpenter。 XI 实际上不是数据,而是要采样的参数(潜在因子分数)。我是通过使用 append_col() 得到的。我同意您用更好的命名约定重新组织元素的建议。
    【解决方案2】:

    看起来我解决了自己的问题。我想为可能有类似问题的其他人发布此答案。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 2018-02-27
      相关资源
      最近更新 更多