module Numeric.Statistics (
Sample,Samples
, covarianceMatrix
, meanList, meanArray, meanMatrix
, varianceList, varianceArray, varianceMatrix
) where
import Numeric.LinearAlgebra
import qualified Data.Array.IArray as I
import Numeric.GSL.Statistics
type Sample a = Vector a
type Samples a = I.Array Int (Vector a)
covarianceMatrix :: Samples Double
-> Matrix Double
covarianceMatrix d = let (s,f) = I.bounds d
in fromArray2D $ I.array ((s,s),(f,f)) $ concat $ map (\(x,y) -> let c = covariance (d I.! x) (d I.! y) in if x == y then [((x,y),c)] else [((x,y),c),((y,x),c)]) $ filter (\(x,y) -> x <= y) $ I.range ((s,s),(f,f))
meanList :: (Container Vector a, Num (Vector a)) => [Sample a] -> Sample a
meanList [] = error "meanVectors: empty list"
meanList [s] = s
meanList (s:ss) = let ln = fromIntegral $ length ss + 1
in scale (recip ln) $ foldl (+) s ss
meanArray :: (Container Vector a, Num (Vector a)) => Samples a -> Sample a
meanArray a = meanList $ I.elems a
meanMatrix :: (Container Vector a, Num (Vector a), Element a) => Matrix a -> Sample a
meanMatrix a = meanList $ toRows a
varianceList :: (Container Vector a, Floating (Vector a)) => [Sample a] -> Sample a
varianceList [] = error "varianceList: empty list"
varianceList [s] = constant 0 (dim s)
varianceList l = let mxs = meanList (map (** 2) l)
msx = (meanList l) ** 2
in mxs msx
varianceArray :: (Container Vector a, Floating (Vector a)) => Samples a -> Sample a
varianceArray a = varianceList $ I.elems a
varianceMatrix :: (Container Vector a, Floating (Vector a), Element a) => Matrix a -> Sample a
varianceMatrix a = varianceList $ toRows a