-- Statistics module.
-- By Gregory W. Schwartz
--
{- | Collection of functions pertaining statistics needed in the library
-}

module Math.Diversity.Statistics ( median, medmad ) where

-- Built-in
import Data.List
import Data.Maybe

-- | Get the median, adapted from
-- http://rosettacode.org/wiki/Averages/Median#Haskell, but FIXED due to
-- zero indexing
median :: [Double] -> Maybe Double
median xs | null xs  = Nothing
          | odd  len = Just $ xs !! mid
          | even len = Just meanMedian
  where
    len        = length xs
    mid        = len `div` 2
    meanMedian = (xs !! (mid - 1) + xs !! mid) / 2

-- | Get the median and median absolute deviation (MAD) of a list of numbers
medmad :: [Double] -> (Double, Double)
medmad xs = (sampleMedian, mad)
  where
    mad          = fromJust
                 . median
                 . sort
                 . map (\x -> abs (x - sampleMedian))
                 $ xs
    sampleMedian = fromJust . median . sort $ xs