module Histogram (
histogram
) where
import qualified Data.Set as Set
import qualified Data.Vector.Generic as VG
import Data.Vector.Unboxed ((!))
import qualified Statistics.Sample.Histogram as SSH
import Statistics.Test.ApproxRand
import Statistics.Types (Sample)
histogram ::
Int
-> TestResult
-> Either String [(Double, Int)]
histogram prefBins (TestResult _ _ randomizedStats) =
if bins < 2 then
Left "Cannot make a histogram, because the data cannot be divided in more than one bin."
else
Right $ VG.toList $ VG.zip ticks numSamples
where
bins = numBins prefBins randomizedStats
(lowerBounds, numSamples) =
SSH.histogram prefBins randomizedStats
-- Compute the middle values of the bins.
bucketSize = (lowerBounds ! 1) - (lowerBounds ! 0)
bucketHalf = bucketSize / 2
ticks = VG.map ((+) bucketHalf) lowerBounds
numBins :: Int -> Sample -> Int
numBins pref =
min pref . Set.size . VG.foldl' (flip Set.insert) Set.empty