{-# LANGUAGE DataKinds #-}
module Main (main) where
import Prelude ()
import Prelude.Compat
import Control.Lens ((&), (.~))
import Control.Monad (replicateM)
import Data.TDigest
import Statistics.Distribution (ContGen (..))
import Statistics.Distribution.ChiSquared (chiSquared)
import Statistics.Distribution.Normal (standard)
import qualified Graphics.Rendering.Chart.Backend.Diagrams as Chart
import qualified Graphics.Rendering.Chart.Easy as Chart
import qualified Graphics.Rendering.Chart.Plot.TDigest as Chart
import qualified System.Random.MWC as MWC
example1 :: IO ()
example1 = do
xs <- randomStream standard
let td = tdigest xs :: TDigest 10
Chart.toFile Chart.def "example1.svg" $ do
Chart.layout_title Chart..= "Normal distribution"
Chart.plot $ do
p <- Chart.tdigestPlot "tdigest" td
return $ Chart.tdigestToPlot $ p
& Chart.plot_tdigest_normalize .~ True
& Chart.plot_tdigest_deviations .~ Just 3
example2 :: IO ()
example2 = do
xs <- randomStream $ chiSquared 5
let td = tdigest xs :: TDigest 10
Chart.toFile Chart.def "example2.svg" $ do
Chart.layout_title Chart..= "Chi-squared distribution, k = 5"
Chart.plot $ do
p <- Chart.tdigestPlot "tdigest" td
return $ Chart.tdigestToPlot $ p
& Chart.plot_tdigest_normalize .~ True
& Chart.plot_tdigest_quantiles .~ [0.5, 0.9, 0.999]
main :: IO ()
main = do
example1
example2
-------------------------------------------------------------------------------
-- Helpers
-------------------------------------------------------------------------------
randomStream :: ContGen d => d -> IO [Double]
randomStream d = do
g <- MWC.create
replicateM 100000 (genContVar d g)