Skip to content

Commit 89137fc

Browse files
Deprecate varm and stdm (#736)
* Deprecate `varm` and `stdm` `varm` and `stdm` are redundant with `var(..., mean=m)` and `std(..., mean=m)`. Moreover, their status is not clear: they are technically exported by Statistics (but not by StatsBase itself), but their docstrings are not included in the manual. They were only tested indirectly, so add tests to ensure deprecations work. The status of `varm!` is even weirder as it's imported from Statistics, but Statistics does not export it, and it has no docstrings. Keep a deprecation just in case. * Adjust alignment in test/moments.jl Co-authored-by: Andreas Noack <[email protected]>
1 parent 9916e14 commit 89137fc

File tree

4 files changed

+43
-85
lines changed

4 files changed

+43
-85
lines changed

src/cov.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ cov(x::DenseMatrix, w::AbstractWeights, dims::Int=1; corrected::DepBool=nothing)
100100

101101
function corm(x::DenseMatrix, mean, w::AbstractWeights, vardim::Int=1)
102102
c = covm(x, mean, w, vardim; corrected=false)
103-
s = stdm(x, w, mean, vardim; corrected=false)
103+
s = std(x, w, vardim; mean=mean, corrected=false)
104104
cov2cor!(c, s)
105105
end
106106

src/deprecates.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,10 @@ end
3939
### Deprecated September 2019
4040
@deprecate sum(A::AbstractArray, w::AbstractWeights, dims::Int) sum(A, w, dims=dims)
4141
@deprecate values(wv::AbstractWeights) convert(Vector, wv)
42+
43+
### Deprecated November 2021
44+
@deprecate stdm(x::RealArray, w::AbstractWeights, m::Real; corrected::DepBool=nothing) std(x, w, mean=m, corrected=corrected) false
45+
@deprecate varm(x::RealArray, w::AbstractWeights, m::Real; corrected::DepBool=nothing) var(x, w, mean=m, corrected=corrected) false
46+
@deprecate stdm(x::RealArray, w::AbstractWeights, m::RealArray, dim::Int; corrected::DepBool=nothing) std(x, w, dim, mean=m, corrected=corrected) false
47+
@deprecate varm(x::RealArray, w::AbstractWeights, m::RealArray, dim::Int; corrected::DepBool=nothing) var(x, w, dim, mean=m, corrected=corrected) false
48+
@deprecate varm!(R::AbstractArray, x::RealArray, w::AbstractWeights, m::RealArray, dim::Int; corrected::DepBool=nothing) var!(R, x, w, dim, mean=m, corrected=corrected) false

src/moments.jl

Lines changed: 19 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,6 @@
11
##### Weighted var & std
22

33
## var
4-
"""
5-
varm(x::AbstractArray, w::AbstractWeights, m, [dim]; corrected=false)
6-
7-
Compute the variance of a real-valued array `x` with a known mean `m`, optionally
8-
over a dimension `dim`. Observations in `x` are weighted using weight vector `w`.
9-
The uncorrected (when `corrected=false`) sample variance is defined as:
10-
```math
11-
\\frac{1}{\\sum{w}} \\sum_{i=1}^n {w_i\\left({x_i - m}\\right)^2 }
12-
```
13-
where ``n`` is the length of the input. The unbiased estimate (when `corrected=true`) of
14-
the population variance is computed by replacing
15-
``\\frac{1}{\\sum{w}}`` with a factor dependent on the type of weights used:
16-
* `AnalyticWeights`: ``\\frac{1}{\\sum w - \\sum {w^2} / \\sum w}``
17-
* `FrequencyWeights`: ``\\frac{1}{\\sum{w} - 1}``
18-
* `ProbabilityWeights`: ``\\frac{n}{(n - 1) \\sum w}`` where ``n`` equals `count(!iszero, w)`
19-
* `Weights`: `ArgumentError` (bias correction not supported)
20-
"""
21-
varm(v::RealArray, w::AbstractWeights, m::Real; corrected::DepBool=nothing) =
22-
_moment2(v, w, m; corrected=depcheck(:varm, :corrected, corrected))
23-
244
"""
255
var(x::AbstractArray, w::AbstractWeights, [dim]; mean=nothing, corrected=false)
266
@@ -43,30 +23,22 @@ function var(v::RealArray, w::AbstractWeights; mean=nothing,
4323
corrected = depcheck(:var, :corrected, corrected)
4424

4525
if mean == nothing
46-
varm(v, w, Statistics.mean(v, w); corrected=corrected)
26+
_moment2(v, w, Statistics.mean(v, w); corrected=corrected)
4727
else
48-
varm(v, w, mean; corrected=corrected)
28+
_moment2(v, w, mean; corrected=corrected)
4929
end
5030
end
5131

5232
## var along dim
5333

54-
function varm!(R::AbstractArray, A::RealArray, w::AbstractWeights, M::RealArray,
55-
dim::Int; corrected::DepBool=nothing)
56-
corrected = depcheck(:varm!, :corrected, corrected)
57-
rmul!(_wsum_centralize!(R, abs2, A, convert(Vector, w), M, dim, true),
58-
varcorrection(w, corrected))
59-
end
60-
6134
function var!(R::AbstractArray, A::RealArray, w::AbstractWeights, dims::Int;
6235
mean=nothing, corrected::DepBool=nothing)
6336
corrected = depcheck(:var!, :corrected, corrected)
6437

6538
if mean == 0
66-
varm!(R, A, w, Base.reducedim_initarray(A, dims, 0, eltype(R)), dims;
67-
corrected=corrected)
68-
elseif mean == nothing
69-
varm!(R, A, w, Statistics.mean(A, w, dims=dims), dims; corrected=corrected)
39+
mean = Base.reducedim_initarray(A, dims, 0, eltype(R))
40+
elseif mean === nothing
41+
mean = Statistics.mean(A, w, dims=dims)
7042
else
7143
# check size of mean
7244
for i = 1:ndims(A)
@@ -78,15 +50,9 @@ function var!(R::AbstractArray, A::RealArray, w::AbstractWeights, dims::Int;
7850
dM == dA || throw(DimensionMismatch("Incorrect size of mean."))
7951
end
8052
end
81-
varm!(R, A, w, mean, dims; corrected=corrected)
8253
end
83-
end
84-
85-
function varm(A::RealArray, w::AbstractWeights, M::RealArray, dim::Int;
86-
corrected::DepBool=nothing)
87-
corrected = depcheck(:varm, :corrected, corrected)
88-
varm!(similar(A, Float64, Base.reduced_indices(axes(A), dim)), A, w, M,
89-
dim; corrected=corrected)
54+
return rmul!(_wsum_centralize!(R, abs2, A, convert(Vector, w), mean, dims, true),
55+
varcorrection(w, corrected))
9056
end
9157

9258
function var(A::RealArray, w::AbstractWeights, dim::Int; mean=nothing,
@@ -97,26 +63,6 @@ function var(A::RealArray, w::AbstractWeights, dim::Int; mean=nothing,
9763
end
9864

9965
## std
100-
"""
101-
stdm(x::AbstractArray, w::AbstractWeights, m, [dim]; corrected=false)
102-
103-
Compute the standard deviation of a real-valued array `x` with a known mean `m`,
104-
optionally over a dimension `dim`. Observations in `x` are weighted using weight vector `w`.
105-
The uncorrected (when `corrected=false`) sample standard deviation is defined as:
106-
```math
107-
\\sqrt{\\frac{1}{\\sum{w}} \\sum_{i=1}^n {w_i\\left({x_i - m}\\right)^2 }}
108-
```
109-
where ``n`` is the length of the input. The unbiased estimate (when `corrected=true`) of the
110-
population standard deviation is computed by replacing ``\\frac{1}{\\sum{w}}`` with a factor
111-
dependent on the type of weights used:
112-
* `AnalyticWeights`: ``\\frac{1}{\\sum w - \\sum {w^2} / \\sum w}``
113-
* `FrequencyWeights`: ``\\frac{1}{\\sum{w} - 1}``
114-
* `ProbabilityWeights`: ``\\frac{n}{(n - 1) \\sum w}`` where ``n`` equals `count(!iszero, w)`
115-
* `Weights`: `ArgumentError` (bias correction not supported)
116-
"""
117-
stdm(v::RealArray, w::AbstractWeights, m::Real; corrected::DepBool=nothing) =
118-
sqrt(varm(v, w, m, corrected=depcheck(:stdm, :corrected, corrected)))
119-
12066
"""
12167
std(x::AbstractArray, w::AbstractWeights, [dim]; mean=nothing, corrected=false)
12268
@@ -138,15 +84,8 @@ weights used:
13884
std(v::RealArray, w::AbstractWeights; mean=nothing, corrected::DepBool=nothing) =
13985
sqrt.(var(v, w; mean=mean, corrected=depcheck(:std, :corrected, corrected)))
14086

141-
stdm(v::RealArray, m::RealArray, dim::Int; corrected::DepBool=nothing) =
142-
sqrt!(varm(v, m, dims=dim, corrected=depcheck(:stdm, :corrected, corrected)))
143-
144-
stdm(v::RealArray, w::AbstractWeights, m::RealArray, dim::Int;
145-
corrected::DepBool=nothing) =
146-
sqrt.(varm(v, w, m, dim; corrected=depcheck(:stdm, :corrected, corrected)))
147-
148-
std(v::RealArray, w::AbstractWeights, dim::Int; mean=nothing,
149-
corrected::DepBool=nothing) =
87+
std(v::RealArray, w::AbstractWeights, dim::Int;
88+
mean=nothing, corrected::DepBool=nothing) =
15089
sqrt.(var(v, w, dim; mean=mean, corrected=depcheck(:std, :corrected, corrected)))
15190

15291
##### Fused statistics
@@ -161,7 +100,7 @@ See [`var`](@ref) documentation for more details.
161100
"""
162101
function mean_and_var(x; corrected::Bool=true)
163102
m = mean(x)
164-
v = varm(x, m; corrected=corrected)
103+
v = var(x, mean=m, corrected=corrected)
165104
m, v
166105
end
167106

@@ -177,44 +116,44 @@ See [`std`](@ref) documentation for more details.
177116
"""
178117
function mean_and_std(x; corrected::Bool=true)
179118
m = mean(x)
180-
s = stdm(x, m; corrected=corrected)
119+
s = std(x, mean=m, corrected=corrected)
181120
m, s
182121
end
183122

184123
function mean_and_var(x::RealArray, w::AbstractWeights; corrected::DepBool=nothing)
185124
m = mean(x, w)
186-
v = varm(x, w, m; corrected=depcheck(:mean_and_var, :corrected, corrected))
125+
v = var(x, w, mean=m, corrected=depcheck(:mean_and_var, :corrected, corrected))
187126
m, v
188127
end
189128
function mean_and_std(x::RealArray, w::AbstractWeights; corrected::DepBool=nothing)
190129
m = mean(x, w)
191-
s = stdm(x, w, m; corrected=depcheck(:mean_and_std, :corrected, corrected))
130+
s = std(x, w, mean=m, corrected=depcheck(:mean_and_std, :corrected, corrected))
192131
m, s
193132
end
194133

195134

196135
function mean_and_var(x::RealArray, dim::Int; corrected::Bool=true)
197-
m = mean(x, dims = dim)
198-
v = varm(x, m, dims = dim, corrected=corrected)
136+
m = mean(x, dims=dim)
137+
v = var(x, dims=dim, mean=m, corrected=corrected)
199138
m, v
200139
end
201140
function mean_and_std(x::RealArray, dim::Int; corrected::Bool=true)
202-
m = mean(x, dims = dim)
203-
s = stdm(x, m, dim; corrected=corrected)
141+
m = mean(x, dims=dim)
142+
s = std(x, dims=dim, mean=m, corrected=corrected)
204143
m, s
205144
end
206145

207146

208147
function mean_and_var(x::RealArray, w::AbstractWeights, dims::Int;
209148
corrected::DepBool=nothing)
210149
m = mean(x, w, dims=dims)
211-
v = varm(x, w, m, dims; corrected=depcheck(:mean_and_var, :corrected, corrected))
150+
v = var(x, w, dims, mean=m, corrected=depcheck(:mean_and_var, :corrected, corrected))
212151
m, v
213152
end
214153
function mean_and_std(x::RealArray, w::AbstractWeights, dims::Int;
215154
corrected::DepBool=nothing)
216155
m = mean(x, w, dims=dims)
217-
s = stdm(x, w, m, dims; corrected=depcheck(:mean_and_std, :corrected, corrected))
156+
s = std(x, w, dims, mean=m, corrected=depcheck(:mean_and_std, :corrected, corrected))
218157
m, s
219158
end
220159

test/moments.jl

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@ w = [3.84, 2.70, 8.29, 8.91, 9.71, 0.0]
2020
@testset "Variance" begin
2121
@test var(x, wv; corrected=false) expected_var
2222
@test var(x, wv; mean=m, corrected=false) expected_var
23+
@test varm(x, wv, m; corrected=false) expected_var
2324
end
2425

2526
@testset "Standard Deviation" begin
2627
@test std(x, wv; corrected=false) expected_std
2728
@test std(x, wv; mean=m, corrected=false) expected_std
29+
@test stdm(x, wv, m; corrected=false) expected_std
2830
end
2931

3032
@testset "Mean and Variance" begin
@@ -62,6 +64,7 @@ expected_std = sqrt.(expected_var)
6264
else
6365
@test var(x, wv; corrected=true) expected_var[i]
6466
@test var(x, wv; mean=m, corrected=true) expected_var[i]
67+
@test varm(x, wv, m; corrected=true) expected_var[i]
6568
end
6669
end
6770

@@ -71,6 +74,7 @@ expected_std = sqrt.(expected_var)
7174
else
7275
@test std(x, wv; corrected=true) expected_std[i]
7376
@test std(x, wv; mean=m, corrected=true) expected_std[i]
77+
@test stdm(x, wv, m; corrected=true) expected_std[i]
7478
end
7579
end
7680

@@ -119,17 +123,21 @@ w2 = [3.84, 2.70, 8.29, 8.91, 9.71, 0.0]
119123
expected_std2 = sqrt.(expected_var2)
120124

121125
@testset "Variance" begin
122-
@test var(x, wv1, 1; corrected=false) expected_var1
123-
@test var(x, wv2, 2; corrected=false) expected_var2
126+
@test var(x, wv1, 1; corrected=false) expected_var1
127+
@test var(x, wv2, 2; corrected=false) expected_var2
124128
@test var(x, wv1, 1; mean=m1, corrected=false) expected_var1
125129
@test var(x, wv2, 2; mean=m2, corrected=false) expected_var2
130+
@test varm(x, wv1, m1, 1; corrected=false) expected_var1
131+
@test varm(x, wv2, m2, 2; corrected=false) expected_var2
126132
end
127133

128134
@testset "Standard Deviation" begin
129135
@test std(x, wv1, 1; corrected=false) expected_std1
130136
@test std(x, wv2, 2; corrected=false) expected_std2
131137
@test std(x, wv1, 1; mean=m1, corrected=false) expected_std1
132138
@test std(x, wv2, 2; mean=m2, corrected=false) expected_std2
139+
@test stdm(x, wv1, m1, 1; corrected=false) expected_std1
140+
@test stdm(x, wv2, m2, 2; corrected=false) expected_std2
133141
end
134142

135143
@testset "Mean and Variance" begin
@@ -182,10 +190,12 @@ end
182190
if isa(wv1, Weights)
183191
@test_throws ArgumentError var(x, wv1, 1; corrected=true)
184192
else
185-
@test var(x, wv1, 1; corrected=true) expected_var1
186-
@test var(x, wv2, 2; corrected=true) expected_var2
193+
@test var(x, wv1, 1; corrected=true) expected_var1
194+
@test var(x, wv2, 2; corrected=true) expected_var2
187195
@test var(x, wv1, 1; mean=m1, corrected=true) expected_var1
188196
@test var(x, wv2, 2; mean=m2, corrected=true) expected_var2
197+
@test varm(x, wv1, m1, 1; corrected=true) expected_var1
198+
@test varm(x, wv2, m2, 2; corrected=true) expected_var2
189199
end
190200
end
191201

@@ -197,6 +207,8 @@ end
197207
@test std(x, wv2, 2; corrected=true) expected_std2
198208
@test std(x, wv1, 1; mean=m1, corrected=true) expected_std1
199209
@test std(x, wv2, 2; mean=m2, corrected=true) expected_std2
210+
@test stdm(x, wv1, m1, 1; corrected=true) expected_std1
211+
@test stdm(x, wv2, m2, 2; corrected=true) expected_std2
200212
end
201213
end
202214

0 commit comments

Comments
 (0)