@@ -475,7 +475,7 @@ void SetStatistics(double mean, double variance, double skewness, double kurtosi
475475 }
476476
477477 /// <summary>
478- /// Computes descriptive statistics from a stream of data values.
478+ /// Computes descriptive statistics from a stream of data values and weights .
479479 /// </summary>
480480 /// <param name="data">A sequence of datapoints.</param>
481481 void Compute ( IEnumerable < Tuple < double , double > > data )
@@ -496,7 +496,11 @@ void Compute(IEnumerable<Tuple<double, double>> data)
496496
497497 foreach ( var ( w , xi ) in data )
498498 {
499- if ( w > 0 )
499+ if ( w < 0 )
500+ {
501+ throw new ArgumentOutOfRangeException ( nameof ( data ) , w , "Expected non-negative weighting of sample" ) ;
502+ }
503+ else if ( w > 0 )
500504 {
501505 ++ n ;
502506 double delta = xi - mean ;
@@ -537,7 +541,7 @@ void Compute(IEnumerable<Tuple<double, double>> data)
537541 }
538542
539543 /// <summary>
540- /// Computes descriptive statistics from a stream of data values.
544+ /// Computes descriptive statistics from a stream of data values and weights .
541545 /// </summary>
542546 /// <param name="data">A sequence of datapoints.</param>
543547 void ComputeDecimal ( IEnumerable < Tuple < double , double > > data )
@@ -558,7 +562,11 @@ void ComputeDecimal(IEnumerable<Tuple<double, double>> data)
558562
559563 foreach ( var ( w , x ) in data )
560564 {
561- if ( w > 0 )
565+ if ( w < 0 )
566+ {
567+ throw new ArgumentOutOfRangeException ( nameof ( data ) , w , "Expected non-negative weighting of sample" ) ;
568+ }
569+ else if ( w > 0 )
562570 {
563571
564572 decimal xi = ( decimal ) x ;
@@ -643,10 +651,12 @@ void SetStatisticsWeighted(double mean, double variance, double skewness, double
643651
644652 if ( n > 3 )
645653 {
646- // common denominator
647- double poly = w1 * w1 * w1 * w1 - 6.0 * w1 * w1 * w2 + 8.0 * w1 * w3 + 3.0 * w2 * w2 - 6.0 * w4 ;
648- double a = w1 * w1 * w1 * w1 - 4.0 * w1 * w3 + 3.0 * w2 * w2 ;
649- double b = 3.0 * ( w1 * w1 * w1 * w1 - 2.0 * w1 * w1 * w2 + 4.0 * w1 * w3 - 3.0 * w2 * w2 ) ;
654+ double p2 = w1 * w1 ;
655+ double p4 = p2 * p2 ;
656+ double w2p2 = w2 * w2 ;
657+ double poly = p4 - 6.0 * p2 * w2 + 8.0 * w1 * w3 + 3.0 * w2p2 - 6.0 * w4 ;
658+ double a = p4 - 4.0 * w1 * w3 + 3.0 * w2p2 ;
659+ double b = 3.0 * ( p4 - 2.0 * p2 * w2 + 4.0 * w1 * w3 - 3.0 * w2p2 ) ;
650660 Kurtosis = ( a * w1 * kurtosis / ( variance * variance ) - b ) * ( den / ( w1 * poly ) ) ;
651661 }
652662 }
0 commit comments