README.md (6835B)
1 <!-- 2 3 @license Apache-2.0 4 5 Copyright (c) 2018 The Stdlib Authors. 6 7 Licensed under the Apache License, Version 2.0 (the "License"); 8 you may not use this file except in compliance with the License. 9 You may obtain a copy of the License at 10 11 http://www.apache.org/licenses/LICENSE-2.0 12 13 Unless required by applicable law or agreed to in writing, software 14 distributed under the License is distributed on an "AS IS" BASIS, 15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 See the License for the specific language governing permissions and 17 limitations under the License. 18 19 --> 20 21 # incrmvmr 22 23 > Compute a moving [variance-to-mean ratio][variance-to-mean-ratio] (VMR) incrementally. 24 25 <section class="intro"> 26 27 For a window of size `W`, the [unbiased sample variance][sample-variance] is defined as 28 29 <!-- <equation class="equation" label="eq:unbiased_sample_variance" align="center" raw="s^2 = \frac{1}{W-1} \sum_{i=0}^{W-1} ( x_i - \bar{x} )^2" alt="Equation for the unbiased sample variance."> --> 30 31 <div class="equation" align="center" data-raw-text="s^2 = \frac{1}{W-1} \sum_{i=0}^{W-1} ( x_i - \bar{x} )^2" data-equation="eq:unbiased_sample_variance"> 32 <img src="https://cdn.jsdelivr.net/gh/stdlib-js/stdlib@b331e5634fe726ff0e16e87814ac3f85d8164d31/lib/node_modules/@stdlib/stats/incr/mvmr/docs/img/equation_unbiased_sample_variance.svg" alt="Equation for the unbiased sample variance."> 33 <br> 34 </div> 35 36 <!-- </equation> --> 37 38 and the [arithmetic mean][arithmetic-mean] is defined as 39 40 <!-- <equation class="equation" label="eq:arithmetic_mean" align="center" raw="\bar{x} = \frac{1}{W} \sum_{i=0}^{W-1} x_i" alt="Equation for the arithmetic mean."> --> 41 42 <div class="equation" align="center" data-raw-text="\bar{x} = \frac{1}{W} \sum_{i=0}^{W-1} x_i" data-equation="eq:arithmetic_mean"> 43 <img src="https://cdn.jsdelivr.net/gh/stdlib-js/stdlib@164b8f1010c4535340eed9ad0b2af32c4a19863c/lib/node_modules/@stdlib/stats/incr/mvmr/docs/img/equation_arithmetic_mean.svg" alt="Equation for the arithmetic mean."> 44 <br> 45 </div> 46 47 <!-- </equation> --> 48 49 The [variance-to-mean ratio][variance-to-mean-ratio] (VMR) is thus defined as 50 51 <!-- <equation class="equation" label="eq:variance_to_mean_ratio" align="center" raw="F = \frac{s^2}{\bar{x}}" alt="Equation for the variance-to-mean ratio (VMR)."> --> 52 53 <div class="equation" align="center" data-raw-text="F = \frac{s^2}{\bar{x}}" data-equation="eq:variance_to_mean_ratio"> 54 <img src="https://cdn.jsdelivr.net/gh/stdlib-js/stdlib@b331e5634fe726ff0e16e87814ac3f85d8164d31/lib/node_modules/@stdlib/stats/incr/mvmr/docs/img/equation_variance_to_mean_ratio.svg" alt="Equation for the variance-to-mean ratio (VMR)."> 55 <br> 56 </div> 57 58 <!-- </equation> --> 59 60 </section> 61 62 <!-- /.intro --> 63 64 <section class="usage"> 65 66 ## Usage 67 68 ```javascript 69 var incrmvmr = require( '@stdlib/stats/incr/mvmr' ); 70 ``` 71 72 #### incrmvmr( window\[, mean] ) 73 74 Returns an accumulator `function` which incrementally computes a moving [variance-to-mean ratio][variance-to-mean-ratio]. The `window` parameter defines the number of values over which to compute the moving [variance-to-mean ratio][variance-to-mean-ratio]. 75 76 ```javascript 77 var accumulator = incrmvmr( 3 ); 78 ``` 79 80 If the mean is already known, provide a `mean` argument. 81 82 ```javascript 83 var accumulator = incrmvmr( 3, 5.0 ); 84 ``` 85 86 #### accumulator( \[x] ) 87 88 If provided an input value `x`, the accumulator function returns an updated accumulated value. If not provided an input value `x`, the accumulator function returns the current accumulated value. 89 90 ```javascript 91 var accumulator = incrmvmr( 3 ); 92 93 var F = accumulator(); 94 // returns null 95 96 // Fill the window... 97 F = accumulator( 2.0 ); // [2.0] 98 // returns 0.0 99 100 F = accumulator( 1.0 ); // [2.0, 1.0] 101 // returns ~0.33 102 103 F = accumulator( 3.0 ); // [2.0, 1.0, 3.0] 104 // returns 0.5 105 106 // Window begins sliding... 107 F = accumulator( 7.0 ); // [1.0, 3.0, 7.0] 108 // returns ~2.55 109 110 F = accumulator( 5.0 ); // [3.0, 7.0, 5.0] 111 // returns ~0.80 112 113 F = accumulator(); 114 // returns ~0.80 115 ``` 116 117 </section> 118 119 <!-- /.usage --> 120 121 <section class="notes"> 122 123 ## Notes 124 125 - Input values are **not** type checked. If provided `NaN` or a value which, when used in computations, results in `NaN`, the accumulated value is `NaN` for **at least** `W-1` future invocations. If non-numeric inputs are possible, you are advised to type check and handle accordingly **before** passing the value to the accumulator function. 126 127 - As `W` values are needed to fill the window buffer, the first `W-1` returned values are calculated from smaller sample sizes. Until the window is full, each returned value is calculated from all provided values. 128 129 - The following table summarizes how to interpret the [variance-to-mean ratio][variance-to-mean-ratio]: 130 131 | VMR | Description | Example Distribution | 132 | :---------------: | :-------------: | :--------------------------: | 133 | 0 | not dispersed | constant | 134 | 0 < VMR < 1 | under-dispersed | binomial | 135 | 1 | -- | Poisson | 136 | >1 | over-dispersed | geometric, negative-binomial | 137 138 Accordingly, one can use the [variance-to-mean ratio][variance-to-mean-ratio] to assess whether observed data can be modeled as a Poisson process. When observed data is "under-dispersed", observed data may be more regular than as would be the case for a Poisson process. When observed data is "over-dispersed", observed data may contain clusters (i.e., clumped, concentrated data). 139 140 - The [variance-to-mean ratio][variance-to-mean-ratio] is typically computed on nonnegative values. The measure may lack meaning for data which can assume both positive and negative values. 141 142 - The [variance-to-mean ratio][variance-to-mean-ratio] is also known as the **index of dispersion**, **dispersion index**, **coefficient of dispersion**, **relative variance**, and the [**Fano factor**][fano-factor]. 143 144 </section> 145 146 <!-- /.notes --> 147 148 <section class="examples"> 149 150 ## Examples 151 152 <!-- eslint no-undef: "error" --> 153 154 ```javascript 155 var randu = require( '@stdlib/random/base/randu' ); 156 var incrmvmr = require( '@stdlib/stats/incr/mvmr' ); 157 158 var accumulator; 159 var v; 160 var i; 161 162 // Initialize an accumulator: 163 accumulator = incrmvmr( 5 ); 164 165 // For each simulated datum, update the moving variance-to-mean ratio... 166 for ( i = 0; i < 100; i++ ) { 167 v = randu() * 100.0; 168 accumulator( v ); 169 } 170 console.log( accumulator() ); 171 ``` 172 173 </section> 174 175 <!-- /.examples --> 176 177 <section class="links"> 178 179 [variance-to-mean-ratio]: https://en.wikipedia.org/wiki/Index_of_dispersion 180 181 [arithmetic-mean]: https://en.wikipedia.org/wiki/Arithmetic_mean 182 183 [sample-variance]: https://en.wikipedia.org/wiki/Variance 184 185 [fano-factor]: https://en.wikipedia.org/wiki/Fano_factor 186 187 </section> 188 189 <!-- /.links -->