44 #ifndef INCLUDE_GNSSTK_BIVARSTATS_HPP
45 #define INCLUDE_GNSSTK_BIVARSTATS_HPP
73 BivarStats(
const T& x,
const T&,
bool scale=
false);
74 BivarStats(
const std::vector<T>& x,
const std::vector<T>&
y,
76 BivarStats(
const std::vector< std::pair<T, T> >& d,
bool scale=
false);
83 void add(
const T& x,
const T&
y);
84 void add(
const std::vector<T>& x,
const std::vector<T>&
y);
85 void add(
const std::vector< std::pair<T, T> >& d);
93 void subtract(
const std::vector<T>& x,
const std::vector<T>&
y);
94 void subtract(
const std::vector< std::pair<T, T> >& d);
152 s <<
" N = " << BVS.
n() << std::endl
153 <<
" Minimum: X = " << BVS.
minimumX()
155 <<
" Maximum: X = " << BVS.
maximumX()
156 <<
" Y = " << BVS.
maximumY() << std::endl
157 <<
" Average: X = " << BVS.
averageX()
159 <<
" Std Dev: X = " << BVS.
stdDevX()
160 <<
" Y = " << BVS.
stdDevY() << std::endl
162 <<
" Slope = " << BVS.
slope()
163 <<
" with uncertainty = " << BVS.
sigmaSlope() << std::endl
164 <<
" Conditional uncertainty (sigma y given x) = " << BVS.
sigmaYX()
165 <<
" Correlation = " << BVS.
correlation() << std::endl;
208 sumX = sumY = sumX2 = sumY2 = sumXY = T(0);
211 scaleX = scaleY = T(1);
216 if (scaleX==T(1) && x!=T()) scaleX=
ABS(x);
217 if (scaleY==T(1) &&
y!=T()) scaleY=
ABS(
y);
245 size_t m = x.size() <
y.size() ? x.size() :
y.size();
248 for (
size_t i=0; i<m; i++)
255 size_t max( d.size() );
256 for (
size_t i=0; i<
max; i++)
257 add(d[i].first, d[i].
second);
263 size_t m = x.
size() <
y.size() ? x.
size() :
y.size();
266 for (
size_t i=0; i<m; i++)
304 size_t m = x.size()<
y.size() ? x.size() :
y.size();
307 for (
size_t i=0; i<m; i++)
308 subtract(x[i],
y[i]);
314 size_t max( d.size() );
315 for (
size_t i=0; i<
max; i++)
316 subtract(d[i].first, d[i].
second);
322 size_t m = x.
size()<
y.size() ? x.
size() :
y.size();
325 for (
size_t i=0; i<m; i++)
326 subtract(x(i),
y(i));
347 {
return ns>0 ? scaleX*sumX/T(ns) : T(0); }
350 {
return ns>0 ? scaleY*sumY/T(ns) : T(0); }
356 return (ns>1) ? scaleX*scaleX * (sumX2 - sumX*sumX/T(ns)) / T(ns-1) : T(0);
362 return (ns>1) ? scaleY*scaleY * (sumY2 - sumY*sumY/T(ns)) / T(ns-1) : T(0);
374 return (scaleY/scaleX) * (sumXY - sumX*sumY/T(ns)) /
375 (sumX2 - sumX*sumX/T(ns));
384 return averageY() - slope() * averageX();
393 return sigmaYX() / (stdDevX() *
SQRT(T(ns-1)));
402 return scaleX*scaleY * (sumXY - sumX*sumY/T(ns)) /
403 (stdDevX() * stdDevY() * T(ns-1));
412 return (stdDevY() *
SQRT(T(ns-1) / T(ns-2))
413 *
SQRT(T(1) - correlation() * correlation()) );
422 if(ns + S.
ns == 0)
return *
this;
427 T xscaler( S.
scaleX/scaleX ), yscaler( S.
scaleY/scaleY );
428 sumX += xscaler * S.
sumX;
429 sumY += yscaler * S.
sumY;
430 sumX2 += xscaler * xscaler * S.
sumX2;
431 sumY2 += yscaler * yscaler * S.
sumY2;
432 sumXY += xscaler * yscaler * S.
sumXY;
442 size_t max( d.size() );
443 for (
size_t i=0; i<
max; i++)
444 estats.
Add(std::abs(d[i].second - eval(d[i].first)));