@@ -255,8 +255,9 @@ function linear_shrinkage(::DiagonalUnitVariance, Xc::AbstractMatrix,
255255 corrected:: Bool )
256256
257257 F = I
258+ T = float (eltype (S))
258259 κ = n - Int (corrected)
259- γ = κ/ n
260+ γ = T ( κ/ n)
260261 Xc² = Xc.^ 2
261262 # computing the shrinkage
262263 if λ ∈ [:auto , :lw ]
@@ -265,15 +266,15 @@ function linear_shrinkage(::DiagonalUnitVariance, Xc::AbstractMatrix,
265266 λ /= κ * (ΣS² - 2 tr (S) + p)
266267 elseif λ == :ss
267268 # use the standardised data matrix
268- d = 1.0 ./ vec (sum (Xc², dims= 1 ))
269+ d = one (T) ./ vec (sum (Xc², dims= 1 ))
269270 S̄ = rescale (S, sqrt .(d)) # this has diagonal 1/κ
270271 ΣS̄² = sumij2 (S̄, with_diag= true )
271272 λ = sumij (rescale! (uccov (Xc²), d), with_diag= true ) / γ^ 2 - ΣS̄²
272- λ /= κ * ΣS̄² - p / κ
273+ λ /= T ( κ * ΣS̄² - p / κ)
273274 else
274275 throw (ArgumentError (" Unsupported shrinkage method for target DiagonalUnitVariance: $λ ." ))
275276 end
276- λ = clamp (λ, 0.0 , 1.0 )
277+ λ = clamp (λ, zero (T), one (T) )
277278 return linshrink (F, S, λ)
278279end
279280
@@ -298,8 +299,9 @@ function linear_shrinkage(::DiagonalCommonVariance, Xc::AbstractMatrix,
298299 corrected:: Bool )
299300
300301 F = target_B (S, p)
302+ T = float (eltype (F))
301303 κ = n - Int (corrected)
302- γ = κ/ n
304+ γ = T ( κ/ n)
303305 Xc² = Xc.^ 2
304306 # computing the shrinkage
305307 if λ ∈ [:auto , :lw ]
@@ -309,28 +311,28 @@ function linear_shrinkage(::DiagonalCommonVariance, Xc::AbstractMatrix,
309311 λ /= κ * (ΣS² - p* v^ 2 )
310312 elseif λ == :ss
311313 # use the standardised data matrix
312- d = 1.0 ./ vec (sum (Xc², dims= 1 ))
314+ d = one (T) ./ vec (sum (Xc², dims= 1 ))
313315 S̄ = rescale (S, sqrt .(d)) # this has diagonal 1/κ
314316 v̄ = κ # tr(S̄)/p
315317 ΣS̄² = sumij2 (S̄, with_diag= true )
316318 λ = sumij (rescale! (uccov (Xc²), d), with_diag= true ) / γ^ 2 - ΣS̄²
317- λ /= κ * ΣS̄² - p/ κ
319+ λ /= T ( κ * ΣS̄² - p/ κ)
318320 elseif λ == :rblw
319321 # https://arxiv.org/pdf/0907.4698.pdf equations 17, 19
320322 trS² = sum (abs2, S)
321323 tr²S = tr (S)^ 2
322324 # note: using corrected or uncorrected S does not change λ
323- λ = (( n- 2 )/ n * trS² + tr²S) / ((n+ 2 ) * (trS² - tr²S/ p))
325+ λ = T ((( n- 2 )/ n * trS² + tr²S) / ((n+ 2 ) * (trS² - tr²S/ p) ))
324326 elseif λ == :oas
325327 # https://arxiv.org/pdf/0907.4698.pdf equation 23
326328 trS² = sum (abs2, S)
327329 tr²S = tr (S)^ 2
328330 # note: using corrected or uncorrected S does not change λ
329- λ = ((1.0 - 2.0 / p) * trS² + tr²S) / ((n+ 1.0 - 2.0 / p) * (trS² - tr²S/ p))
331+ λ = ((one (T) - T ( 2.0 ) / p) * trS² + tr²S) / ((n+ one (T) - T ( 2.0 ) / p) * (trS² - tr²S/ p))
330332 else
331333 throw (ArgumentError (" Unsupported shrinkage method for target DiagonalCommonVariance: $λ ." ))
332334 end
333- λ = clamp (λ, 0.0 , 1.0 )
335+ λ = clamp (λ, zero (T), one (T) )
334336 return linshrink (F, S, λ)
335337end
336338
@@ -355,8 +357,9 @@ function linear_shrinkage(::DiagonalUnequalVariance, Xc::AbstractMatrix,
355357 corrected:: Bool )
356358
357359 F = target_D (S)
360+ T = float (eltype (F))
358361 κ = n - Int (corrected)
359- γ = κ / n
362+ γ = T (κ / n)
360363 Xc² = Xc.^ 2
361364 # computing the shrinkage
362365 if λ ∈ [:auto , :lw ]
@@ -365,14 +368,14 @@ function linear_shrinkage(::DiagonalUnequalVariance, Xc::AbstractMatrix,
365368 λ /= κ * ΣS²
366369 elseif λ == :ss
367370 # use the standardised data matrix
368- d = 1.0 ./ vec (sum (Xc², dims= 1 ))
371+ d = one (T) ./ vec (sum (Xc², dims= 1 ))
369372 ΣS̄² = sumij2 (rescale (S, sqrt .(d)))
370373 λ = sumij (rescale! (uccov (Xc²), d)) / γ^ 2 - ΣS̄²
371374 λ /= κ * ΣS̄²
372375 else
373376 throw (ArgumentError (" Unsupported shrinkage method for target DiagonalUnequalVariance: $λ ." ))
374377 end
375- λ = clamp (λ, 0.0 , 1.0 )
378+ λ = clamp (λ, zero (T), one (T) )
376379 return linshrink (F, S, λ)
377380end
378381
@@ -405,24 +408,25 @@ function linear_shrinkage(::CommonCovariance, Xc::AbstractMatrix,
405408 corrected:: Bool )
406409
407410 F, v, c = target_C (S, p)
411+ T = float (eltype (F))
408412 κ = n - Int (corrected)
409- γ = κ/ n
413+ γ = T ( κ/ n)
410414 Xc² = Xc.^ 2
411415 # computing the shrinkage
412416 if λ ∈ [:auto , :lw ]
413417 ΣS² = sumij2 (S, with_diag= true )
414418 λ = sumij (uccov (Xc²), with_diag= true ) / γ^ 2 - ΣS²
415419 λ /= κ * (ΣS² - p* (p- 1 )* c^ 2 - p* v^ 2 )
416420 elseif λ == :ss
417- d = 1.0 ./ vec (sum (Xc², dims= 1 ))
421+ d = one (T) ./ vec (sum (Xc², dims= 1 ))
418422 S̄ = rescale (S, sqrt .(d))
419423 ΣS̄² = sumij2 (S̄, with_diag= true )
420424 λ = sumij (rescale! (uccov (Xc²), d), with_diag= true ) / γ^ 2 - ΣS̄²
421425 λ /= κ * ΣS̄² - p/ κ - κ * sumij (S̄; with_diag= false )^ 2 / (p * (p - 1 ))
422426 else
423427 throw (ArgumentError (" Unsupported shrinkage method for target CommonCovariance: $λ ." ))
424428 end
425- λ = clamp (λ, 0.0 , 1.0 )
429+ λ = clamp (λ, zero (T), one (T) )
426430 return linshrink! (F, S, λ)
427431end
428432
@@ -451,8 +455,9 @@ function linear_shrinkage(::PerfectPositiveCorrelation, Xc::AbstractMatrix,
451455 corrected:: Bool )
452456
453457 F = target_E (S)
458+ T = float (eltype (F))
454459 κ = n - Int (corrected)
455- γ = κ/ n
460+ γ = T ( κ/ n)
456461 Xc² = Xc.^ 2
457462 # computing the shrinkage
458463 if λ ∈ [:auto , :lw ]
@@ -461,7 +466,7 @@ function linear_shrinkage(::PerfectPositiveCorrelation, Xc::AbstractMatrix,
461466 λ -= sum_fij (Xc, S, n, κ)
462467 λ /= sumij2 (S - F)
463468 elseif λ == :ss
464- d = 1.0 ./ vec (sum (Xc², dims= 1 ))
469+ d = one (T) ./ vec (sum (Xc², dims= 1 ))
465470 s = sqrt .(d)
466471 S̄ = rescale (S, s)
467472 ΣS̄² = sumij2 (S̄)
@@ -472,7 +477,7 @@ function linear_shrinkage(::PerfectPositiveCorrelation, Xc::AbstractMatrix,
472477 else
473478 throw (ArgumentError (" Unsupported shrinkage method for target PerfectPositiveCorrelation: $λ ." ))
474479 end
475- λ = clamp (λ, 0.0 , 1.0 )
480+ λ = clamp (λ, zero (T), one (T) )
476481 return linshrink! (F, S, λ)
477482end
478483
@@ -505,8 +510,9 @@ function linear_shrinkage(::ConstantCorrelation, Xc::AbstractMatrix,
505510 corrected:: Bool )
506511
507512 F, r̄ = target_F (S, p)
513+ T = float (eltype (F))
508514 κ = n - Int (corrected)
509- γ = κ/ n
515+ γ = T ( κ/ n)
510516 Xc² = Xc.^ 2
511517 # computing the shrinkage
512518 if λ ∈ [:auto , :lw ]
@@ -515,7 +521,7 @@ function linear_shrinkage(::ConstantCorrelation, Xc::AbstractMatrix,
515521 λ -= r̄ * sum_fij (Xc, S, n, κ)
516522 λ /= sumij2 (S - F)
517523 elseif λ == :ss
518- d = 1.0 ./ vec (sum (Xc², dims= 1 ))
524+ d = one (T) ./ vec (sum (Xc², dims= 1 ))
519525 s = sqrt .(d)
520526 S̄ = rescale (S, s)
521527 F̄, r̄ = target_F (S̄, p)
@@ -526,6 +532,6 @@ function linear_shrinkage(::ConstantCorrelation, Xc::AbstractMatrix,
526532 else
527533 throw (ArgumentError (" Unsupported shrinkage method for target ConstantCorrelation: $λ ." ))
528534 end
529- λ = clamp (λ, 0.0 , 1.0 )
535+ λ = clamp (λ, zero (T), one (T) )
530536 return linshrink! (F, S, λ)
531537end
0 commit comments