module Data.Summary.Bool (
Summary,
size,
sum,
mean,
meanSE,
meanCI,
empty,
singleton,
insert,
insertWith,
union,
unions,
fromList,
fromListWith,
toStats,
fromStats,
) where
import Prelude hiding (sum)
import Data.List( foldl' )
import Data.Monoid( Monoid(..) )
import Data.Data( Data, Typeable )
import Text.Printf( printf )
import Data.Summary.Utils( interval )
data Summary = S !Int
!Int
deriving(Eq, Data, Typeable)
instance Show Summary where
show s@(S n x) =
printf " sample size: %d" n
++ printf "\n successes: %d" x
++ printf "\n proportion: %g" (mean s)
++ printf "\n SE: %g" (meanSE s)
++ printf "\n 99%% CI: (%g, %g)" c1 c2
where (c1,c2) = meanCI 0.99 s
instance Monoid Summary where
mempty = empty
mappend = union
size :: Summary -> Int
size (S n _) = n
sum :: Summary -> Int
sum (S _ x) = x
mean :: Summary -> Double
mean (S n x) = fromIntegral x / fromIntegral n
meanSE :: Summary -> Double
meanSE s = sqrt (p*(1p) / n)
where p = mean s
n = fromIntegral $ size s
meanCI :: Double -> Summary -> (Double,Double)
meanCI level s = interval level (mean s) (meanSE s)
empty :: Summary
empty = S 0 0
singleton :: Bool -> Summary
singleton x = S 1 (if x then 1 else 0)
insert :: Bool -> Summary -> Summary
insert y (S n x) =
let n' = n+1
x' = if y then x+1 else x
in S n' x'
insertWith :: (a -> Bool) -> a -> Summary -> Summary
insertWith f a = insert (f a)
union :: Summary -> Summary -> Summary
union (S na xa) (S nb xb) = S (na + nb) (xa + xb)
unions :: [Summary] -> Summary
unions = foldl' union empty
fromList :: [Bool] -> Summary
fromList = foldl' (flip insert) empty
fromListWith :: (a -> Bool) -> [a] -> Summary
fromListWith f = fromList . map f
toStats :: Summary -> (Int,Int)
toStats (S n x) = (n,x)
fromStats :: Int -> Int -> Summary
fromStats = S