Skip to content

Commit 4c15328

Browse files
committed
n_man() -> nobserved_vars()
for missing data pattern: nobserved_vars() -> nmeasured_vars(), obs_cov/obs_mean -> measured_cov/measured_mean
1 parent 273cb02 commit 4c15328

14 files changed

Lines changed: 55 additions & 72 deletions

File tree

src/StructuralEquationModels.jl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ include("frontend/fit/fitmeasures/df.jl")
8282
include("frontend/fit/fitmeasures/minus2ll.jl")
8383
include("frontend/fit/fitmeasures/p.jl")
8484
include("frontend/fit/fitmeasures/RMSEA.jl")
85-
include("frontend/fit/fitmeasures/n_man.jl")
8685
include("frontend/fit/fitmeasures/fit_measures.jl")
8786
# standard errors
8887
include("frontend/fit/standard_errors/hessian.jl")
@@ -169,7 +168,6 @@ export AbstractSem,
169168
nsamples,
170169
p_value,
171170
RMSEA,
172-
n_man,
173171
EmMVNModel,
174172
se_hessian,
175173
se_bootstrap,

src/frontend/fit/fitmeasures/chi2.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Return the χ² value.
1515
# RAM + SemML
1616
χ²(lossfun::SemML, fit::SemFit, model::AbstractSemSingle) =
1717
(nsamples(fit) - 1) *
18-
(fit.minimum - logdet(obs_cov(observed(model))) - n_man(observed(model)))
18+
(fit.minimum - logdet(obs_cov(observed(model))) - nobserved_vars(observed(model)))
1919

2020
# bollen, p. 115, only correct for GLS weight matrix
2121
χ²(lossfun::SemWLS, fit::SemFit, model::AbstractSemSingle) = (nsamples(fit) - 1) * fit.minimum
@@ -57,7 +57,7 @@ end
5757
function χ²(lossfun::SemML, fit::SemFit, models::SemEnsemble)
5858
G = sum(zip(models.weights, models.sems)) do (w, model)
5959
data = observed(model)
60-
w * (logdet(obs_cov(data)) + n_man(data))
60+
w * (logdet(obs_cov(data)) + nobserved_vars(data))
6161
end
6262
return (nsamples(models) - 1) * (fit.minimum - G)
6363
end

src/frontend/fit/fitmeasures/df.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ df(sem_fit::SemFit) = df(sem_fit.model)
1111
df(model::AbstractSem) = n_dp(model) - nparams(model)
1212

1313
function n_dp(model::AbstractSemSingle)
14-
nman = n_man(model)
15-
ndp = 0.5(nman^2 + nman)
14+
nvars = nobserved_vars(model)
15+
ndp = 0.5(nvars^2 + nvars)
1616
if !isnothing(model.imply.μ)
17-
ndp += n_man(model)
17+
ndp += nvars
1818
end
1919
return ndp
2020
end

src/frontend/fit/fitmeasures/minus2ll.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ minus2ll(minimum::Number, model::AbstractSemSingle) =
2222
# SemML ------------------------------------------------------------------------------------
2323
function minus2ll(lossfun::SemML, minimum::Number, model::AbstractSemSingle)
2424
obs = observed(model)
25-
return nsamples(obs) * (minimum + log(2π) * n_man(obs))
25+
return nsamples(obs) * (minimum + log(2π) * nobserved_vars(obs))
2626
end
2727

2828
# WLS --------------------------------------------------------------------------------------
@@ -33,7 +33,7 @@ minus2ll(lossfun::SemWLS, minimum::Number, model::AbstractSemSingle) = missing
3333
function minus2ll(lossfun::SemFIML, minimum::Number, model::AbstractSemSingle)
3434
obs = observed(model)::SemObservedMissing
3535
F = minimum * nsamples(obs)
36-
F += log(2π) * sum(pat -> nsamples(pat) * nobserved_vars(pat), obs.patterns)
36+
F += log(2π) * sum(pat -> nsamples(pat) * nmeasured_vars(pat), obs.patterns)
3737
return F
3838
end
3939

