Skip to content

Commit f3d9a6b

Browse files
author
Frankie Robertson
committed
Add multidim to MirtCAT compat
1 parent 8992a35 commit f3d9a6b

File tree

1 file changed

+25
-10
lines changed

1 file changed

+25
-10
lines changed

src/Compat/MirtCAT.jl

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ to randomly select items, and 'seq' for selecting items sequentially
7171
=#
7272

7373
const ability_estimator_aliases = Dict(
74-
"MAP" => (; optimizer, kwargs...) -> ModeAbilityEstimator(PriorAbilityEstimator(), optimizer),
75-
"ML" => (; optimizer, kwargs...) -> ModeAbilityEstimator(SafeLikelihoodAbilityEstimator(), optimizer),
76-
"EAP" => (; integrator, kwargs...) -> MeanAbilityEstimator(PriorAbilityEstimator(), integrator),
74+
"MAP" => (; optimizer, ncomp, kwargs...) -> ModeAbilityEstimator(PriorAbilityEstimator(; ncomp=ncomp), optimizer),
75+
"ML" => (; optimizer, ncomp, kwargs...) -> ModeAbilityEstimator(SafeLikelihoodAbilityEstimator(; ncomp=ncomp), optimizer),
76+
"EAP" => (; integrator, ncomp, kwargs...) -> MeanAbilityEstimator(PriorAbilityEstimator(; ncomp=ncomp), integrator),
7777
# "WLE" for weighted likelihood estimation
7878
# "EAPsum" for the expected a-posteriori for each sum score
7979
)
@@ -116,19 +116,34 @@ function setup_optimizer(lo=-6.0, hi=6.0)
116116
# https://stats.stackexchange.com/questions/272880/algorithm-used-in-nlm-function-in-r
117117
# So just use Newton() with defaults for now
118118
# Except then we can't have box constraints so I suppose IPNewton
119-
Optimizers.OneDimOptimOptimizer(lo, hi, Optimizers.IPNewton())
119+
if lo isa AbstractVector && hi isa AbstractVector
120+
Optimizers.MultiDimOptimOptimizer(lo, hi, Optimizers.IPNewton())
121+
else
122+
Optimizers.OneDimOptimOptimizer(lo, hi, Optimizers.IPNewton())
123+
end
120124
end
121125

122126
function assemble_rules(;
123127
criteria = "MI",
124128
method = "MAP",
125-
start_item = 1
129+
start_item = 1,
130+
ncomp = 0
126131
)
127-
integrator = setup_integrator()
128-
optimizer = setup_optimizer()
129-
ability_estimator = ability_estimator_aliases[method](; integrator, optimizer)
130-
posterior_ability_estimator = PriorAbilityEstimator()
131-
@info "assemble rules" criteria
132+
if ncomp == 0
133+
lo = -6.0
134+
hi = 6.0
135+
pts = mirtcat_quadpts(1)
136+
theta_lim = 20.0
137+
else
138+
lo = fill(-6.0, ncomp)
139+
hi = fill(6.0, ncomp)
140+
pts = mirtcat_quadpts(ncomp)
141+
theta_lim = fill(20.0, ncomp)
142+
end
143+
integrator = setup_integrator(lo, hi, pts)
144+
optimizer = setup_optimizer(-theta_lim, theta_lim)
145+
ability_estimator = ability_estimator_aliases[method](; integrator, optimizer, ncomp)
146+
posterior_ability_estimator = PriorAbilityEstimator(; ncomp)
132147
raw_next_item = next_item_aliases[criteria](ability_estimator, posterior_ability_estimator, integrator, optimizer)
133148
next_item = FixedFirstItemNextItemRule(start_item, raw_next_item)
134149
CatRules(;

0 commit comments

Comments
 (0)