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
5030end
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-
6134function 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))
9056end
9157
9258function var (A:: RealArray , w:: AbstractWeights , dim:: Int ; mean= nothing ,
@@ -97,26 +63,6 @@ function var(A::RealArray, w::AbstractWeights, dim::Int; mean=nothing,
9763end
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:
13884std (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"""
162101function 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
166105end
167106
@@ -177,44 +116,44 @@ See [`std`](@ref) documentation for more details.
177116"""
178117function 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
182121end
183122
184123function 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
188127end
189128function 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
193132end
194133
195134
196135function 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
200139end
201140function 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
205144end
206145
207146
208147function 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
213152end
214153function 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
219158end
220159
0 commit comments