IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 17602


Ignore:
Timestamp:
May 9, 2008, 11:02:21 AM (18 years ago)
Author:
eugene
Message:

added clipmean and clipstdev options

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/PS-IPP-Config/lib/PS/IPP/Metadata/Stats.pm

    r17431 r17602  
    11# Copyright (c) 2006  Paul Price, Joshua Hoblitt
    22#
    3 # $Id: Stats.pm,v 1.27 2008-04-11 07:37:14 eugene Exp $
     3# $Id: Stats.pm,v 1.28 2008-05-09 21:02:21 eugene Exp $
    44
    55package PS::IPP::Metadata::Stats;
     
    109109        }
    110110
     111        # calculate a 3-sigma clipped mean (if Nvalues > 8, reject > 3sigma outliers)
     112        if ($type eq "clipmean") {
     113            if (scalar @$data > 0) {
     114                # Get statistics on the value
     115                my $stats = Statistics::Descriptive::Sparse->new(); # Statistics calculator
     116                $stats->add_data(@$data);
     117                my $rawMean = $stats->mean();
     118                my $rawStdev = $stats->standard_deviation();
     119                my $rawLimit = 3.0*$rawStdev;
     120
     121                # clip, if we can
     122                if (scalar @$data > 8) {
     123                    my @clipdata = ();
     124                    foreach my $value (@$data){
     125                        my $delta = abs($value - $rawMean);
     126                        if ($delta > $rawLimit) { next; }
     127                        push @clipdata, $value;
     128                    }
     129                    my $clipstats = Statistics::Descriptive::Sparse->new(); # Statistics calculator
     130                    $clipstats->add_data(@clipdata);
     131                    $entry->{value} = $clipstats->mean();
     132                } else {
     133                    $entry->{value} = $stats->mean();
     134                }
     135            } else {
     136                $self->_null_for_type ($entry);
     137            }
     138            next;
     139        }
     140
    111141        if ($type eq "stdev") {
    112142            if (scalar @$data > 1) {
     
    122152            }
    123153            $self->_null_for_type ($entry);
     154            next;
     155        }
     156
     157        # calculate a 3-sigma clipped stdev (if Nvalues > 8, reject > 3sigma outliers)
     158        if ($type eq "clipstdev") {
     159            if (scalar @$data > 0) {
     160                # Get statistics on the value
     161                my $stats = Statistics::Descriptive::Sparse->new(); # Statistics calculator
     162                $stats->add_data(@$data);
     163                my $rawMean = $stats->mean();
     164                my $rawStdev = $stats->standard_deviation();
     165                my $rawLimit = 3.0*$rawStdev;
     166
     167                # clip, if we can
     168                if (scalar @$data > 8) {
     169                    my @clipdata = ();
     170                    foreach my $value (@$data){
     171                        my $delta = abs($value - $rawMean);
     172                        if ($delta > $rawLimit) { next; }
     173                        push @clipdata, $value;
     174                    }
     175                    my $clipstats = Statistics::Descriptive::Sparse->new(); # Statistics calculator
     176                    $clipstats->add_data(@clipdata);
     177                    $entry->{value} = $clipstats->standard_deviation();
     178                } else {
     179                    $entry->{value} = $stats->standard_deviation();
     180                }
     181            } else {
     182                $self->_null_for_type ($entry);
     183            }
    124184            next;
    125185        }
     
    270330            }
    271331
     332            if ($type eq 'clipmean') {
     333                push @$data, $value;
     334                next;
     335            }
     336
    272337            if ($type eq 'stdev') {
     338                push @$data, $value;
     339                next;
     340            }
     341
     342            if ($type eq 'clipstdev') {
    273343                push @$data, $value;
    274344                next;
Note: See TracChangeset for help on using the changeset viewer.