Fix corner case in calculation of trimmed mean.
authorJohn Darrington <john@darrington.wattle.id.au>
Fri, 10 May 2013 11:46:13 +0000 (13:46 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Fri, 10 May 2013 11:46:13 +0000 (13:46 +0200)
The calculation of the trimmed mean was not quite correct.  This
change fixes it, and adds a test.

Reported by: Olaf Nöhring.

src/math/trimmed-mean.c
tests/language/stats/examine.at

index 2d44d0dc08cc3bba114f4ed9004c17eaf9ae6a7f..a687dd9b5fcffcd711ed983d0566edbb54847213 100644 (file)
@@ -33,11 +33,11 @@ acc (struct statistic *s, const struct ccase *cx UNUSED, double c, double cc, do
   struct trimmed_mean *tm = UP_CAST (s, struct trimmed_mean, parent.parent);
   struct order_stats *os = &tm->parent;
 
-  if ( cc > os->k[0].tc && cc < os->k[1].tc)
-      tm->sum += c * y;
+  if ( cc > os->k[0].tc && cc <= os->k[1].tc)
+    tm->sum += c * y;
 
-  if ( tm->cyk1p1 == SYSMIS && cc >os->k[0].tc)
-      tm->cyk1p1 = c * y;
+  if ( tm->cyk1p1 == SYSMIS && cc > os->k[0].tc)
+    tm->cyk1p1 = c * y;
 }
 
 static void
@@ -83,14 +83,11 @@ trimmed_mean_calculate (const struct trimmed_mean *tm)
 
   return
     (
-     (os->k[0].cc_p1 - os->k[0].tc) * os->k[0].y_p1
-     -
-     (os->k[1].cc - os->k[1].tc) * os->k[1].y_p1
+     (os->k[0].cc - os->k[0].tc) * os->k[0].y_p1
      +
-     tm->sum
-     -
-     tm->cyk1p1
+      (tm->w - os->k[1].cc - os->k[0].tc) * os->k[1].y_p1
+     +
+      tm->sum
      )
-    /
-    ( (1.0 - 2 * tm->tail) * tm->w);
+    / ((1.0 - tm->tail * 2) * tm->w);
 }
index bad259d58e3fa4e6348fdd340a493b6123dc7e80..54307f4688732abb85c445ae6deb8498d6e254f1 100644 (file)
@@ -873,4 +873,148 @@ x,. (missing),Highest,1,31,4004
 ])
 
 
-AT_CLEANUP 
\ No newline at end of file
+AT_CLEANUP 
+
+
+dnl Run a test of the basic STATISTICS using a "real"
+dnl dataset and comparing with "real" results kindly
+dnl provided by Olaf Nöhring
+AT_SETUP([EXAMINE -- sample unweighted])
+
+AT_DATA([sample.sps], [dnl
+set format = F22.4.
+DATA LIST notable LIST /X *
+BEGIN DATA.
+461.19000000
+466.38000000
+479.46000000
+480.10000000
+483.43000000
+488.30000000
+489.00000000
+491.62000000
+505.62000000
+511.30000000
+521.53000000
+526.70000000
+528.25000000
+538.70000000
+540.22000000
+540.58000000
+546.10000000
+548.17000000
+553.99000000
+566.21000000
+575.90000000
+584.38000000
+593.40000000
+357.05000000
+359.73000000
+360.48000000
+373.98000000
+374.13000000
+381.45000000
+383.72000000
+390.00000000
+400.34000000
+415.32000000
+415.91000000
+418.30000000
+421.03000000
+422.43000000
+426.93000000
+433.25000000
+436.89000000
+445.33000000
+446.33000000
+446.55000000
+456.44000000
+689.49000000
+691.92000000
+695.00000000
+695.36000000
+698.21000000
+699.46000000
+706.61000000
+710.69000000
+715.82000000
+715.82000000
+741.39000000
+752.27000000
+756.73000000
+757.74000000
+759.57000000
+796.07000000
+813.78000000
+817.25000000
+825.48000000
+831.28000000
+849.24000000
+890.00000000
+894.78000000
+935.65000000
+935.90000000
+945.90000000
+1012.8600000
+1022.6000000
+1061.8100000
+1063.5000000
+1077.2300000
+1151.6300000
+1355.2800000
+598.88000000
+606.91000000
+621.60000000
+624.80000000
+636.13000000
+637.38000000
+640.32000000
+649.35000000
+656.51000000
+662.55000000
+664.69000000
+106.22000000
+132.24000000
+174.76000000
+204.85000000
+264.93000000
+264.99000000
+269.84000000
+325.12000000
+331.67000000
+337.26000000
+347.68000000
+354.91000000
+END DATA.
+
+EXAMINE
+       x
+       /STATISTICS=DESCRIPTIVES
+       .
+])
+
+AT_CHECK([pspp -O format=csv sample.sps], [0], [dnl
+Table: Case Processing Summary
+,Cases,,,,,
+,Valid,,Missing,,Total,
+,N,Percent,N,Percent,N,Percent
+X,100,100%,0,0%,100,100%
+
+Table: Descriptives
+,,,Statistic,Std. Error
+X,Mean,,587.6603,23.2665
+,95% Confidence Interval for Mean,Lower Bound,541.4946,
+,,Upper Bound,633.8260,
+,5% Trimmed Mean,,579.7064,
+,Median,,547.1350,
+,Variance,,54132.8466,
+,Std. Deviation,,232.6647,
+,Minimum,,106.2200,
+,Maximum,,1355.2800,
+,Range,,1249.0600,
+,Interquartile Range,,293.1575,
+,Skewness,,.6331,.2414
+,Kurtosis,,.5300,.4783
+])
+
+AT_CLEANUP