Online calculation of higher-order moments for Julia
OnlineMoments.jl is a Julia package that iteratively calculates the higher-order moments of a sequence of real numbers.
Installation
Within Julia, the package may be installed with
Pkg.add("OnlineMoments")
After installation, the test suite may be run with
Pkg.test("OnlineMoments")
The package is maintained in a Git repository at https://git.colberg.org/peter/OnlineMoments.jl.
Usage
The package provides immutable types for the iterative calculation of
the moments of a sequence: Mean
for the first moment,
Variance
for the first and second moments, and
Moments
for the first four moments. Results are extracted
using the functions nobs()
, mean()
,
var()
, std()
, sem()
,
skewness()
, and kurtosis()
.
Calculate first four moments of a sequence:
import OnlineMoments: Moments
import StatsBase: nobs, skewness, kurtosis
function moments(N::Integer)
= zero(Moments)
m for i = 1:N
+= rand()
m end
mend
= moments(1000000)
m println(nobs(m)) # 1000000
println(mean(m)) # 1/2
println(var(m)) # 1/12
println(skewness(m)) # 0
println(kurtosis(m)) # -6/5
Calculate mean, variance, standard deviation, and standard error of the mean:
import OnlineMoments: Variance
import StatsBase: nobs, sem
function moments(N::Integer)
= zero(Variance)
m for i = 1:N
+= rand()
m end
mend
= moments(1000000)
m println(nobs(m))
println(mean(m))
println(var(m))
println(std(m))
println(sem(m))
Calculate first four moments of multiple sequences:
import OnlineMoments: Moments
import StatsBase: nobs, skewness, kurtosis
function moments(N::Integer, M::Integer)
= zeros(Moments, M)
m for j = 1:M
for i = 1:N
+= rand()
m[j] end
end
mend
= moments(1000000, 5)
m println(map(nobs, m))
println(map(mean, m))
println(map(var, m))
println(map(skewness, m))
println(map(kurtosis, m))
Calculate first four moments of a parallel sequence using
julia -p <n>
:
import OnlineMoments
import StatsBase: nobs, skewness, kurtosis
@everywhere import OnlineMoments: Moments
@everywhere function moments(N::Integer)
= zero(Moments)
m for i = 1:N
+= rand()
m end
mend
= @parallel (+) for i = 1:100
m moments(1000000)
end
println(nobs(m))
println(mean(m))
println(var(m))
println(skewness(m))
println(kurtosis(m))