1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
{-# LANGUAGE DeriveFunctor, DeriveDataTypeable,DeriveGeneric #-}
module Statistics.Test.Types (
Test(..)
, isSignificant
, TestResult(..)
, significant
, PositionTest(..)
) where
import Control.DeepSeq (NFData(..))
import Control.Monad (liftM3)
import Data.Aeson (FromJSON, ToJSON)
import Data.Binary (Binary (..))
import Data.Data (Typeable, Data)
import GHC.Generics
import Statistics.Types (PValue)
-- | Result of hypothesis testing
data TestResult = Significant -- ^ Null hypothesis should be rejected
| NotSignificant -- ^ Data is compatible with hypothesis
deriving (Eq,Ord,Show,Typeable,Data,Generic)
instance Binary TestResult where
get = do
sig <- get
if sig then return Significant else return NotSignificant
put = put . (== Significant)
instance FromJSON TestResult
instance ToJSON TestResult
instance NFData TestResult
-- | Result of statistical test.
data Test distr = Test
{ testSignificance :: !(PValue Double)
-- ^ Probability of getting value of test statistics at least as
-- extreme as measured.
, testStatistics :: !Double
-- ^ Statistic used for test.
, testDistribution :: distr
-- ^ Distribution of test statistics if null hypothesis is correct.
}
deriving (Eq,Ord,Show,Typeable,Data,Generic,Functor)
instance (Binary d) => Binary (Test d) where
get = liftM3 Test get get get
put (Test sign stat distr) = put sign >> put stat >> put distr
instance (FromJSON d) => FromJSON (Test d)
instance (ToJSON d) => ToJSON (Test d)
instance (NFData d) => NFData (Test d) where
rnf (Test _ _ a) = rnf a
-- | Check whether test is significant for given p-value.
isSignificant :: PValue Double -> Test d -> TestResult
isSignificant p t
= significant $ p >= testSignificance t
-- | Test type for test which compare positional (mean,median etc.)
-- information of samples.
data PositionTest
= SamplesDiffer
-- ^ Test whether samples differ in position. Null hypothesis is
-- samples are not different
| AGreater
-- ^ Test if first sample (A) is larger than second (B). Null
-- hypothesis is first sample is not larger than second.
| BGreater
-- ^ Test if second sample is larger than first.
deriving (Eq,Ord,Show,Typeable,Data,Generic)
instance Binary PositionTest where
get = do
i <- get
case (i :: Int) of
0 -> return SamplesDiffer
1 -> return AGreater
2 -> return BGreater
_ -> fail "Invalid PositionTest"
put SamplesDiffer = put (0 :: Int)
put AGreater = put (1 :: Int)
put BGreater = put (2 :: Int)
instance FromJSON PositionTest
instance ToJSON PositionTest
instance NFData PositionTest
-- | significant if parameter is 'True', not significant otherwise
significant :: Bool -> TestResult
significant True = Significant
significant False = NotSignificant
|