@@ -46,17 +46,17 @@ function minus2ll(observed::SemObservedMissing)
4646
for pat in observed.patterns
4747
nᵢ = nsamples(pat)
4848
# implied covariance/mean
49-
Σᵢ = Symmetric(Σ[pat.obs_mask, pat.obs_mask])
49+
Σᵢ = Symmetric(Σ[pat.measured_mask, pat.measured_mask])
5050

5151
ld = logdet(Σᵢ)
5252
Σᵢ⁻¹ = LinearAlgebra.inv!(cholesky!(Σᵢ))
53-
μ_diffᵢ = pat.obs_mean - μ[pat.obs_mask]
53+
μ_diffᵢ = pat.measured_mean - μ[pat.measured_mask]
5454

5555
F_pat = ld + dot(μ_diffᵢ, Σᵢ⁻¹, μ_diffᵢ)
5656
if nsamples(pat) > 1
57-
F_pat += dot(pat.obs_cov, Σᵢ⁻¹)
57+
F_pat += dot(pat.measured_cov, Σᵢ⁻¹)
5858
end
59-
F += (F_pat + log(2π) * nobserved_vars(pat)) * nsamples(pat)
59+
F += (F_pat + log(2π) * nmeasured_vars(pat)) * nsamples(pat)
6060
end
6161

6262
#F *= nsamples(observed)

