fintech-algorithms
Using a coding agent? Give it the skill: npx skills add IslamBaraka90/Fintech-Algorithms-Library What it does →

Trimmed and Winsorized Means

Install and import#

bash
npm install fintech-algorithms
ts
import { trimmedAndWinsorizedMeans } from "fintech-algorithms/foundations/location-ranking-and-exploratory-summaries/trimmed-and-winsorized-means";

Signature#

trimmedAndWinsorizedMeans(input)

Cuts the same number of observations off each tail of the sorted series and averages what is left, then averages again with those tails replaced by the surviving boundary values instead of discarded.

Parameters#

NameTypeNotes
input{ values: number[]; trimProportion: number }values holds the observations and trimProportion the share to remove from each tail. The cut size is floor(values.length * trimProportion), so small samples may round the trim down to zero.
trimProportion: 0 <= trimProportion < 0.5, and the two cuts together must leave at least one observation

Returns#

{ trimmedMean: number; winsorizedMean: number; trimmedCount: number }

trimmedMean averages only the surviving middle, winsorizedMean averages the full-length series with each tail replaced by the nearest kept value, and trimmedCount is how many observations the trimmed mean was computed from.

Errors#

  • When input is null, an array, or not an object — throws TypeError
  • When values is missing, is not an array, or is empty — throws RangeError
  • When any entry of values does not coerce to a finite number — throws RangeError
  • When trimProportion is negative, is 0.5 or more, or is not a number — throws RangeError
  • When the two cuts together would remove every observation — throws RangeError

Complexity: time O(n log n), space O(n).

Worked example#

verified This is the worked example published in the article, replayed by the test suite on every run. The output cannot drift.

Input#

input
{
  "values": [1, 2, 2, 4, 9],
  "weights": [1, 1, 2, 1, 1],
  "trimProportion": 0.2,
  "bins": 4
}

Call#

trimmedAndWinsorizedMeans(input)

Returns#

object with 2 fields: trimmedMean, winsorizedMean

{
  "trimmedMean": 2.6666666666666665,
  "winsorizedMean": 2.8
}

Diagrams#

Trimmed and Winsorized Means — article hero
Trimmed and Winsorized Means — calculation ledger
Trimmed and Winsorized Means — comparison map
Trimmed and Winsorized Means — concept anatomy
Trimmed and Winsorized Means — mistake contrast
Trimmed and Winsorized Means — scenario map

How it works#

This page states the contract — how to call it correctly. The article explains the concept: why it works, and where it breaks.

Read the article →

References#

  • Measures of Location
  • Historical-example decision

The rest of the Location, Ranking, and Exploratory Summaries family#