module Math.Diversity.Statistics ( median, medmad ) where
import Data.List
import Data.Maybe
median :: [Double] -> Maybe Double
median xs | null xs = Nothing
| odd len = Just $ sorted !! mid
| even len = Just meanMedian
where
len = length sorted
mid = len `div` 2
meanMedian = (sorted !! (mid 1) + sorted !! mid) / 2
sorted = sort xs
medmad :: [Double] -> Maybe (Double, Double)
medmad [] = Nothing
medmad xs = Just (sampleMedian, mad)
where
mad = fromJust
. median
. map (\x -> abs (x sampleMedian))
$ xs
sampleMedian = fromJust . median $ xs