%% $Id: moments.erl,v 1.0 2002/09/24 12:09:00 dada Exp $
%%
%% Code contributed by Isaac Gouy
%%
%% Usage: start from command line with
%% erlc moments.erl
%% erl -noinput -s moments main 200000
-module(moments).
-export([main/0]).
-import(lists, [sort/1, foldl/3, nth/2]).
accumulate([], Mean, Ad, Av, As, Ak) ->
{Ad, Av, As, Ak};
accumulate([H|T], Mean, Ad, Av, As, Ak) ->
D = H - Mean,
D2 = D * D,
accumulate(T, Mean, Ad + abs(D), Av + D2, As + (D2 * D), Ak + (D2 * D2)).
median(L, N) -> medianS(sort(L), N).
medianS(L, N) ->
Mid = N div 2,
case N rem 2 of
0 -> (nth(Mid, L) + nth(Mid + 1, L)) / 2;
1 -> nth(Mid, L)
end.
skew(N, As, V, SD) when V > 0.0 -> As / (N * V * SD);
skew(N, As, V, SD) -> 0.
kurtosis(N, Ak, V) when V > 0.0 -> Ak / (N * V * V) - 3;
kurtosis(N, Ak, V) -> 0.
stats(L) ->
N = length(L),
io:fwrite("~s~w~n", ["n: ", N]),
io:fwrite("~s~f~n", ["median: ", median(L, N)]),
Mean = foldl(fun(X, Sum) -> X + Sum end, 0.0, L) / N,
io:fwrite("~s~f~n", ["mean: ", Mean]),
{Ad, Av, As, Ak} = accumulate(L, Mean, 0.0, 0.0, 0.0, 0.0),
io:fwrite("~s~f~n", ["average_deviation: ", Ad / N]),
Variance = Av / (N - 1),
Standard_deviation = math:sqrt(Variance),
io:fwrite("~s~f~n", ["standard_deviation: ", Standard_deviation]),
io:fwrite("~s~f~n", ["variance: ", Variance]),
io:fwrite("~s~f~n", ["skew: ", skew(N, As, Variance, Standard_deviation)]),
io:fwrite("~s~f~n", ["kurtosis: ", kurtosis(N, Ak, Variance)]),
io:fwrite("~n ", []).
main() ->
stats(lists:seq(1,500,1)),
halt(0).