libstats.pl
author A.M. Thurnherr <athurnherr@yahoo.com>
Wed, 16 Jul 2014 09:46:31 -0400
changeset 11 56799f01321a
parent 5 7d6e11d484ec
child 10 3dfa16523886
permissions -rw-r--r--
bug fix in libvec.pl; version given to Kanae Komaki, July 16, 2014
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     1
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     2
#                    L I B S T A T S . P L 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    doc: Wed Mar 24 13:59:27 1999
5
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
     4
#                    dlm: Sun Nov 24 23:23:11 2013
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
#                    (c) 1999 A.M. Thurnherr
5
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
     6
#                    uE-Info: 192 1 NIL 0 0 72 2 2 4 NIL ofnI
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     7
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     8
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     9
# HISTORY:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    10
#	Mar 24, 1999: - created for the ANO paper
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
#	Mar 27, 1999: - extended
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
#	Sep 18, 1999: - argument typechecking
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
#	Sep 30, 1999: - added gauss()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
#	Oct 04, 1999: - moved gauss() to [./libfuns.pl] (changed from specfuns)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#	Oct 20, 1999: - changed, 'cause I understand it better
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
#	Oct 21, 1999: - changed &Fishers_z to &r2z(); added &z2r()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
#				  - added &sig_rr(), &sig_rrtrue
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
#	Jan 22, 2002: - added N(), avg(), stddev(), min(), max()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
#	Feb 27, 2006: - adjusted median() for compat with NR (even # of points)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
#				  - added medianF()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
#	Jun 27, 2006: - added medianFNaN()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
#   Jul  1, 2006: - Version 3.3 [HISTORY]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
#				  - made median respect nan based on perlfunc(1)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
#	Apr 25, 2008: - added &bootstrap()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
#	Oct 24, 2010: - replaced grep { $_ == $_ } by grep { numberp($_) } everywhere
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
#				  - added &fixLowSampStat()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
#	Nov  5, 2010: - added std (stderr would have been better but that's used in libPOSIX.pl
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
#	Dec 18, 2010: - added stddev2, mad, mad2
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
#	Dec 31, 2010: - added rms()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
#	Jul  2, 2011: - added mad2F()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
#	Mar 10, 2012: - medianF() -> medianAnts_(); mad2F() -> mad2Ants_()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
#				  - added sum()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
#	Apr 26, 2012: - BUG: std() did not allow nan as stddev input
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    34
#	Oct 15, 2012: - added max_i(), min_i()
5
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    35
#	Nov 24, 2013: - renamed N to ndata
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    36
#				  - added fdiff()
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
require "$ANTS/libfuns.pl";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
# estimate stderr given stddev & degrees of freedom
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
#	- return nan for dof <= 0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
sub std(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
	my($sig,$dof) = 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
		&antsFunUsage(2,".c","stddev, deg_of_freedom",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
	return nan unless ($dof > 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
	return $sig / sqrt($dof);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
# calc standard stats from vector of vals
5
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    55
#	- used, e.g., in [rfilt]
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
sub min(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
	my($min) = 9e99;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
	for (my($i)=0; $i<=$#_; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
		$min = $_[$i] if (numberp($_[$i]) && $_[$i] < $min);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
	return $min<9e99 ? $min : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    67
sub min_i(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    68
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    69
	my($min) = 9e99;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    70
	my($min_i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    71
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    72
	for (my($i)=0; $i<=$#_; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    73
		$min_i=$i,$min=$_[$i] if (numberp($_[$i]) && $_[$i] < $min);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    74
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    75
	return $min<9e99 ? $min_i : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    76
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    77
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
sub max(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
	my($max) = -9e99;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    81
	for (my($i)=0; $i<=$#_; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
		$max = $_[$i] if (numberp($_[$i]) && $_[$i] > $max);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
	return $max>-9e99 ? $max : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    87
sub max_i(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    88
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    89
	my($max) = -9e99;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    90
	my($max_i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    91
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    92
	for (my($i)=0; $i<=$#_; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    93
		$max_i=$i,$max=$_[$i] if (numberp($_[$i]) && $_[$i] > $max);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    94
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    95
	return $max>-9e99 ? $max_i : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    96
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    97
5
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    98
sub ndata(@)
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    99
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   100
	my($N) = 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   101
	for (my($i)=0; $i<=$#_; $i++) { $N++ if (numberp($_[$i])); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   102
	return $N;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   103
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   104
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   105
sub sum(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   106
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   107
	my($N) = my($sum) = 0;
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   108
	@_ = split(/\s+/,$_[0])	if (@_ == 1 && !numberp($_[0]));
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   109
	for (my($i)=0; $i<=$#_; $i++) { $N++,$sum+=$_[$i] if (numberp($_[$i])); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   110
	return ($N>0)?$sum:nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   111
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   112
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   113
sub avg(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   114
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   115
	my($N) = my($sum) = 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   116
	for (my($i)=0; $i<=$#_; $i++) { $N++,$sum+=$_[$i] if (numberp($_[$i])); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   117
	return ($N>0)?$sum/$N:nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   118
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   119
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   120
sub stddev2(@)		# avg, val, val, val, ...
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   121
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   122
	my($N) = my($sum) = 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   123
	for (my($i)=1; $i<=$#_; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   124
		$N++,$sum+=($_[0]-$_[$i])**2 if (numberp($_[$i]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   125
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   126
	return ($N>1)?sqrt($sum/($N-1)):nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   127
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   128
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   129
sub stddev(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   130
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   131
	my($avg) = &avg(@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   132
	return numberp($avg) ? stddev2($avg,@_) : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   133
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   134
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   135
sub rms(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   136
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   137
	my($N) = my($sum) = 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   138
	for (my($i)=0; $i<=$#_; $i++) { $N++,$sum+=$_[$i]**2 if (numberp($_[$i])); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   139
	return ($N>0)?sqrt($sum/$N):nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   140
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   141
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   142
sub median(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   143
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   144
	my(@svals) = sort {$a <=> $b} grep { numberp($_) } @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   145
	return nan if (@svals == 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   146
	return (@svals & 1) ?
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   147
				$svals[$#svals/2] :
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   148
				0.5 * ($svals[$#svals/2] + $svals[$#svals/2+1]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   149
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   150
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   151
sub medianAnts_($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   152
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   153
	my($fnr) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   154
	my(@svals) = sort {@{$a}[$fnr] <=> @{$b}[$fnr]} grep { numberp(@{$_}[$fnr]) } @ants_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   155
	return nan if (@svals == 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   156
	return (@svals & 1) ?
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   157
				$svals[$#svals/2][$fnr] :
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   158
				0.5 * ($svals[$#svals/2][$fnr] + $svals[$#svals/2+1][$fnr]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   159
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   160
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   161
sub mad2(@)		# avg, val, val, val, ...
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   162
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   163
	my($N) = my($sum) = 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   164
	for (my($i)=1; $i<=$#_; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   165
		$N++,$sum+=abs($_[0]-$_[$i]) if (numberp($_[$i]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   166
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   167
	return ($N>0)?sqrt($sum/$N):nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   168
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   169
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   170
sub mad(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   171
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   172
	my($median) = &median(@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   173
	return numberp($median) ? mad2($median,@_) : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   174
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   175
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   176
sub mad2Ants_($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   177
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   178
	my($median,$fnr) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   179
	my($sum,$n);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   180
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   181
	for (my($r)=0; $r<@ants_; $r++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   182
		next unless numberp($ants_[$r][$fnr]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   183
		$sum += abs($median - $ants_[$r][$fnr]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   184
		$n++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   185
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   186
	return ($n>0) ? $sum/$n : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   187
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   188
5
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   189
sub fdiff(@)	# finite difference, e.g. for [rfilt]
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   190
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   191
	return (numberp($_[0]) && numberp($_[$#_])) ? $_[$#_] - $_[0] : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   192
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   193
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   194
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   195
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   196
# &bootstrap(nDraw,cLim,statFun,val[,...])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   197
#		nDraw		number of synthetic samples to draw
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   198
#		cLim		confidence limit (e.g. 0.95)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   199
#		statFun		pointer to stats function
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   200
#		val[,...]	data values
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   201
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   202
# e.g.  bootstrap(1000,.5,\&avg,1,2,1000)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   203
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   204
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   205
sub bootstrap($$$@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   206
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   207
	my($nDraw,$cLim,$statFun,@vals) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   208
	my(@sv,@stats);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   209
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   210
	for (my($s)=0; $s<$nDraw; $s++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   211
		for (my($i)=0; $i<@vals; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   212
			$sv[$i] = $vals[int(rand(@vals))];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   213
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   214
		$stats[$s] = &$statFun(@sv);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   215
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   216
	@stats = sort {$a <=> $b} grep { numberp($_) } @stats;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   217
	my($cli) = int($nDraw*(1-$cLim)/2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   218
	return ($stats[$cli],$stats[$#stats-$cli]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   219
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   220
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   221
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   222
# &fixLowSampStat(statRef,nsamp[])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   223
#	- replace stat (variance, stddev, stderr) based on small (<10) samples
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   224
#	  with median calculated from all stats
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   225
#	- median of all stats is chosen to allow routine to work even if all
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   226
#	  stats are based on small samples
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   227
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   228
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   229
sub fixLowSampStat($@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   230
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   231
	my($statR,@nsamp) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   232
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   233
	my($medStat) = median(@{$statR});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   234
	for (my($i)=0; $i<@{$statR}; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   235
		$statR->[$i] = $medStat
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   236
			unless ($nsamp[$i]>=10 || !defined($statR->[$i]) || $statR->[$i]>$medStat);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   237
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   238
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   239
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   240
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   241
# significance of difference of means (NR, 2nd ed, 14.2)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   242
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   243
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   244
sub Students_t(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   245
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   246
	my($mu1,$sig1,$N1,$mu2,$sig2,$N2) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   247
		&antsFunUsage(6,"ffcffc","mu1, sigma1, N1, mu2, sigma2, N2",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   248
	my($var1) = $sig1 * $sig1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   249
	my($var2) = $sig2 * $sig2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   250
	my($sd) = sqrt($var1 + $var2 / ($N1+$N2-2) * (1/$N1 + 1/$N2));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   251
	return ($mu1-$mu2) / $sd;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   252
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   253
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   254
sub slevel_mudiff1(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   255
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   256
	my($mu1,$sig1,$N1,$mu2,$sig2,$N2) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   257
		&antsFunUsage(6,"ffcffc","mean1, sqrt(var1), N1, mean2, sqrt(var2), N2",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   258
	my($df) = $N1 + $N2 - 2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   259
	return &betai(0.5*$df,0.5,
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   260
		$df/($df + &Students_t(mu1,$sig1,$N1,$mu2,$sig2,$N2)**2));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   261
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   262
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   263
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   264
# significance of correlation coefficient (NR, 2nd ed, 14.5)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   265
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   266
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   267
sub slevel_r(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   268
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   269
	my($r,$N) = &antsFunUsage(2,"fc","r, N",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   270
	return &erfcc(abs($r) * sqrt($N/2));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   271
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   272
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   273
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   274
# significance of difference btw two measured correlation coeffs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   275
# using Fisher's z (from NR, 2nd ed, 14.5). NB: averaging correlation
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   276
# coefficients is done using [avgr]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   277
# NB: significance level is only good if correlated variables form
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   278
#	  a binormal distribution
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   279
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   280
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   281
sub r2z(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   282
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   283
	my($r) = &antsFunUsage(1,"f","<r>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   284
	return 0.5 * log((1+$r)/(1-$r));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   285
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   286
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   287
sub z2r(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   288
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   289
	my($z) = &antsFunUsage(1,"f","<z>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   290
	my($e) = exp(2*$z);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   291
	return ($e-1) / ($e+1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   292
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   293
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   294
sub slevel_rrtrue(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   295
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   296
	my($r,$N,$rtrue) = &antsFunUsage(3,"fcf","r, N, r_true",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   297
	croak("$0 (libstats.pl): N (=$N) < 10 in &slevel_rrtrue()\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   298
		if ($N < 10);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   299
	return &erfcc(abs(&r2z($r) - (&r2z($rtrue) + $rtrue/(2*$N-2))) *
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   300
				sqrt($N - 3) / sqrt(2));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   301
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   302
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   303
sub slevel_zz(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   304
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   305
	my($z1,$N1,$z2,$N2) = &antsFunUsage(4,"fcfc","z1, N1, z2, N2",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   306
	croak("$0 (libstats.pl): N (=$N1,$N2) < 10 in &slevel_zz()\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   307
		if ($N1 < 10 || $N2 < 10);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   308
	return &erfcc(abs($z1-$z2) / sqrt(2/($N1-3) + 2/($N2-3)));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   309
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   310
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   311
sub slevel_rr(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   312
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   313
	my($r1,$N1,$r2,$N2) = &antsFunUsage(4,"fcfc","r1, N1, r2, N2",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   314
	return &slevel_zz(&r2z($r1),$N1,&r2z($r2),$N2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   315
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   316
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   317
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   318
# significance of difference btw two measured correlation coeffs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   319
# from brookes+dick63, p.216f
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   320
# NB: result is returned as ratio of difference in Fisher's z to
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   321
#	  standard error of Fisher's z; values >> 1 indicate that difference
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   322
#	  is significant
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   323
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   324
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   325
sub sig_rrtrue(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   326
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   327
	my($r,$N,$rtrue) = &antsFunUsage(3,"fcf","r, N, r_true",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   328
	return abs(&r2z($r) - &r2z($rtrue)) * sqrt($N-3);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   329
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   330
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   331
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   332
sub sig_rr(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   333
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   334
	my($r1,$N1,$r2,$N2) = &antsFunUsage(4,"fcfc","r1, N1, r2, N2",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   335
	return abs(&r2z($r1) - &r2z($r2)) / (1/sqrt($N1-3)+1/sqrt($N2-3));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   336
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   337
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   338
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   339
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   340
1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   341