packages feed

goal-probability-0.1: scripts/poisson-binomial.hs

-- A script which demonstrates how the binomial and poisson distributions
-- approximate each other.

--- Imports ---


-- Goal --

import Goal.Core
import Goal.Geometry
import Goal.Probability


--- Script ---


main = renderableToAspectWindow False 800 600 . toRenderable $ poissonLayout 5

poissonLayout :: Double -> Layout Int Double
poissonLayout lmda = execEC $ do

    layout_title .= "Binomial Convergence to Poisson"
    layout_y_axis . laxis_title .= "Probability Mass"
    layout_x_axis . laxis_title .= "Count"

    let rng = [0..20]

    plot . liftEC $ do

        let pd = chart Standard $ fromList Poisson [lmda]
            ppnts = zip rng $ density pd <$> rng

        plot_points_style .= filledCircles 8 (opaque red)
        plot_points_title .= ("λ = " ++ show lmda)
        plot_points_values .= ppnts

    let bplt n = liftEC $ do

            let p = lmda / fromIntegral n
                alph = 2 * fromIntegral n / 100

                bd = chart Standard $ fromList (Binomial n) [p]
                bpnts = zip rng $ density bd <$> take (n+1) rng

            plot_points_style .= filledCircles 5 (withOpacity black alph)
            plot_points_title .= ("n = " ++ show n ++ ", p = " ++ show p)
            plot_points_values .= bpnts

    plot $ bplt 10
    plot $ bplt 25
    plot $ bplt 100