Skip to content

Instantly share code, notes, and snippets.

@kljensen
Last active December 24, 2015 03:59
Show Gist options
  • Select an option

  • Save kljensen/6740610 to your computer and use it in GitHub Desktop.

Select an option

Save kljensen/6740610 to your computer and use it in GitHub Desktop.
My script for calculating the statistical moments of an array in coffeescript
moments = (arr, doMedian=false) ->
length = arr.length
sum = arr.reduce (t, s) -> t + s
mean = sum / length
averageDeviation = 0.0
averageDeviation = 0.0
standardDeviation = 0.0
variance = 0.0
skew = 0.0
kurtosis = 0.0
minimum = null
maximum = null
for val in arr
d = val - mean
averageDeviation += Math.abs(d)
d *= d
variance += d
d *= d
skew += d
d *= d
kurtosis += d
if minimum is null or val < minimum
minimum = val
if maximum is null or val > maximum
maximum = val
averageDeviation /= length
variance /= (length - 1)
standardDeviation = Math.sqrt(variance)
if variance > 0.0
skew /= (length * variance * standardDeviation)
kurtosis = kurtosis/(length * Math.pow(variance, 2)) - 3.0
retval = {
"sum": sum,
"mean": mean,
"minimum": minimum,
"maximum": maximum,
"averageDeviation": averageDeviation,
"standardDeviation": standardDeviation,
"variance": variance,
"skew": skew,
"kurtosis": kurtosis,
}
# Finding the median requires copying & sorting the array, so we don't
# return it by default.
if doMedian
sortedArr = arr.slice()
sortedArr.sort()
midPoint = Math.floor(length / 2)
# When there is no unique median, take the mean
# of the two closest
if length % 2 == 0
median = (sortedArr[midPoint] + sortedArr[midPoint-1]) / 2
else
median = sortedArr[midPoint]
retval.median = median
return retval
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment