packages feed

covariance-0.1.0.6: src/Statistics/Covariance/Internal/Tools.hs

-- |
-- Module      :  Statistics.Covariance.Internal.Tools
-- Description :  Common functions
-- Copyright   :  (c) 2021 Dominik Schrempf
-- License     :  GPL-3.0-or-later
--
-- Maintainer  :  dominik.schrempf@gmail.com
-- Stability   :  experimental
-- Portability :  portable
--
-- Creation date: Fri Sep 10 09:47:00 2021.
module Statistics.Covariance.Internal.Tools
  ( centerWith,
    shrinkWith,
    trace,
  )
where

import qualified Data.Vector.Storable as VS
import qualified Numeric.LinearAlgebra as L
import qualified Numeric.LinearAlgebra.Devel as L

centerWith ::
  -- Mean vector of dimension P.
  L.Vector Double ->
  -- Data matrix of dimension N x P.
  L.Matrix Double ->
  -- Data matrix with means 0.
  L.Matrix Double
centerWith ms = L.mapMatrixWithIndex (\(_, j) x -> x - ms VS.! j)

-- Shrinkage a covariance matrix.
shrinkWith ::
  -- Shrinkage factor.
  Double ->
  -- Sample covariance matrix.
  L.Herm Double ->
  -- Scale of identity matrix (trace of sample covariance matrix divided by
  -- dimension). See Chen2010b, Equation 3.
  Double ->
  -- Identity matrix.
  L.Herm Double ->
  L.Herm Double
shrinkWith rho sigma mu im
  | rho < 0.0 = error "shrinkWith: Bug! Shrinkage factor is negative."
  | rho > 1.0 = error "shrinkWith: Bug! Shrinkage factor is larger than 1.0."
  | mu < 0.0 = error "shrinkWith: Bug! Scaling factor of identity matrix is negative."
  | rho == 1.0 = L.trustSym $ L.scale mu (L.unSym im)
  | otherwise =
      L.trustSym $
        L.scale (1.0 - rho) (L.unSym sigma)
          + L.scale (rho * mu) (L.unSym im)

-- Trace of a matrix.
trace :: L.Matrix Double -> Double
trace = L.sumElements . L.takeDiag