Viewing contents of file '../idllib/astron/contrib/freudenreich/resistant_mean.pro'
PRO RESISTANT_MEAN,Y,CUT,MEAN,SIGMA,NUM_REJ
;+
; NAME:
; RESISTANT_MEAN
;
; PURPOSE:
; An outlier-resistant determination of the mean and its standard
; deviation. It trims away outliers using the median and the median
; absolute deviation.
;
; CALLING SEQUENCE:
; RESISTANT_MEAN,VECTOR,SIGMA_CUT, MEAN,SIGMA,NUM_REJECTED
;
; INPUT ARGUMENT:
; VECTOR = Vector to average
; SIGMA_CUT = Data more than this number of standard deviations from the
; median is ignored. Suggested values: 2.0 and up.
;
; OUTPUT ARGUMENT:
; MEAN = the mean
; SIGMA = the standard deviation of the mean
; NUM_REJECTED = the number of points trimmed
;
; SUBROUTINE CALLS:
; MED, which calculates a median
;
; REVISION HISTORY:
; Written, H. Freudenreich, STX, 1989; Second iteration added 5/91.
;-
ON_ERROR,2
NPTS = N_ELEMENTS(Y)
YMED = MED(Y)
ABSDEV = ABS(Y-YMED)
MEDABSDEV = MED( ABSDEV )/.6745
IF MEDABSDEV LT 1.0E-24 THEN MEDABSDEV = AVG(ABSDEV)/.8
CUTOFF = CUT*MEDABSDEV
GOODPTS = Y( WHERE( ABSDEV LE CUTOFF ) )
MEAN = AVG( GOODPTS )
NUM_GOOD = N_ELEMENTS( GOODPTS )
SIGMA = SQRT( TOTAL((GOODPTS-MEAN)^2)/NUM_GOOD )
NUM_REJ = NPTS - NUM_GOOD
; Compenate SIGMA for truncation (formula by HF):
SC=CUT
IF SC LT 1.75 THEN SC=1.75
IF SIGMA LE 3.4 THEN SIGMA=SIGMA/(.18553+.505246*SC-.0784189*SC*SC)
CUTOFF = CUT*SIGMA
GOODPTS = Y( WHERE( ABSDEV LE CUTOFF ) )
MEAN = AVG( GOODPTS )
NUM_GOOD = N_ELEMENTS( GOODPTS )
SIGMA = SQRT( TOTAL((GOODPTS-MEAN)^2)/NUM_GOOD )
NUM_REJ = NPTS - NUM_GOOD
SC=CUT
IF SC LT 1.75 THEN SC=1.75
IF SIGMA LE 3.4 THEN SIGMA=SIGMA/(.18553+.505246*SC-.0784189*SC*SC)
; Now the standard deviation of the mean:
SIGMA = SIGMA/SQRT(NPTS-1.)
RETURN
END