Skip to content

Commit b75736d

Browse files
committed
Vectorization of multi_normal, multi_normal_prec and multi_normal_cholesky + tests
1 parent 089759a commit b75736d

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
N <- 10
2+
J <- 5
3+
sigma <-
4+
structure(c(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
5+
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
6+
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
7+
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
8+
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1), .Dim = c(10L,
9+
10L))
10+
y <- structure(c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
11+
16, 17, 1, 19, 20, 21, 22, 23, 24, 25, 26, 3, 28, 29, 30, 31,
12+
32, 33, 3, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
13+
48, 49, 50), .Dim = c(5L, 10L))

basic_estimators/normal_multi.stan

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
data {
2+
int<lower=0> N; //response variable size
3+
int<lower=0> J; //number of observations
4+
vector[N] y[J];
5+
matrix[N, N] sigma;
6+
}
7+
transformed data {
8+
row_vector[N] ry[J];
9+
matrix[N, N] inv_sigma;
10+
for (n in 1:N)
11+
for (j in 1:J)
12+
ry[j][n] <- y[j][n];
13+
inv_sigma <- inverse_spd(sigma);
14+
}
15+
parameters {
16+
vector[N] beta[J];
17+
row_vector[N] rbeta[J];
18+
}
19+
model {
20+
for (n in 1:J)
21+
ry[n] ~ multi_normal(beta[n], sigma);
22+
y ~ multi_normal(beta, sigma);
23+
ry ~ multi_normal(beta[1], sigma);
24+
y[1] ~ multi_normal(beta, sigma);
25+
for (n in 1:J)
26+
y[n] ~ multi_normal(rbeta[n], sigma);
27+
y ~ multi_normal(rbeta, sigma);
28+
y ~ multi_normal(rbeta[1], sigma);
29+
ry[1] ~ multi_normal(rbeta, sigma);
30+
31+
for (n in 1:J)
32+
ry[n] ~ multi_normal_cholesky(beta[n], sigma);
33+
y ~ multi_normal_cholesky(beta, sigma);
34+
ry ~ multi_normal_cholesky(beta[1], sigma);
35+
y[1] ~ multi_normal_cholesky(beta, sigma);
36+
for (n in 1:J)
37+
y[n] ~ multi_normal_cholesky(rbeta[n], sigma);
38+
y ~ multi_normal_cholesky(rbeta, sigma);
39+
y ~ multi_normal_cholesky(rbeta[1], sigma);
40+
ry[1] ~ multi_normal_cholesky(rbeta, sigma);
41+
42+
for (n in 1:J)
43+
ry[n] ~ multi_normal_prec(beta[n], inv_sigma);
44+
y ~ multi_normal_prec(beta, inv_sigma);
45+
ry ~ multi_normal_prec(beta[1], inv_sigma);
46+
y[1] ~ multi_normal_prec(beta, inv_sigma);
47+
for (n in 1:J)
48+
y[n] ~ multi_normal_prec(rbeta[n], inv_sigma);
49+
y ~ multi_normal_prec(rbeta, inv_sigma);
50+
y ~ multi_normal_prec(rbeta[1], inv_sigma);
51+
ry[1] ~ multi_normal_prec(rbeta, inv_sigma);
52+
}

0 commit comments

Comments
 (0)