如何为此stan模型添加随机效果?

时间:2015-05-21 19:46:16

标签: r model bayesian stan

我有一个模型用于估算rhoN_items个观察的N_subjects中的类内相关性(mu参数)。每个项目都有一个固定的效果(平均向量y[i]' ~ multi_normal(mu + gamma[i],Sigma) ),但我想为每个人添加一个随机效果。我不是百分百肯定如何做到这一点,但我有一个猜测,如果有人可以确认或纠正它,我将不胜感激。我只需要将最后一行更改为以下内容:

gamma[i]

其中i是人parameters的随机效应? (此外,在model block块中声明实数的列向量,然后在data { int N_subjects; int N_items; matrix[N_subjects,N_items] y; } parameters { vector[N_items] mu; real<lower=0> sigma; real<lower=0,upper=1> rho; } transformed parameters { cov_matrix[N_items] Sigma; for (j in 1:N_items) for (k in 1:N_items) Sigma[j,k] <- pow(sigma,2)*pow(rho,step(abs(j-k)-0.5)); } model { sigma ~ uniform(0,100); rho ~ uniform(0,1); for (i in 1:N_items) mu[i] ~ normal(0,100); for (i in 1:N_subjects) y[i]' ~ multi_normal(mu,Sigma); } 中给它一个先验。)或者我是否以错误的方式进行此操作?

顺便提一下,如果有人有任何建议让这个模型更有效率,我将永远感激。

{
  "pageInfo": {
    "totalResults": 1000000
  },
  "items": [{...}, {...}]
}

2 个答案:

答案 0 :(得分:2)

关于计算效率的问题,改变 for (i in 1:N_items) mu[i] ~ normal(0,100); mu ~ normal(0,100); 因为这会将mu从N_items的内存分配数量减少到1.同样,您可以替换 for (i in 1:N_subjects) y[i]' ~ multi_normal(mu,Sigma); y ~ multi_normal(mu,Sigma); # or mu + gamma 如果您在y块中将row_vector声明为data的数组,就像 row_vector[N_items] y[N_subjects]; 此外,如果您先前的信念是sigma在0和100之间均匀分布,那么在parameters块中声明这些边界在计算上更有效率 real<lower=0,upper=100> sigma; 并在model区块中注明其先前的内容 // sigma ~ uniform(0,100); 这样做更有效率,因为它避免了为sigma生成大于100的提议,这将被自动拒绝,并且没有哈密顿蒙特卡罗所需的定义明确的偏导数。

答案 1 :(得分:2)

在模型规范问题上,您可以根据需要指定多变量正态似然的期望值。在您的情况下,最好将y声明为row_vector的数组 row_vector[N_items] y[N_subjects]; 然后在parameters块中 vector[N_subjects] unit; row_vector[N_items] item; 然后在model块中,构建mu以用于可能性 row_vector[N_items] mu[N_subjects]; for (i in 1:N_subjects) mu[i] <- unit[i] + item; y ~ multi_normal(mu, Sigma); 您需要unititem上适当的先验。