module Statistics.Covariance.RaoBlackwellLedoitWolf
( raoBlackwellLedoitWolf,
)
where
import qualified Numeric.LinearAlgebra as L
import Statistics.Covariance.Internal.Tools
raoBlackwellLedoitWolf ::
L.Matrix Double ->
Either String (L.Herm Double)
raoBlackwellLedoitWolf :: Matrix Double -> Either String (Herm Double)
raoBlackwellLedoitWolf Matrix Double
xs
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
2 = String -> Either String (Herm Double)
forall a b. a -> Either a b
Left String
"raoBlackwellLedoitWolf: Need more than one sample."
| Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
1 = String -> Either String (Herm Double)
forall a b. a -> Either a b
Left String
"raoBlackwellLedoitWolf: Need at least one parameter."
| Bool
otherwise = Herm Double -> Either String (Herm Double)
forall a b. b -> Either a b
Right (Herm Double -> Either String (Herm Double))
-> Herm Double -> Either String (Herm Double)
forall a b. (a -> b) -> a -> b
$ Double -> Herm Double -> Double -> Herm Double -> Herm Double
shrinkWith Double
rho Herm Double
sigma Double
mu Herm Double
im
where
n :: Int
n = Matrix Double -> Int
forall t. Matrix t -> Int
L.rows Matrix Double
xs
p :: Int
p = Matrix Double -> Int
forall t. Matrix t -> Int
L.cols Matrix Double
xs
(Vector Double
_, Herm Double
sigma) = Matrix Double -> (Vector Double, Herm Double)
L.meanCov Matrix Double
xs
im :: Herm Double
im = Matrix Double -> Herm Double
forall t. Matrix t -> Herm t
L.trustSym (Matrix Double -> Herm Double) -> Matrix Double -> Herm Double
forall a b. (a -> b) -> a -> b
$ Int -> Matrix Double
forall a. (Num a, Element a) => Int -> Matrix a
L.ident Int
p
trS :: Double
trS = Matrix Double -> Double
trace (Matrix Double -> Double) -> Matrix Double -> Double
forall a b. (a -> b) -> a -> b
$ Herm Double -> Matrix Double
forall t. Herm t -> Matrix t
L.unSym Herm Double
sigma
tr2S :: Double
tr2S = Double
trS Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
trS
s2 :: Matrix Double
s2 = let s :: Matrix Double
s = Herm Double -> Matrix Double
forall t. Herm t -> Matrix t
L.unSym Herm Double
sigma in Matrix Double
s Matrix Double -> Matrix Double -> Matrix Double
forall t. Numeric t => Matrix t -> Matrix t -> Matrix t
L.<> Matrix Double
s
trS2 :: Double
trS2 = Matrix Double -> Double
trace Matrix Double
s2
n' :: Double
n' = Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n
p' :: Double
p' = Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
p
rhoNominator :: Double
rhoNominator = ((Double
n' Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
2) Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
n') Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
trS2 Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
tr2S
rhoDenominator :: Double
rhoDenominator = (Double
n' Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
2) Double -> Double -> Double
forall a. Num a => a -> a -> a
* (Double
trS2 Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double -> Double
forall a. Fractional a => a -> a
recip Double
p' Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
tr2S)
rho' :: Double
rho' = Double
rhoNominator Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
rhoDenominator
rho :: Double
rho = Double -> Double -> Double
forall a. Ord a => a -> a -> a
min Double
rho' Double
1.0
mu :: Double
mu = Double
trS Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
p'