module Statistics.Distribution.Binomial
(
BinomialDistribution
, binomial
, bdTrials
, bdProbability
) where
import Control.Exception (assert)
import Data.Array.Vector
import Data.Typeable (Typeable)
import qualified Statistics.Distribution as D
import Statistics.Math (choose)
data BinomialDistribution = BD {
bdTrials :: !Int
, bdProbability :: !Double
} deriving (Eq, Read, Show, Typeable)
instance D.Distribution BinomialDistribution where
probability = probability
cumulative = cumulative
inverse = inverse
instance D.Variance BinomialDistribution where
variance = variance
instance D.Mean BinomialDistribution where
mean = mean
probability :: BinomialDistribution -> Double -> Double
probability (BD n p) x =
fromIntegral (n `choose` floor x) * p ** x * (1p) ** (fromIntegral nx)
cumulative :: BinomialDistribution -> Double -> Double
cumulative d =
sumU . mapU (probability d . fromIntegral) . enumFromToU (0::Int) . floor
inverse :: BinomialDistribution -> Double -> Double
inverse d@(BD n _p) p = D.findRoot d p (n'/2) 0 n'
where n' = fromIntegral n
mean :: BinomialDistribution -> Double
mean (BD n p) = fromIntegral n * p
variance :: BinomialDistribution -> Double
variance (BD n p) = fromIntegral n * p * (1 p)
binomial :: Int
-> Double
-> BinomialDistribution
binomial n p =
assert (n > 0) .
assert (p > 0 && p < 1) $
BD n p