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)
定义为转换后的数据变量。
可能可以更进一步,直接定义 mueta
(mu_eta
?)的元素,而无需首先构造矩阵。
我有一个潜在变量模型,我在其中生成一个乘积项。乘积项是两个潜在变量的乘积,他们的分数被抽样。目前,我的模型正在对乘积项进行采样。这大大增加了我模型中的参数数量。
我的原始模型是非矩阵公式:
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)
定义为转换后的数据变量。
可能可以更进一步,直接定义 mueta
(mu_eta
?)的元素,而无需首先构造矩阵。