-----------------------------------------------------------------------------
-- |
-- Module      :  Numeric.Statistics.Covariance
-- Copyright   :  (c) Matthew Donadio 2002
-- License     :  GPL
--
-- Maintainer  :  m.p.donadio@ieee.org
-- Stability   :  experimental
-- Portability :  portable
--
-- UNTESTED
--
-- Simple module for computing the covariance of two lists
--
-- @ Cov(X1,X2) = 1\/(N-1) * sum (i=1..N) ((x1_i - mu1)(x2_i - mu2)) @
--
-- Reference: Ross, NRiC
--
-----------------------------------------------------------------------------

module Numeric.Statistics.Covariance (cov) where

import Numeric.Statistics.Moment

cov :: (Fractional a) => [a] -> [a] -> a
cov :: forall a. Fractional a => [a] -> [a] -> a
cov [a]
x1 [a]
x2 = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
Prelude.sum (forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. Num a => a -> a -> a
(*) (forall a b. (a -> b) -> [a] -> [b]
map a -> a
f1 [a]
x1) (forall a b. (a -> b) -> [a] -> [b]
map a -> a
f2 [a]
x2)) forall a. Fractional a => a -> a -> a
/ (a
n forall a. Num a => a -> a -> a
- a
1)
    where mu1 :: a
mu1 = forall a. Fractional a => [a] -> a
mean [a]
x1
	  mu2 :: a
mu2 = forall a. Fractional a => [a] -> a
mean [a]
x2
	  n :: a
n = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => t a -> Int
length forall a b. (a -> b) -> a -> b
$ [a]
x1
	  f1 :: a -> a
f1 = \a
x -> (a
x forall a. Num a => a -> a -> a
- a
mu1)forall a b. (Num a, Integral b) => a -> b -> a
^(Int
2::Int)
	  f2 :: a -> a
f2 = \a
x -> (a
x forall a. Num a => a -> a -> a
- a
mu2)forall a b. (Num a, Integral b) => a -> b -> a
^(Int
2::Int)