src/frontend/fit/fitmeasures/n_man.jl

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/frontend/predict.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@ function predict_latent_scores(
8484
params::AbstractVector,
8585
data::SemObserved,
8686
)
87-
n_man(data) == nobserved_vars(model) || throw(
87+
nobserved_vars(data) == nobserved_vars(model) || throw(
8888
DimensionMismatch(
89-
"Number of variables in data ($(n_man(data))) does not match the number of observed variables in the model ($(nobserved_vars(model)))",
89+
"Number of variables in data ($(nobserved_vars(data))) does not match the number of observed variables in the model ($(nobserved_vars(model)))",
9090
),
9191
)
9292
length(params) == nparams(model) || throw(

src/imply/RAM/generic.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ end
203203
############################################################################################
204204

205205
function update_observed(imply::RAM, observed::SemObserved; kwargs...)
206-
if n_man(observed) == size(imply.Σ, 1)
206+
if nobserved_vars(observed) == size(imply.Σ, 1)
207207
return imply
208208
else
209209
return RAM(; observed = observed, kwargs...)

src/imply/RAM/symbolic.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ end
221221
############################################################################################
222222

223223
function update_observed(imply::RAMSymbolic, observed::SemObserved; kwargs...)
224-
if n_man(observed) == size(imply.Σ, 1)
224+
if nobserved_vars(observed) == size(imply.Σ, 1)
225225
return imply
226226
else
227227
return RAMSymbolic(; observed = observed, kwargs...)

src/loss/ML/FIML.jl

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,25 @@ end
1212

1313
# allocate arrays for pattern FIML
1414
function SemFIMLPattern(pat::SemObservedMissingPattern)
15-
nobserved = nobserved_vars(pat)
15+
nmes = nmeasured_vars(pat)
1616
nmissed = nmissed_vars(pat)
1717

1818
# linear indicies of co-observed variable pairs for each pattern
19-
Σ_linind = LinearIndices((n_man(pat), n_man(pat)))
19+
Σ_linind = LinearIndices((nobserved_vars(pat), nobserved_vars(pat)))
2020
∇ind = vec([
21-
Σ_linind[CartesianIndex(x, y)] for x in findall(pat.obs_mask),
22-
y in findall(pat.obs_mask)
21+
Σ_linind[CartesianIndex(x, y)] for x in findall(pat.measured_mask),
22+
y in findall(pat.measured_mask)
2323
])
2424

25-
return SemFIMLPattern(∇ind, zeros(nobserved, nobserved), Ref(NaN), zeros(nobserved))
25+
return SemFIMLPattern(∇ind, zeros(nmes, nmes), Ref(NaN), zeros(nmes))
2626
end
2727

2828
function prepare!(fiml::SemFIMLPattern, pat::SemObservedMissingPattern, implied::SemImply)
2929
Σ = implied.Σ
3030
μ = implied.μ
3131
@inbounds @. @views begin
32-
fiml.Σ⁻¹ = Σ[pat.obs_mask, pat.obs_mask]
33-
fiml.μ_diff = pat.obs_mean - μ[pat.obs_mask]
32+
fiml.Σ⁻¹ = Σ[pat.measured_mask, pat.measured_mask]
33+
fiml.μ_diff = pat.measured_mean - μ[pat.measured_mask]
3434
end
3535
Σ_chol = cholesky!(Symmetric(fiml.Σ⁻¹))
3636
fiml.logdet[] = logdet(Σ_chol)
@@ -42,7 +42,7 @@ end
4242
function objective(fiml::SemFIMLPattern{T}, pat::SemObservedMissingPattern) where {T}
4343
F = fiml.logdet[] + dot(fiml.μ_diff, fiml.Σ⁻¹, fiml.μ_diff)
4444
if nsamples(pat) > 1
45-
F += dot(pat.obs_cov, fiml.Σ⁻¹)
45+
F += dot(pat.measured_cov, fiml.Σ⁻¹)
4646
F *= nsamples(pat)
4747
end
4848
return F
@@ -52,15 +52,15 @@ function gradient!(JΣ, Jμ, fiml::SemFIMLPattern, pat::SemObservedMissingPatter
5252
Σ⁻¹ = Symmetric(fiml.Σ⁻¹)
5353
μ_diff⨉Σ⁻¹ = fiml.μ_diff' * Σ⁻¹
5454
if nsamples(pat) > 1
55-
JΣ_pat = Σ⁻¹ * (I - pat.obs_cov * Σ⁻¹ - fiml.μ_diff * μ_diff⨉Σ⁻¹)
55+
JΣ_pat = Σ⁻¹ * (I - pat.measured_cov * Σ⁻¹ - fiml.μ_diff * μ_diff⨉Σ⁻¹)
5656
JΣ_pat .*= nsamples(pat)
5757
else
5858
JΣ_pat = Σ⁻¹ * (I - fiml.μ_diff * μ_diff⨉Σ⁻¹)
5959
end
6060
@inbounds vec(JΣ)[fiml.∇ind] .+= vec(JΣ_pat)
6161

6262
lmul!(2 * nsamples(pat), μ_diff⨉Σ⁻¹)
63-
@inbounds Jμ[pat.obs_mask] .+= μ_diff⨉Σ⁻¹'
63+
@inbounds Jμ[pat.measured_mask] .+= μ_diff⨉Σ⁻¹'
6464
return nothing
6565
end
6666

@@ -104,7 +104,7 @@ end
104104
function SemFIML(; observed::SemObservedMissing, specification, kwargs...)
105105
return SemFIML(
106106
[SemFIMLPattern(pat) for pat in observed.patterns],
107-
zeros(n_man(observed), n_man(observed)),
107+
zeros(nobserved_vars(observed), nobserved_vars(observed)),
108108
CommutationMatrix(nvars(specification)),
109109
nothing,
110110
)
@@ -186,8 +186,8 @@ function F_FIML(
186186
end
187187

188188
function ∇F_FIML!(G, fiml::SemFIML, observed::SemObservedMissing, model::AbstractSemSingle)
189-
= zeros(n_man(model))
190-
= zeros(n_man(model)^2)
189+
= zeros(nobserved_vars(model))
190+
= zeros(nobserved_vars(model)^2)
191191

192192
for (pat_fiml, pat) in zip(fiml.patterns, observed.patterns)
193193
gradient!(JΣ, Jμ, pat_fiml, pat)

src/loss/WLS/WLS.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ function SemWLS(;
5959
meanstructure = false,
6060
kwargs...,
6161
)
62-
n_obs = n_man(observed)
62+
n_obs = nobserved_vars(observed)
6363
tril_ind = filter(x -> (x[1] >= x[2]), CartesianIndices(obs_cov(observed)))
6464
s = obs_cov(observed)[tril_ind]
6565

0 commit comments

Comments
 (0)