- 多次元データが取れる場合と、多次元だけれど、その一部次元のデータしか取れない場合っていうのは、どういう違いがあるのか…
- multinormal2.stan
data {
int N_subjects;
int N_items;
matrix[N_subjects,N_items] y;
}
parameters {
vector[N_items] mu;
cov_matrix[N_items] Sigma;
}
transformed parameters {
}
model {
matrix[N_items,N_items] identity;
mu ~ normal(0,100);
identity <- diag_matrix(rep_vector(1.0,N_items));
Sigma ~ inv_wishart(N_items,identity);
for(i in 1:N_subjects)
y[i] ~ multi_normal(mu,Sigma);
}
data {
int N_subjects[3];
int N_items;
matrix[N_subjects[1],2] y12;
matrix[N_subjects[2],2] y23;
matrix[N_subjects[3],2] y31;
}
parameters {
vector[N_items] mu;
cov_matrix[N_items] Sigma;
}
transformed parameters {
cov_matrix[2] Sigma12;
cov_matrix[2] Sigma23;
cov_matrix[2] Sigma31;
vector[2] mu12;
vector[2] mu23;
vector[2] mu31;
Sigma12[1,1] <- Sigma[1,1];
Sigma12[1,2] <- Sigma[1,2];
Sigma12[2,1] <- Sigma[2,1];
Sigma12[2,2] <- Sigma[2,2];
Sigma23[1,1] <- Sigma[2,2];
Sigma23[1,2] <- Sigma[2,3];
Sigma23[2,1] <- Sigma[3,2];
Sigma23[2,2] <- Sigma[3,3];
Sigma31[1,1] <- Sigma[3,3];
Sigma31[1,2] <- Sigma[3,1];
Sigma31[2,1] <- Sigma[1,3];
Sigma31[2,2] <- Sigma[1,1];
mu12[1] <- mu[1];
mu12[2] <- mu[2];
mu23[1] <- mu[2];
mu23[2] <- mu[3];
mu31[1] <- mu[3];
mu31[2] <- mu[1];
}
model {
matrix[N_items,N_items] identity;
mu ~ normal(0,100);
identity <- diag_matrix(rep_vector(1.0,N_items));
Sigma ~ inv_wishart(N_items,identity);
for(i in 1:N_subjects[1]){
y12[i] ~ multi_normal(mu12,Sigma12);
}
for(i in 1:N_subjects[2]){
y23[i] ~ multi_normal(mu23,Sigma23);
}
for(i in 1:N_subjects[3]){
y31[i] ~ multi_normal(mu31,Sigma31);
}
}
library(mvtnorm)
library(rstan)
library(MCMCpack)
N_subjects <- rep(100,3)
N_items <- 3
S <- riwish(N_items,diag(rep(1,N_items)))
mu <- rnorm(N_items)
tmp <- rmvnorm(N_subjects[1],mean=mu,sigma=S)
y12 <- tmp[,1:2]
tmp <- rmvnorm(N_subjects[2],mean=mu,sigma=S)
y23 <- tmp[,2:3]
tmp <- rmvnorm(N_subjects[3],mean=mu,sigma=S)
y31 <- tmp[,c(3,1)]
dat1 <- list(N_subjects=N_subjects,N_items=N_items,y12=y12,y23=y23,y31=y31)
out1 <- stan(file="multinormal4.stan",data=dat1)
ymp <- rmvnorm(sum(N_subjects)/3*3,mean=mu,sigma=S)
dat2 <- list(N_subjects=N_subjects[3],N_items=N_items,y=tmp)
out2 <- stan(file="multinormal2.stan",data=dat2)