1
1
# #### Weighted var & std
2
2
3
3
# # 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
-
24
4
"""
25
5
var(x::AbstractArray, w::AbstractWeights, [dim]; mean=nothing, corrected=false)
26
6
@@ -43,30 +23,22 @@ function var(v::RealArray, w::AbstractWeights; mean=nothing,
43
23
corrected = depcheck (:var , :corrected , corrected)
44
24
45
25
if mean == nothing
46
- varm (v, w, Statistics. mean (v, w); corrected= corrected)
26
+ _moment2 (v, w, Statistics. mean (v, w); corrected= corrected)
47
27
else
48
- varm (v, w, mean; corrected= corrected)
28
+ _moment2 (v, w, mean; corrected= corrected)
49
29
end
50
30
end
51
31
52
32
# # var along dim
53
33
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
-
61
34
function var! (R:: AbstractArray , A:: RealArray , w:: AbstractWeights , dims:: Int ;
62
35
mean= nothing , corrected:: DepBool = nothing )
63
36
corrected = depcheck (:var! , :corrected , corrected)
64
37
65
38
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)
70
42
else
71
43
# check size of mean
72
44
for i = 1 : ndims (A)
@@ -78,15 +50,9 @@ function var!(R::AbstractArray, A::RealArray, w::AbstractWeights, dims::Int;
78
50
dM == dA || throw (DimensionMismatch (" Incorrect size of mean." ))
79
51
end
80
52
end
81
- varm! (R, A, w, mean, dims; corrected= corrected)
82
53
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))
90
56
end
91
57
92
58
function var (A:: RealArray , w:: AbstractWeights , dim:: Int ; mean= nothing ,
@@ -97,26 +63,6 @@ function var(A::RealArray, w::AbstractWeights, dim::Int; mean=nothing,
97
63
end
98
64
99
65
# # 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
-
120
66
"""
121
67
std(x::AbstractArray, w::AbstractWeights, [dim]; mean=nothing, corrected=false)
122
68
@@ -138,15 +84,8 @@ weights used:
138
84
std (v:: RealArray , w:: AbstractWeights ; mean= nothing , corrected:: DepBool = nothing ) =
139
85
sqrt .(var (v, w; mean= mean, corrected= depcheck (:std , :corrected , corrected)))
140
86
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 ) =
150
89
sqrt .(var (v, w, dim; mean= mean, corrected= depcheck (:std , :corrected , corrected)))
151
90
152
91
# #### Fused statistics
@@ -161,7 +100,7 @@ See [`var`](@ref) documentation for more details.
161
100
"""
162
101
function mean_and_var (x; corrected:: Bool = true )
163
102
m = mean (x)
164
- v = varm (x, m; corrected= corrected)
103
+ v = var (x, mean = m, corrected= corrected)
165
104
m, v
166
105
end
167
106
@@ -177,44 +116,44 @@ See [`std`](@ref) documentation for more details.
177
116
"""
178
117
function mean_and_std (x; corrected:: Bool = true )
179
118
m = mean (x)
180
- s = stdm (x, m; corrected= corrected)
119
+ s = std (x, mean = m, corrected= corrected)
181
120
m, s
182
121
end
183
122
184
123
function mean_and_var (x:: RealArray , w:: AbstractWeights ; corrected:: DepBool = nothing )
185
124
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))
187
126
m, v
188
127
end
189
128
function mean_and_std (x:: RealArray , w:: AbstractWeights ; corrected:: DepBool = nothing )
190
129
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))
192
131
m, s
193
132
end
194
133
195
134
196
135
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)
199
138
m, v
200
139
end
201
140
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)
204
143
m, s
205
144
end
206
145
207
146
208
147
function mean_and_var (x:: RealArray , w:: AbstractWeights , dims:: Int ;
209
148
corrected:: DepBool = nothing )
210
149
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))
212
151
m, v
213
152
end
214
153
function mean_and_std (x:: RealArray , w:: AbstractWeights , dims:: Int ;
215
154
corrected:: DepBool = nothing )
216
155
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))
218
157
m, s
219
158
end
220
159
0 commit comments