module Statistics.Autocorrelation
(
autocovariance
, autocorrelation
) where
import Data.Array.Vector
import Statistics.Sample (Sample, mean)
autocovariance :: Sample -> UArr Double
autocovariance a = mapU f . enumFromToU 0 $ l2
where
f k = sumU (zipWithU (*) (takeU (lk) c) (sliceU c k (lk)))
/ fromIntegral l
c = mapU (subtract (mean a)) a
l = lengthU a
autocorrelation :: Sample -> (UArr Double, UArr Double, UArr Double)
autocorrelation a = (r, ci (), ci (+))
where
r = mapU (/ headU c) c
where c = autocovariance a
dllse = mapU f . scanl1U (+) . mapU square $ r
where f v = 1.96 * sqrt ((v * 2 + 1) / l)
l = fromIntegral (lengthU a)
ci f = consU 1 . tailU . mapU (f (1/l)) $ dllse
square x = x * x