我有一个模型用于估算rho
上N_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": [{...}, {...}]
}
答案 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);
您需要unit
和item
上适当的先验。