Skip to content

Commit e8c867b

Browse files
adapt mg models and fitmeasures
1 parent c63ca4c commit e8c867b

5 files changed

Lines changed: 31 additions & 24 deletions

File tree

src/additional_functions/helper.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ end
119119
check_single_lossfun(model::SemEnsemble; throw_error) =
120120
check_single_lossfun(model.sems...; throw_error)
121121

122-
# sclaing corrections for fit measures and multigroup models
123-
dof_correction(::SemFIML) = 0
124-
dof_correction(::SemML) = -1
125-
dof_correction(::SemWLS) = -1
122+
# scaling corrections for multigroup models
123+
mg_correction(::SemFIML) = 0
124+
mg_correction(::SemML) = 0
125+
mg_correction(::SemWLS) = -1

src/frontend/fit/fitmeasures/RMSEA.jl

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,23 @@ function RMSEA end
88
RMSEA(fit::SemFit) = RMSEA(fit, fit.model)
99

1010
function RMSEA(fit::SemFit, model::AbstractSemSingle)
11-
check_uniform_lossfun(model)
12-
return RMSEA(dof(fit), χ²(fit), nsamples(fit)-dof_correction(model.loss.functions[1]))
11+
check_single_lossfun(model; throw_error = true)
12+
return RMSEA(dof(fit), χ²(fit), nsamples(fit)+rmsea_correction(model.loss.functions[1]))
1313
end
1414

1515
function RMSEA(fit::SemFit, model::SemEnsemble)
1616
check_single_lossfun(model; throw_error = true)
17-
n = nsamples(fit)-model.n*dof_correction(model.sems[1].loss.functions[1])
17+
n = nsamples(fit)+model.n*rmsea_correction(model.sems[1].loss.functions[1])
1818
return sqrt(length(model.sems)) * RMSEA(dof(fit), χ²(fit), n)
1919
end
2020

21-
function RMSEA(dof, chi2, c)
22-
rmsea = (chi2 - dof) / (c * dof)
21+
function RMSEA(dof, chi2, N⁻)
22+
rmsea = (chi2 - dof) / (N⁻ * dof)
2323
rmsea = rmsea > 0 ? rmsea : 0
2424
return sqrt(rmsea)
2525
end
2626

27+
# scaling corrections
28+
rmsea_correction(::SemFIML) = 0
29+
rmsea_correction(::SemML) = -1
30+
rmsea_correction(::SemWLS) = -1

src/frontend/fit/fitmeasures/chi2.jl

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ end
1616

1717
χ²(::SemML, fit::SemFit, model::AbstractSemSingle) =
1818
(nsamples(fit) - 1) *
19-
(fit.minimum - logdet(obs_cov(observed(model))) - nobserved_vars(observed(model)))
19+
(fit.minimum - logdet(obs_cov(observed(model))) - nobserved_vars(model))
2020

2121
# bollen, p. 115, only correct for GLS weight matrix
2222
χ²(::SemWLS, fit::SemFit, model::AbstractSemSingle) =
@@ -44,11 +44,14 @@ function χ²(::SemWLS, fit::SemFit, models::SemEnsemble)
4444
end
4545

4646
function χ²(::SemML, fit::SemFit, models::SemEnsemble)
47-
G = sum(zip(models.weights, models.sems)) do (w, model)
48-
data = observed(model)
49-
w * (logdet(obs_cov(data)) + nobserved_vars(data))
47+
F = 0
48+
for model in models.sems
49+
Fᵢ = objective(model, fit.solution)
50+
Fᵢ -= logdet(obs_cov(observed(model))) + nobserved_vars(model)
51+
Fᵢ *= nsamples(model) - 1
52+
F += Fᵢ
5053
end
51-
return (nsamples(models) - models.n) * (fit.minimum - G)
54+
return F
5255
end
5356

5457
function χ²(::SemFIML, fit::SemFit, models::SemEnsemble)

src/frontend/fit/fitmeasures/minus2ll.jl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,23 @@ minus2ll(fit::SemFit) = minus2ll(fit, fit.model)
1111

1212
function minus2ll(fit::SemFit, model::AbstractSemSingle)
1313
check_single_lossfun(model; throw_error = true)
14-
return minus2ll(model.loss.functions[1], fit, model)
14+
F = objective(model, fit.solution)
15+
return minus2ll(model.loss.functions[1], F, model)
1516
end
1617

1718
# SemML ------------------------------------------------------------------------------------
18-
function minus2ll(::SemML, fit::SemFit, model::AbstractSemSingle)
19-
obs = observed(model)
20-
return nsamples(obs) * (fit.minimum + log(2π) * nobserved_vars(obs))
19+
function minus2ll(::SemML, F, model::AbstractSemSingle)
20+
return nsamples(model) * (F + log(2π) * nobserved_vars(model))
2121
end
2222

2323
# WLS --------------------------------------------------------------------------------------
24-
minus2ll(::SemWLS, ::SemFit, ::AbstractSemSingle) = missing
24+
minus2ll(::SemWLS, F, ::AbstractSemSingle) = missing
2525

2626
# compute likelihood for missing data - H0 -------------------------------------------------
2727
# -2ll = (∑ log(2π)*(nᵢ*mᵢ)) + F*n
28-
function minus2ll(::SemFIML, fit::SemFit, model::AbstractSemSingle)
28+
function minus2ll(::SemFIML, F, model::AbstractSemSingle)
2929
obs = observed(model)::SemObservedMissing
30-
F = fit.minimum * nsamples(obs)
30+
F *= nsamples(obs)
3131
F += log(2π) * sum(pat -> nsamples(pat) * nmeasured_vars(pat), obs.patterns)
3232
return F
3333
end

src/types.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,13 +235,13 @@ function multigroup_weights(models, n)
235235
return [(nsamples(model)) / (nsamples_total) for model in models]
236236
end
237237
lossfun = models[1].loss.functions[1]
238-
if !applicable(dof_correction, lossfun)
238+
if !applicable(mg_correction, lossfun)
239239
@info "We don't know how to choose group weights for the specified loss function.
240240
Default weights of (#samples per group/#total samples) will be used".
241241
return [(nsamples(model)) / (nsamples_total) for model in models]
242242
end
243-
dc = dof_correction(lossfun)
244-
return [(nsamples(model)-dc) / (nsamples_total-n*dc) for model in models]
243+
c = mg_correction(lossfun)
244+
return [(nsamples(model)+c) / (nsamples_total+n*c) for model in models]
245245
end
246246

247247
param_labels(ensemble::SemEnsemble) = ensemble.param_labels

0 commit comments

Comments
 (0)