1+ module EigenTest
2+
3+ using MultiResponseVarianceComponentModels
4+ using BenchmarkTools, LinearAlgebra, Profile, Random, StatsBase, Test
5+
6+ const MRVCModels = MultiResponseVarianceComponentModels
7+ rng = MersenneTwister (456 )
8+
9+ n, p, d, m = 855 , 3 , 4 , 2
10+ X = [ones (n) randn (rng, n, p - 1 )] # design matrix including intercept
11+ # V[1] has entries i * (n - j + 1) for j ≥ i, then scaled to be a correlation matrix
12+ # V[2] is identity
13+ V = Vector {Matrix{Float64}} (undef, m)
14+ V = Vector {Matrix{Float64}} (undef, m)
15+ V[1 ] = [j ≥ i ? i * (n - j + 1 ) : j * (n - i + 1 ) for i in 1 : n, j in 1 : n]
16+ StatsBase. cov2cor! (V[1 ], [sqrt (V[1 ][i, i]) for i in 1 : n])
17+ V[2 ] = Matrix (UniformScaling (1.0 ), n, n)
18+ # true parameter values
19+ B_true = 2 * rand (p, d) # uniform on [0, 2]
20+ Σ_true = [
21+ Matrix (UniformScaling (0.2 ), d, d),
22+ Matrix (UniformScaling (0.6 ), d, d)
23+ ]
24+ Ω_true = zeros (n * d, n * d)
25+ for k in 1 : m
26+ Ω_true .+ = kron (Σ_true[k], V[k])
27+ end
28+ y = vec (X * B_true) + cholesky (Symmetric (Ω_true)). L * randn (rng, n * d)
29+ Y = reshape (y, n, d)
30+
31+ @testset " constructor two component" begin
32+ model2 = MRTVCModel (Y, X[:, 1 ], V)
33+ model2 = MRTVCModel (Y[:, 1 ], X, V)
34+ model2 = MRTVCModel (Y[:, 1 ], X[:, 1 ], V)
35+ model2 = MRTVCModel (Y, V)
36+ model2 = MRTVCModel (Y[:, 1 ], V)
37+ model2 = MRTVCModel (Y, X, V, se = false )
38+ model2 = MRTVCModel (Y, X, V)
39+ end
40+
41+ model2 = MRTVCModel (Y, X, V)
42+ model = MRVCModel (Y, X, V)
43+
44+ @testset " fit! two component by MLE with MM" begin
45+ MRVCModels. fit! (model2, algo = :MM , verbose = false , maxiter = 100 )
46+ MRVCModels. fit! (model, algo = :MM , verbose = false , maxiter = 100 )
47+ println (" ||B̂_MRTVCModel - B̂_MRVCModel|| = $(norm (model2. B - model. B)) " )
48+ for k in 1 : m
49+ println (" ||Σ̂[$k ]_MRTVCModel - Σ̂[$k ]_MRVCModel|| = $(norm (model2. Σ[k] - model. Σ[k])) " )
50+ end
51+ println (" ||logl_MRTVCModel - logl_MRVCModel|| = $(abs2 (model2. logl[1 ] - model. logl[1 ])) " )
52+ println (" ||Bcov_MRTVCModel - Bcov_MRVCModel|| = $(norm (model2. Bcov - model. Bcov)) " )
53+ println (" ||Σcov_MRTVCModel - Σcov_MRVCModel|| = $(norm (model2. Σcov - model. Σcov)) " )
54+ println (" ||B_true - B̂|| = $(norm (B_true - model. B)) " )
55+ for k in 1 : m
56+ println (" ||Σ_true[$k ] - Σ̂[$k ]|| = $(norm (Σ_true[k] - model. Σ[k])) " )
57+ end
58+ # @test norm(model2.B - model.B) < 2e-4 # 6.986221757875547e-5
59+ # @test norm(model2.Σ[1] - model.Σ[1]) < 2e-4 # 0.0001772074443345503
60+ # @test norm(model2.Σ[2] - model.Σ[2]) < 2e-4 # 1.6274369068536495e-5
61+ # @test abs2(model2.logl[1] - model.logl[1]) < 2e-4 # 4.7903903529347e-8
62+ # @test norm(model2.Bcov - model.Bcov) < 2e-4 # 4.423117207077623e-5
63+ # @test norm(model2.Σcov - model.Σcov) < 2e-4 # 9.284043626500212e-6
64+ end
65+
66+ model2 = MRTVCModel (Y, X, V, reml = true )
67+ model = MRVCModel (Y, X, V, reml = true )
68+
69+ @testset " fit! two component by REML with MM" begin
70+ MRVCModels. fit! (model2, algo = :MM , verbose = false , maxiter = 100 )
71+ MRVCModels. fit! (model, algo = :MM , verbose = false , maxiter = 100 )
72+ println (" ||B̂_MRTVCModel - B̂_MRVCModel|| = $(norm (model2. B_reml - model. B_reml)) " )
73+ for k in 1 : m
74+ println (" ||Σ̂[$k ]_MRTVCModel - Σ̂[$k ]_MRVCModel|| = $(norm (model2. Σ[k] - model. Σ[k])) " )
75+ end
76+ println (" ||logl_MRTVCModel - logl_MRVCModel|| = $(abs2 (model2. logl[1 ] - model. logl[1 ])) " )
77+ println (" ||Bcov_MRTVCModel - Bcov_MRVCModel|| = $(norm (model2. Bcov_reml - model. Bcov_reml)) " )
78+ println (" ||Σcov_MRTVCModel - Σcov_MRVCModel|| = $(norm (model2. Σcov - model. Σcov)) " )
79+ println (" ||B_true - B̂|| = $(norm (B_true - model. B_reml)) " )
80+ for k in 1 : m
81+ println (" ||Σ_true[$k ] - Σ̂[$k ]|| = $(norm (Σ_true[k] - model. Σ[k])) " )
82+ end
83+ # @test norm(model2.B_reml - model.B_reml) < 9e-14 # 8.886934507200367e-14
84+ # @test norm(model2.Σ[1] - model.Σ[1]) < 9e-14 # 1.9800578221407427e-14
85+ # @test norm(model2.Σ[2] - model.Σ[2]) < 9e-14 # 2.9834222365790734e-15
86+ # @test abs2(model2.logl[1] - model.logl[1]) < 9e-14 # 1.987301421658649e-22
87+ # @test norm(model2.Bcov_reml - model.Bcov_reml) < 9e-14 # 5.04991691887946e-15
88+ # @test norm(model2.Σcov - model.Σcov) < 9e-14 # 1.0311308785032728e-15
89+ end
90+
91+ end
0 commit comments