Statistics

This calculates the mean and the standard deviation of data represented by values (Xs) and their frequencies (Ns).

check_determ
domains
  int   = integer
  ints  = int*
  reals = real*
predicates
  test_statistics
  statistics(ints,reals,real,real,real)
  statistics_1(ints,reals,int,int,real,real,real,real)
clauses

test_statistics:-
  Xs = [3.7, 3.8, 3.9, 4.0, 4.1, 4.2, 4.3],
  Ns = [  1,   3,   5,   9,   8,   3,   1],
  statistics(Ns, Xs,         Mean, StdVarPopulation, StdVarSample),
                          /* 4.01,    0.1350309,       0.1373392 */
  writef("%0.7 %0.7 %0.7\n", Mean, StdVarPopulation, StdVarSample).

statistics(Ns, Xs, Mean, StdVarPopulation, StdVarSample):-
  statistics_1(Ns, Xs, 0, S_N, 0, S_NX, 0, S_NXX),
  Mean = S_NX / S_N,
  StdVarPopulation = sqrt((S_NXX - Mean * Mean * S_N) / S_N),
  StdVarSample = sqrt((S_NXX - Mean * Mean * S_N) / (S_N - 1)).

statistics_1([], [], S_N, S_N, S_NX, S_NX, S_NXX, S_NXX).
statistics_1([N|Ns], [X|Xs], S_N0, S_N, S_NX0, S_NX, S_NXX0, S_NXX):-
  S_N1 = S_N0 + N,
  N_X = N * X,
  S_NX1 = S_NX0 + N_X,
  S_NXX1 = S_NXX0 + N_X * X,
  statistics_1(Ns, Xs, S_N1, S_N, S_NX1, S_NX, S_NXX1, S_NXX).

Turbo Prolog Index     Home Page