npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

online-mean

v1.1.2

Published

Online mean calculation

Downloads

684

Readme

online-mean

Online mean calculation (piece-by-piece)

Usage

const Mean = require('online-mean')

// Create a new mean object calling Mean() or new Mean()
// Each of these object stores inner variables
// So we need this extra step to be able to calculate means of multiple data flows
const m1 = Mean()
const m2 = new Mean() // same as const m2 = Mean()

// Update calling mean objects directly, as a function:
;[1, 2, 3, 4, 5].forEach(v => { m1(v) })

// Or via .fit() method. These two ways are identical!
;[4, 5, 6, 7, 8].forEach(v => { m2.fit(v) })

// Using  with arrays:
m1([9, 10, 11]) // Keep in mind - this line updates m1 with 3 new data values, not just averages the array

// Get mean value calling mean object with no arguments:
console.log('m1:', m1()) // -> 5.625

// Or via .value getter
console.log('m2:', m2.value) // -> 6

// Total number of observations:
console.log('m2 n:', m2.n) // -> 5

// Merge multiple mean objects:
const m3 = Mean.merge(m1, m2)
console.log('m3:', m3.value) // -> ~5.769

// 'n' and 'value' are not just object keys, but object getters.
// If you really need to change their values use .setN() and .setValue() methods:
m2.setValue(0)
m2.setN(0)
console.log(m2.value, m2.n) // -> 0 0

How it works

A classical formula of a sample mean is defined as follows:

ān = (Σi=1..n xi) / n

It basically iterates over all values of x, sums them and divides on total number of samples. That works when the length of x is small and you don't need to update the mean when new values added. To calculate mean ā in on-line fashion we will use a recursive formula:

ān = ān-1 + (xn - ān-1) / n

It's still based on the classical formula, however instead of summing all values we calculate ā recursively. Derivation:

ān = (Σi=1..n xi) / n ān = (Σi=1..n-1 xi + xn) / n ān = ((n-1) × ān-1 + xn) / n ān = ān-1 + (-ān-1 + xn) / n ān = ān-1 + (xn - ān-1) / n

To merge multiple means without iterating over all values of x, we will expand the formula a little:

ānm = (Σi=1..n xi + Σj=1..m xj) / (n + m) ānm = (n * ān + m * ām) / (n + m)

Such multiplications in the numerator could produce quite big numbers, so it's better to change the expression:

ānm = (n * ān + m * ān - m * ān + m * ām) / (n + m) ānm = ān + (- m * ān + m * ām) / (n + m) ānm = ān + (ām - ān) * m / (n + m)

Much better! :)