1
1
using StatsBase
2
2
using LinearAlgebra, Random, Test
3
+ using SparseArrays
3
4
4
5
struct EmptyCovarianceEstimator <: CovarianceEstimator end
5
6
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
+
6
17
@testset " StatsBase.Covariance" begin
7
18
weight_funcs = (weights, aweights, fweights, pweights)
19
+ array = randn (3 , 8 )
20
+ wrapped_array = WrappedArray (array)
21
+ sparse_array = sprandn (3 , 8 , 0.2 )
8
22
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)
11
24
12
25
Z1 = X .- mean (X, dims = 1 )
13
26
Z2 = X .- mean (X, dims = 2 )
@@ -87,27 +100,32 @@ weight_funcs = (weights, aweights, fweights, pweights)
87
100
@testset " Mean and covariance" begin
88
101
(m, C) = mean_and_cov (X; corrected= false )
89
102
@test m == mean (X, dims= 1 )
90
- @test C == cov (X, dims= 1 , corrected= false )
103
+ @test C ≈ cov (X, dims= 1 , corrected= false )
91
104
92
105
(m, C) = mean_and_cov (X, 1 ; corrected= false )
93
106
@test m == mean (X, dims= 1 )
94
- @test C == cov (X, dims= 1 , corrected = false )
107
+ @test C ≈ cov (X, dims= 1 , corrected = false )
95
108
96
109
(m, C) = mean_and_cov (X, 2 ; corrected= false )
97
110
@test m == mean (X, dims= 2 )
98
- @test C == cov (X, dims= 2 , corrected = false )
111
+ @test C ≈ cov (X, dims= 2 , corrected = false )
99
112
100
113
(m, C) = mean_and_cov (X, wv1; corrected= false )
101
114
@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 )
103
116
104
117
(m, C) = mean_and_cov (X, wv1, 1 ; corrected= false )
105
118
@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 )
107
120
108
121
(m, C) = mean_and_cov (X, wv2, 2 ; corrected= false )
109
122
@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 )
111
129
end
112
130
@testset " Conversions" begin
113
131
std1 = std (X, wv1, 1 ; corrected= false )
@@ -119,11 +137,12 @@ weight_funcs = (weights, aweights, fweights, pweights)
119
137
cor1 = cor (X, wv1, 1 )
120
138
cor2 = cor (X, wv2, 2 )
121
139
140
+
122
141
@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
127
146
end
128
147
@testset " cor2cov" begin
129
148
@test cor2cov (cor (X, dims = 1 ), std (X, dims = 1 )) ≈ cov (X, dims = 1 )
@@ -158,30 +177,30 @@ weight_funcs = (weights, aweights, fweights, pweights)
158
177
@testset " Mean and covariance" begin
159
178
(m, C) = mean_and_cov (X; corrected= true )
160
179
@test m == mean (X, dims= 1 )
161
- @test C == cov (X, dims= 1 , corrected = true )
180
+ @test C ≈ cov (X, dims= 1 , corrected = true )
162
181
163
182
(m, C) = mean_and_cov (X, 1 ; corrected= true )
164
183
@test m == mean (X, dims= 1 )
165
- @test C == cov (X, dims= 1 , corrected = true )
184
+ @test C ≈ cov (X, dims= 1 , corrected = true )
166
185
167
186
(m, C) = mean_and_cov (X, 2 ; corrected= true )
168
187
@test m == mean (X, dims= 2 )
169
- @test C == cov (X, dims= 2 , corrected = true )
188
+ @test C ≈ cov (X, dims= 2 , corrected = true )
170
189
171
190
if isa (wv1, Weights)
172
191
@test_throws ArgumentError mean_and_cov (X, wv1; corrected= true )
173
192
else
174
193
(m, C) = mean_and_cov (X, wv1; corrected= true )
175
194
@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 )
177
196
178
197
(m, C) = mean_and_cov (X, wv1, 1 ; corrected= true )
179
198
@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 )
181
200
182
201
(m, C) = mean_and_cov (X, wv2, 2 ; corrected= true )
183
202
@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 )
185
204
end
186
205
end
187
206
@testset " Conversions" begin
@@ -196,25 +215,26 @@ weight_funcs = (weights, aweights, fweights, pweights)
196
215
cor2 = cor (X, wv2, 2 )
197
216
198
217
@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
203
222
end
204
223
205
224
@testset " cov2cor!" begin
206
225
tmp_cov1 = copy (cov1)
207
- @test ! (tmp_cov1 ≈ cor1)
226
+ @test ! (tmp_cov1 ≈ ₙ cor1)
208
227
StatsBase. cov2cor! (tmp_cov1, std1)
209
- @test tmp_cov1 ≈ cor1
228
+ @test tmp_cov1 ≈ ₙ cor1
210
229
211
230
tmp_cov2 = copy (cov2)
212
- @test ! (tmp_cov2 ≈ cor2)
231
+ @test ! (tmp_cov2 ≈ ₙ cor2)
213
232
StatsBase. cov2cor! (tmp_cov2, std2)
214
- @test tmp_cov2 ≈ cor2
233
+ @test tmp_cov2 ≈ ₙ cor2
215
234
end
216
235
217
236
@testset " cor2cov" begin
237
+
218
238
@test cor2cov (cor (X, dims = 1 ), std (X, dims = 1 )) ≈ cov (X, dims = 1 )
219
239
@test cor2cov (cor (X, dims = 2 ), std (X, dims = 2 )) ≈ cov (X, dims = 2 )
220
240
@test cor2cov (cor1, std1) ≈ cov1
@@ -237,8 +257,8 @@ weight_funcs = (weights, aweights, fweights, pweights)
237
257
end
238
258
239
259
@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 )
242
262
243
263
cov1 = cov (X, wv1, 1 ; corrected= false )
244
264
std1 = std (X, wv1, 1 ; corrected= false )
@@ -247,8 +267,8 @@ weight_funcs = (weights, aweights, fweights, pweights)
247
267
expected_cor1 = StatsBase. cov2cor! (cov1, std1)
248
268
expected_cor2 = StatsBase. cov2cor! (cov2, std2)
249
269
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
252
272
end
253
273
254
274
@testset " Abstract covariance estimation" begin
0 commit comments