
Boost Users : 
Subject: [Boostusers] [math/distributions] invalid values for undefined moments
From: Thomas Mang (thomasmang.ng_at_[hidden])
Date: 20120725 19:52:08
Hi,
According to the documentation, in boost 150 nonmember functions of
moments (e.g. mean, variance) which are not defined for a given
distribution shall issue compiletime errors, or throw a domain_error at
runtime otherwise. For the Cauchy Distribution, that's what it does. For
the tdistribution, that's not what it does  the nonmember functions
happily return some complete rubbish values for mean and variance (and
hence I'd also suppose standard deviation). For kurtosis and skewness it
seems to work correctly but are subject to mathematical definitions. I
have not tested other nonmember functions.
Note that there are different definitions floating around as to when a
given moment is defined. The kth moment is always defined if k < v, but
in other cases opinions deviate. Wikipedia states it might be infinity
under some circumstances  obviously what boost seems to having taken
over. In general however I am used to  and my gut feeling the clear
majority of people would have this perception; indeed I am not aware of
any other source than wikipedia stating these infinity things  that
moments are undefined if k >= v (see e.g. Probability and Statistics,
DeGroot & Schervish 2002, for a professional textbooks and heaps of
other sources).
So while the boost output for variance and a t2 distribution (or
alternatively also the kurtosis of a t4 distribution) might be
considered ok by some, I'd guess to most people it would be fairly
unexpected? It had been a surprise to me, at least.
Code snippet:
typedef boost::math::students_t_distribution<double> t_distr;
// this is ok
std::cout << "mean(t(2)): " << boost::math::mean( t_distr(2) ) << std::endl;
// this is NOT ok  first moment not defined for given distribution
std::cout << "mean(t(1)): " << boost::math::mean( t_distr(1) ) << std::endl;
// this is ok
std::cout << "var(t(3)): " << boost::math::variance( t_distr(3) ) <<
std::endl;
// this might be ok or not
// depending on point of view, either Inf or undefined
std::cout << "var(t(2)): " << boost::math::variance( t_distr(2) ) <<
std::endl;
// this is NOT ok  second moment not defined for the given distribution
std::cout << "var(t(1)): " << boost::math::variance( t_distr(1) ) <<
std::endl;
best,
Thomas
Boostusers list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net