module Math.IRT.MLE.Internal.Generic
( MLEResult (..)
, generic_mleEst
, logLike
) where
import Numeric.AD (Mode, Scalar)
import Numeric.AD.Halley
import Statistics.Distribution (Distribution, ContDistr)
import Math.IRT.Fisher
import Math.IRT.Internal.Distribution
import Math.IRT.Internal.LogLikelihood
import Math.IRT.MLE.Internal.MLEResult
generic_mleEst :: (Distribution d, ContDistr d, DensityDeriv d, LogLikelihood d) => [Bool] -> [d] -> Int -> Double -> MLEResult
generic_mleEst rs params steps vTheta =
let est = (!! steps) $ extremumNoEq (logLike rs params) vTheta
fisher = fisherInfoObserved est rs params
in case fisher of
(FisherInfo _ t s) -> MLEResult est t s
logLike :: (Mode a, Floating a, Scalar a ~ Double, Distribution d, LogLikelihood d) => [Bool] -> [d] -> a -> a
logLike responses params vTheta =
let logLik = zipWith (\a b -> logLikelihood a b vTheta) responses params
bmePrior = 1
in sum logLik + log bmePrior