11using StatsBase
22using LinearAlgebra, Random, Test
3+ using SparseArrays
34
45struct EmptyCovarianceEstimator <: CovarianceEstimator end
56
7+ struct WrappedArray{T,N,A} <: AbstractArray{T,N}
8+ a:: A
9+ WrappedArray (a:: AbstractArray{T,N} ) where {T,N} = new {T,N,typeof(a)} (a)
10+ end
11+ Base. size (w:: WrappedArray ) = size (w. a)
12+ Base. getindex (w:: WrappedArray{T,N} , I:: Vararg{Int, N} ) where {T,N} = getindex (w. a, I... )
13+ Base. setindex! (w:: WrappedArray{T,N} , v, I:: Vararg{Int, N} ) where {T,N} = setindex! (w. a, v, I... )
14+
15+ ≈ ₙ (x,y) = isapprox (x, y; nans= true )
16+
617@testset " StatsBase.Covariance" begin
718weight_funcs = (weights, aweights, fweights, pweights)
19+ array = randn (3 , 8 )
20+ wrapped_array = WrappedArray (array)
21+ sparse_array = sprandn (3 , 8 , 0.2 )
822
9- @testset " $f " for f in weight_funcs
10- X = randn (3 , 8 )
23+ @testset " $f ,$(typeof (X)) " for f in weight_funcs, X in (array, wrapped_array, sparse_array)
1124
1225 Z1 = X .- mean (X, dims = 1 )
1326 Z2 = X .- mean (X, dims = 2 )
@@ -87,27 +100,32 @@ weight_funcs = (weights, aweights, fweights, pweights)
87100 @testset " Mean and covariance" begin
88101 (m, C) = mean_and_cov (X; corrected= false )
89102 @test m == mean (X, dims= 1 )
90- @test C == cov (X, dims= 1 , corrected= false )
103+ @test C ≈ cov (X, dims= 1 , corrected= false )
91104
92105 (m, C) = mean_and_cov (X, 1 ; corrected= false )
93106 @test m == mean (X, dims= 1 )
94- @test C == cov (X, dims= 1 , corrected = false )
107+ @test C ≈ cov (X, dims= 1 , corrected = false )
95108
96109 (m, C) = mean_and_cov (X, 2 ; corrected= false )
97110 @test m == mean (X, dims= 2 )
98- @test C == cov (X, dims= 2 , corrected = false )
111+ @test C ≈ cov (X, dims= 2 , corrected = false )
99112
100113 (m, C) = mean_and_cov (X, wv1; corrected= false )
101114 @test m == mean (X, wv1, dims= 1 )
102- @test C == cov (X, wv1, 1 , corrected= false )
115+ @test C ≈ cov (X, wv1, 1 , corrected= false )
103116
104117 (m, C) = mean_and_cov (X, wv1, 1 ; corrected= false )
105118 @test m == mean (X, wv1, dims= 1 )
106- @test C == cov (X, wv1, 1 , corrected= false )
119+ @test C ≈ cov (X, wv1, 1 , corrected= false )
107120
108121 (m, C) = mean_and_cov (X, wv2, 2 ; corrected= false )
109122 @test m == mean (X, wv2, dims= 2 )
110- @test C == cov (X, wv2, 2 , corrected= false )
123+ @test C ≈ cov (X, wv2, 2 , corrected= false )
124+
125+ v = collect (eachcol (X))
126+ (m, C) = mean_and_cov (v; corrected= false )
127+ @test m == mean (v)
128+ @test C ≈ cov (v, corrected= false )
111129 end
112130 @testset " Conversions" begin
113131 std1 = std (X, wv1, 1 ; corrected= false )
@@ -119,11 +137,12 @@ weight_funcs = (weights, aweights, fweights, pweights)
119137 cor1 = cor (X, wv1, 1 )
120138 cor2 = cor (X, wv2, 2 )
121139
140+
122141 @testset " cov2cor" begin
123- @test cov2cor (cov (X, dims = 1 ), std (X, dims = 1 )) ≈ cor (X, dims = 1 )
124- @test cov2cor (cov (X, dims = 2 ), std (X, dims = 2 )) ≈ cor (X, dims = 2 )
125- @test cov2cor (cov1, std1) ≈ cor1
126- @test cov2cor (cov2, std2) ≈ cor2
142+ @test cov2cor (cov (X, dims = 1 ), std (X, dims = 1 )) ≈ ₙ cor (X, dims = 1 )
143+ @test cov2cor (cov (X, dims = 2 ), std (X, dims = 2 )) ≈ ₙ cor (X, dims = 2 )
144+ @test cov2cor (cov1, std1) ≈ ₙ cor1
145+ @test cov2cor (cov2, std2) ≈ ₙ cor2
127146 end
128147 @testset " cor2cov" begin
129148 @test cor2cov (cor (X, dims = 1 ), std (X, dims = 1 )) ≈ cov (X, dims = 1 )
@@ -158,30 +177,30 @@ weight_funcs = (weights, aweights, fweights, pweights)
158177 @testset " Mean and covariance" begin
159178 (m, C) = mean_and_cov (X; corrected= true )
160179 @test m == mean (X, dims= 1 )
161- @test C == cov (X, dims= 1 , corrected = true )
180+ @test C ≈ cov (X, dims= 1 , corrected = true )
162181
163182 (m, C) = mean_and_cov (X, 1 ; corrected= true )
164183 @test m == mean (X, dims= 1 )
165- @test C == cov (X, dims= 1 , corrected = true )
184+ @test C ≈ cov (X, dims= 1 , corrected = true )
166185
167186 (m, C) = mean_and_cov (X, 2 ; corrected= true )
168187 @test m == mean (X, dims= 2 )
169- @test C == cov (X, dims= 2 , corrected = true )
188+ @test C ≈ cov (X, dims= 2 , corrected = true )
170189
171190 if isa (wv1, Weights)
172191 @test_throws ArgumentError mean_and_cov (X, wv1; corrected= true )
173192 else
174193 (m, C) = mean_and_cov (X, wv1; corrected= true )
175194 @test m == mean (X, wv1, dims= 1 )
176- @test C == cov (X, wv1, 1 ; corrected= true )
195+ @test C ≈ cov (X, wv1, 1 ; corrected= true )
177196
178197 (m, C) = mean_and_cov (X, wv1, 1 ; corrected= true )
179198 @test m == mean (X, wv1, dims= 1 )
180- @test C == cov (X, wv1, 1 ; corrected= true )
199+ @test C ≈ cov (X, wv1, 1 ; corrected= true )
181200
182201 (m, C) = mean_and_cov (X, wv2, 2 ; corrected= true )
183202 @test m == mean (X, wv2, dims= 2 )
184- @test C == cov (X, wv2, 2 ; corrected= true )
203+ @test C ≈ cov (X, wv2, 2 ; corrected= true )
185204 end
186205 end
187206 @testset " Conversions" begin
@@ -196,25 +215,26 @@ weight_funcs = (weights, aweights, fweights, pweights)
196215 cor2 = cor (X, wv2, 2 )
197216
198217 @testset " cov2cor" begin
199- @test cov2cor (cov (X, dims = 1 ), std (X, dims = 1 )) ≈ cor (X, dims = 1 )
200- @test cov2cor (cov (X, dims = 2 ), std (X, dims = 2 )) ≈ cor (X, dims = 2 )
201- @test cov2cor (cov1, std1) ≈ cor1
202- @test cov2cor (cov2, std2) ≈ cor2
218+ @test cov2cor (cov (X, dims = 1 ), std (X, dims = 1 )) ≈ ₙ cor (X, dims = 1 )
219+ @test cov2cor (cov (X, dims = 2 ), std (X, dims = 2 )) ≈ ₙ cor (X, dims = 2 )
220+ @test cov2cor (cov1, std1) ≈ ₙ cor1
221+ @test cov2cor (cov2, std2) ≈ ₙ cor2
203222 end
204223
205224 @testset " cov2cor!" begin
206225 tmp_cov1 = copy (cov1)
207- @test ! (tmp_cov1 ≈ cor1)
226+ @test ! (tmp_cov1 ≈ ₙ cor1)
208227 StatsBase. cov2cor! (tmp_cov1, std1)
209- @test tmp_cov1 ≈ cor1
228+ @test tmp_cov1 ≈ ₙ cor1
210229
211230 tmp_cov2 = copy (cov2)
212- @test ! (tmp_cov2 ≈ cor2)
231+ @test ! (tmp_cov2 ≈ ₙ cor2)
213232 StatsBase. cov2cor! (tmp_cov2, std2)
214- @test tmp_cov2 ≈ cor2
233+ @test tmp_cov2 ≈ ₙ cor2
215234 end
216235
217236 @testset " cor2cov" begin
237+
218238 @test cor2cov (cor (X, dims = 1 ), std (X, dims = 1 )) ≈ cov (X, dims = 1 )
219239 @test cor2cov (cor (X, dims = 2 ), std (X, dims = 2 )) ≈ cov (X, dims = 2 )
220240 @test cor2cov (cor1, std1) ≈ cov1
@@ -237,8 +257,8 @@ weight_funcs = (weights, aweights, fweights, pweights)
237257 end
238258
239259 @testset " Correlation" begin
240- @test cor (X, f (ones (3 )), 1 ) ≈ cor (X, dims = 1 )
241- @test cor (X, f (ones (8 )), 2 ) ≈ cor (X, dims = 2 )
260+ @test cor (X, f (ones (3 )), 1 ) ≈ ₙ cor (X, dims = 1 )
261+ @test cor (X, f (ones (8 )), 2 ) ≈ ₙ cor (X, dims = 2 )
242262
243263 cov1 = cov (X, wv1, 1 ; corrected= false )
244264 std1 = std (X, wv1, 1 ; corrected= false )
@@ -247,8 +267,8 @@ weight_funcs = (weights, aweights, fweights, pweights)
247267 expected_cor1 = StatsBase. cov2cor! (cov1, std1)
248268 expected_cor2 = StatsBase. cov2cor! (cov2, std2)
249269
250- @test cor (X, wv1, 1 ) ≈ expected_cor1
251- @test cor (X, wv2, 2 ) ≈ expected_cor2
270+ @test cor (X, wv1, 1 ) ≈ ₙ expected_cor1
271+ @test cor (X, wv2, 2 ) ≈ ₙ expected_cor2
252272 end
253273
254274 @testset " Abstract covariance estimation" begin
0 commit comments