time-to-botec/squiggle/node_modules/jstat/doc/md/overview.md
NunoSempere b6addc7f05 feat: add the node modules
Necessary in order to clearly see the squiggle hotwiring.
2022-12-03 12:44:49 +00:00

66 lines
2.6 KiB
Markdown

## Overview
### Description
jStat is a statistical library written in JavaScript that allows you to perform advanced statistical operations without the need of a dedicated statistical language (e.g. MATLAB or R). It is available for download on [Github](http://github.com/jstat/jstat).
### Architecture
Calculations are done by *static methods*, while working with groups of numbers is handled by the *instance methods*.
Here is a pseudo example of what is happening in `core.js`:
jStat.min = function( arr ) {
return Math.min.apply( null, arr );
}
jStat.prototype.min = function() {
var i = 0,
newval = [];
while( newval.push( jStat.min( this[i] )), ++i < this.length );
return newval;
}
`jStat.min` does the actual calculation on the array, while `jStat.prototype.min` is a wrapper to help work with the jStat object.
The reason for this approach is to allow for maxium flexibility to other developers who want to extend jStat, while allowing for easy creation of wrappers.
This way extending jStat requires minimal performance overhead and allows for more unique wrappers to be created.
**Remember: Static methods almost always return native JavaScript types. Instance methods always return a jStat object.**
Here is a simple example on the difference in usage between the static and instance methods:
var myVect = [2,6,4,7,2,7,4],
jObj = jStat( myVect );
// calculate the sum of the the vector
jStat.sum( myVect ) === 32;
jObj.sum() === 32;
Now say we want to do several operations on the vector (e.g. sum, min, max, and standard deviation).
This can be accomplished using the static methods, but each will need to be called separately.
By using the jStat object we can pass callback functions and chain the execution of each operation:
jObj.sum( function( val ) {
// val === sum
}).min( function( val ) {
// val === min
}).max( function( val ) {
// val === max
}).stdev( function( val ) {
// val === st. dev.
});
This method sets each calculation to be executed in an asynchronous queue.
Very useful method of preventing blocking when working with large data sets.
Let's look at a few chaining and shorthand examples:
jStat( 0, 1, 11 ) === jStat( jStat.seq( 0, 1, 11 ));
jStat().rand( 4, 4 ) === jStat( jStat.rand( 4, 4 ));
jStat().create( 5, function( x, y ) {
return ( x + Math.random()) / ( y + Math.random());
}).min( true, function( x ) {
// do something with the min value
}).beta( 0.5, 0.5 ).pdf(); // generate and return the pdf
// of the beta function for all values