@@ -71,9 +71,9 @@ to randomly select items, and 'seq' for selecting items sequentially
7171=#
7272
7373const 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
120124end
121125
122126function 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