@@ -2,14 +2,12 @@ module FitTest
22
33using MultiResponseVarianceComponentModels
44using BenchmarkTools, LinearAlgebra, Profile, Random, StatsBase, Test
5- import LinearAlgebra: copytri!
65
76const MRVCModels = MultiResponseVarianceComponentModels
8-
9- rng = MersenneTwister (123 )
7+ Random. seed! (123 )
108
119n, p, d, m = 855 , 3 , 4 , 3
12- X = [ones (n) randn (rng, n, p - 1 )] # design matrix including intercept
10+ X = [ones (n) randn (n, p - 1 )] # design matrix including intercept
1311# V[1] is an AR1(ρ) matrix, with entries ρ^|i-j|
1412# V[2] has entries i * (n - j + 1) for j ≥ i, then scaled to be a correlation matrix
1513# V[3] is identity
@@ -30,21 +28,36 @@ B_true = 2 * rand(p, d) # uniform on [0, 2]
3028for k in 1 : m
3129 Ω_true .+ = kron (Σ_true[k], V[k])
3230end
33- y = vec (X * B_true) + cholesky (Symmetric (Ω_true)). L * randn (rng, n * d)
31+ y = vec (X * B_true) + cholesky (Symmetric (Ω_true)). L * randn (n * d)
3432Y = reshape (y, n, d)
3533
34+ @testset " constructor" begin
35+ model = MRVCModel (Y, X[:, 1 ], V)
36+ model = MRVCModel (Y[:, 1 ], X, V)
37+ model = MRVCModel (Y[:, 1 ], X[:, 1 ], V)
38+ model = MRVCModel (Y, V)
39+ model = MRVCModel (Y[:, 1 ], V)
40+ model = MRVCModel (Y, X, V[end ])
41+ model = MRVCModel (Y, V[end ])
42+ model = MRVCModel (Y, X, V, se = false )
43+ model = MRVCModel (Y, X, V)
44+ end
45+
3646model = MRVCModel (Y, X, V)
3747
3848@testset " fit! by MLE with MM" begin
39- @time MRVCModels. fit! (model, algo = :MM , verbose = false , maxiter = 100 )
49+ @time MRVCModels. fit! (model, algo = :MM , maxiter = 150 )
4050 println (" ||B_true - B̂|| = $(norm (B_true - model. B)) " )
4151 for k in 1 : m
4252 println (" ||Σ_true[$k ] - Σ̂[$k ]|| = $(norm (Σ_true[k] - model. Σ[k])) " )
4353 end
54+ println (" logl = $(model. logl[1 ]) " )
55+ display (model. Bcov)
56+ display (model. Σcov)
4457end
4558
4659@testset " fit! by MLE with EM" begin
47- @time MRVCModels. fit! (model, algo = :EM , verbose = false , maxiter = 100 )
60+ @time MRVCModels. fit! (model, algo = :EM , maxiter = 150 )
4861 println (" ||B_true - B̂|| = $(norm (B_true - model. B)) " )
4962 for k in 1 : m
5063 println (" ||Σ_true[$k ] - Σ̂[$k ]|| = $(norm (Σ_true[k] - model. Σ[k])) " )
5467model = MRVCModel (Y, X, V; reml = true )
5568
5669@testset " fit! by REML with MM" begin
57- @time MRVCModels. fit! (model, algo = :MM , verbose = false , maxiter = 100 )
70+ @time MRVCModels. fit! (model, algo = :MM , maxiter = 150 )
5871 println (" ||B_true - B̂|| = $(norm (B_true - model. B_reml)) " )
5972 for k in 1 : m
6073 println (" ||Σ_true[$k ] - Σ̂[$k ]|| = $(norm (Σ_true[k] - model. Σ[k])) " )
6174 end
75+ println (" logl = $(model. logl[1 ]) " )
76+ display (model. Bcov_reml)
77+ display (model. Σcov)
6278end
6379
6480@testset " fit! by REML with EM" begin
65- @time MRVCModels. fit! (model, algo = :EM , verbose = false , maxiter = 100 )
66- println (" ||B_true - B̂|| = $(norm (B_true - model. B_reml)) " )
67- for k in 1 : m
68- println (" ||Σ_true[$k ] - Σ̂[$k ]|| = $(norm (Σ_true[k] - model. Σ[k])) " )
69- end
70- end
71-
72- m = 2
73- # V[1] has entries i * (n - j + 1) for j ≥ i, then scaled to be a correlation matrix
74- # V[2] is identity
75- V = Vector {Matrix{Float64}} (undef, m)
76- V[1 ] = [j ≥ i ? i * (n - j + 1 ) : j * (n - i + 1 ) for i in 1 : n, j in 1 : n]
77- StatsBase. cov2cor! (V[1 ], [sqrt (V[1 ][i, i]) for i in 1 : n])
78- V[2 ] = Matrix (UniformScaling (1.0 ), n, n)
79- # true parameter values
80- Σ_true = [
81- Matrix (UniformScaling (0.2 ), d, d),
82- Matrix (UniformScaling (0.6 ), d, d)
83- ]
84- Ω_true = zeros (n * d, n * d)
85- for k in 1 : m
86- Ω_true .+ = kron (Σ_true[k], V[k])
87- end
88- y = vec (X * B_true) + cholesky (Symmetric (Ω_true)). L * randn (rng, n * d)
89- Y = reshape (y, n, d)
90-
91- model = MRTVCModel (Y, X, V)
92-
93- @testset " fit! two component by MLE with MM" begin
94- @time MRVCModels. fit! (model, algo = :MM , verbose = false , maxiter = 100 )
95- println (" ||B_true - B̂|| = $(norm (B_true - model. B)) " )
96- for k in 1 : m
97- println (" ||Σ_true[$k ] - Σ̂[$k ]|| = $(norm (Σ_true[k] - model. Σ[k])) " )
98- end
99- end
100-
101- model = MRTVCModel (Y, X, V; reml = true )
102-
103- @testset " fit! two component by REML with MM" begin
104- @time MRVCModels. fit! (model, algo = :MM , verbose = false , maxiter = 100 )
81+ @time MRVCModels. fit! (model, algo = :EM , maxiter = 150 )
10582 println (" ||B_true - B̂|| = $(norm (B_true - model. B_reml)) " )
10683 for k in 1 : m
10784 println (" ||Σ_true[$k ] - Σ̂[$k ]|| = $(norm (Σ_true[k] - model. Σ[k])) " )
0 commit comments