module Statistics.Autocorrelation
(
autocovariance
, autocorrelation
) where
import Statistics.Sample (Sample, mean)
import qualified Data.Vector.Unboxed as U
autocovariance :: Sample -> U.Vector Double
autocovariance a = U.map f . U.enumFromTo 0 $ l2
where
f k = U.sum (U.zipWith (*) (U.take (lk) c) (U.slice k (lk) c))
/ fromIntegral l
c = U.map (subtract (mean a)) a
l = U.length a
autocorrelation :: Sample -> (U.Vector Double, U.Vector Double, U.Vector Double)
autocorrelation a = (r, ci (), ci (+))
where
r = U.map (/ U.head c) c
where c = autocovariance a
dllse = U.map f . U.scanl1 (+) . U.map square $ r
where f v = 1.96 * sqrt ((v * 2 + 1) / l)
l = fromIntegral (U.length a)
ci f = U.cons 1 . U.tail . U.map (f (1/l)) $ dllse
square x = x * x