Skip to content

Commit 552691a

Browse files
author
Alexey Stukalov
committed
predict_latent_scores(): small refactor
1 parent 5db9b91 commit 552691a

File tree

1 file changed

+20
-15
lines changed

1 file changed

+20
-15
lines changed

src/frontend/predict.jl

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,21 @@ function inv_cov!(A::AbstractMatrix)
3535
return inv!(A_chol)
3636
end
3737

38-
function latent_scores_operator(::SemRegressionScores, model::SemLoss, params::AbstractVector;
38+
function latent_scores_operator(::Type{T}, model::SemLoss, params::AbstractVector;
39+
kwargs...
40+
) where T <: SemScoresPredictMethod
41+
ram = imply(model).ram_matrices
42+
latent_scores_operator(T, imply(model), materialize(ram.A, params), materialize(ram.S, params); kwargs...)
43+
end
44+
45+
function latent_scores_operator(::SemRegressionScores, implied::SemImply,
46+
A::AbstractMatrix, S::AbstractMatrix;
3947
alpha::Number = 0)
40-
implied = imply(model)
4148
ram = implied.ram_matrices
4249
lv_inds = latent_var_indices(ram)
4350

44-
A = materialize(ram.A, params)
4551
lv_FA = ram.F * A[:, lv_inds]
4652

47-
S = materialize(ram.S, params)
4853
if alpha == 0
4954
lv_I_A⁻¹ = inv(I - A)[lv_inds, :]
5055
cov_lv = X_A_Xt(S, lv_I_A⁻¹)
@@ -56,19 +61,17 @@ function latent_scores_operator(::SemRegressionScores, model::SemLoss, params::A
5661
return cov_lv * lv_FA' * Σ⁻¹
5762
end
5863

59-
function latent_scores_operator(::SemBartlettScores, model::SemLoss, params::AbstractVector;
64+
function latent_scores_operator(::SemBartlettScores, implied::SemImply,
65+
A::AbstractMatrix, S::AbstractMatrix;
6066
alpha::Number = 0)
61-
implied = imply(model)
6267
ram = implied.ram_matrices
6368
lv_inds = latent_var_indices(ram)
64-
A = materialize(ram.A, params)
6569
lv_FA = ram.F * A[:, lv_inds]
6670

67-
S = materialize(ram.S, params)
6871
obs_inds = observed_var_indices(ram)
6972
ov_S⁻¹ = inv(S[obs_inds, obs_inds])
70-
lv_FA⨉ov_S⁻ = lv_FA' * ov_S⁻¹
71-
cov_lv⁻¹ = lv_FA⨉ov_S⁻ * lv_FA
73+
lv_FA⨉ov_S⁻¹ = lv_FA' * ov_S⁻¹
74+
cov_lv⁻¹ = lv_FA⨉ov_S⁻¹ * lv_FA
7275
(alpha != 0) && (cov_lv += alpha * I)
7376
cov_lv = inv(cov_lv⁻¹)
7477

@@ -85,19 +88,21 @@ function predict_latent_scores(method::SemScoresPredictMethod, model::SemLoss, p
8588
(alpha < 0) && throw(ArgumentError("The regularization parameter alpha must be non-negative"))
8689

8790
implied = imply(model)
91+
ram = implied.ram_matrices
8892
update!(EvaluationTargets(0.0, nothing, nothing), implied, params)
8993

90-
lv_scores_op = latent_scores_operator(method, model, params; alpha)
94+
A = materialize(ram.A, params)
95+
S = materialize(ram.S, params)
96+
lv_inds = latent_var_indices(ram)
97+
lv_scores_op = latent_scores_operator(method, implied, A, S; alpha)
9198

9299
data = data.data .- (isnothing(data.obs_mean) ? mean(data.data, dims=1) : data.obs_mean')
93100
lv_scores = data * lv_scores_op'
94101

102+
# adjust the scores w.r.t the variable means
95103
if MeanStructure(implied) === HasMeanStructure
96-
ram = implied.ram_matrices
97-
lv_inds = latent_var_indices(ram)
98-
A = materialize(ram.A, params)
99-
lv_I_A⁻¹ = inv(I - A)[lv_inds, :]
100104
M = materialize(ram.M, params)
105+
lv_I_A⁻¹ = inv(I - A)[lv_inds, :]
101106
lv_scores .+= (lv_I_A⁻¹ * M)'
102107
end
103108

0 commit comments

Comments
 (0)