libstats.pl
author Andreas Thurnherr <ant@ldeo.columbia.edu>
Mon, 13 Apr 2020 11:06:22 -0400
changeset 40 c1803ae2540f
parent 39 56bdfe65a697
child 47 dde46143288c
permissions -rw-r--r--
.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     1
#======================================================================
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
     2
#                    . . / L I B / L I B S T A T S . P L 
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    doc: Wed Mar 24 13:59:27 1999
40
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 39
diff changeset
     4
#                    dlm: Tue Mar 26 12:59:32 2019
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
#                    (c) 1999 A.M. Thurnherr
40
Andreas Thurnherr <ant@ldeo.columbia.edu>
parents: 39
diff changeset
     6
#                    uE-Info: 50 31 NIL 0 0 72 0 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()
10
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    37
#	Jan 30, 2015: - added log_avg()
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
    38
#				  - added noise_avg()
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    39
#	Mar 26, 2019: - added regress()
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
require "$ANTS/libfuns.pl";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
#----------------------------------------------------------------------
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    44
# simple linear regression
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    45
#	- returns regression coefficient (slope)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    46
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    47
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    48
sub regress(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    49
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    50
	my($n) = @_/2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    51
	return nan unless ($n > 1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    52
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    53
	my(@X) = @_[0..$n-1];
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    54
	my(@Y) = @_[$n..2*$n-1];
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    55
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    56
	my($sumx) = 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    57
	for (my($i)=0; $i<$n; $i++) { $sumx += $X[$i]; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    58
    my($midx) = $sumx / @Y;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    59
    my($rcoeff) = my($sumxdsq) = 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    60
	for (my($i)=0; $i<$n; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    61
		my($xd) = $X[$i] - $midx;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    62
		$sumxdsq += $xd**2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    63
		$rcoeff += $xd * $Y[$i];
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    64
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    65
    $rcoeff /= $sumxdsq;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    66
	return $rcoeff;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    67
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    68
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 10
diff changeset
    69
#----------------------------------------------------------------------
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
# estimate stderr given stddev & degrees of freedom
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
#	- return nan for dof <= 0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
sub std(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
	my($sig,$dof) = 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
		&antsFunUsage(2,".c","stddev, deg_of_freedom",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
	return nan unless ($dof > 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
	return $sig / sqrt($dof);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    81
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
# calc standard stats from vector of vals
5
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    84
#	- used, e.g., in [rfilt]
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
sub min(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    88
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
	my($min) = 9e99;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    90
	for (my($i)=0; $i<=$#_; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    91
		$min = $_[$i] if (numberp($_[$i]) && $_[$i] < $min);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    92
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    93
	return $min<9e99 ? $min : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    94
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    95
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    96
sub min_i(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    97
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    98
	my($min) = 9e99;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    99
	my($min_i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   100
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   101
	for (my($i)=0; $i<=$#_; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   102
		$min_i=$i,$min=$_[$i] if (numberp($_[$i]) && $_[$i] < $min);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   103
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   104
	return $min<9e99 ? $min_i : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   105
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   106
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   107
sub max(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   108
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   109
	my($max) = -9e99;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   110
	for (my($i)=0; $i<=$#_; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   111
		$max = $_[$i] if (numberp($_[$i]) && $_[$i] > $max);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   112
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   113
	return $max>-9e99 ? $max : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   114
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   115
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   116
sub max_i(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   117
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   118
	my($max) = -9e99;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   119
	my($max_i);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   120
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   121
	for (my($i)=0; $i<=$#_; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   122
		$max_i=$i,$max=$_[$i] if (numberp($_[$i]) && $_[$i] > $max);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   123
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   124
	return $max>-9e99 ? $max_i : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   125
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   126
5
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   127
sub ndata(@)
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   128
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   129
	my($N) = 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   130
	for (my($i)=0; $i<=$#_; $i++) { $N++ if (numberp($_[$i])); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   131
	return $N;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   132
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   133
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   134
sub sum(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   135
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   136
	my($N) = my($sum) = 0;
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   137
	@_ = split(/\s+/,$_[0])	if (@_ == 1 && !numberp($_[0]));
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   138
	for (my($i)=0; $i<=$#_; $i++) { $N++,$sum+=$_[$i] if (numberp($_[$i])); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   139
	return ($N>0)?$sum: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 avg(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   143
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   144
	my($N) = my($sum) = 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   145
	for (my($i)=0; $i<=$#_; $i++) { $N++,$sum+=$_[$i] if (numberp($_[$i])); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   146
	return ($N>0)?$sum/$N:nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   147
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   148
10
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   149
#----------------------------------------------------------------------
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   150
# log_avg does the average in log space, which may be useful
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   151
# for log-normal distributions. However, when I tired this
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   152
# in response to a reviewer suggestion, the results were
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   153
# noticably but not significantly worse, even though at least
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   154
# some of the distributions looked quite log-normal.
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   155
# It appears, however, that 32 samples are enough to sample
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   156
# the distribution of dissipation adequately.
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   157
#----------------------------------------------------------------------
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   158
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   159
sub log_avg(@)	# exp(avg(log(x)))
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   160
{
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   161
	my($N) = my($sum) = 0;
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   162
	for (my($i)=0; $i<=$#_; $i++) { $N++,$sum+=log($_[$i]) if (numberp($_[$i])); }
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   163
	return ($N>0)?exp($sum/$N):nan;
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   164
}
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   165
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   166
#----------------------------------------------------------------------
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   167
# noise_avg(noise_lvl,frac)  calculates an arithmetic average after
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   168
# setting all samples below noise level to a certain fraction of the
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   169
# noise level. 66% was used for the VKE paper.
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   170
# Requires $noise_avg to be set, e.g. with &antsFunOpt()
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   171
#----------------------------------------------------------------------
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   172
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   173
sub noise_avg(@)
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   174
{
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   175
	my($nlv,$frac) = split(',',$noise_avg);
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   176
	croak("libstats.pl: noise_avg: cannot decode \$noise_avg = <$noise_avg> <$nlv,$frac> (noise level, fraction)\n")
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   177
		unless ($nlv > 0) && ($frac < 1);
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   178
	my($nsamp) = my($sum) = 0;
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   179
	for (my($i)=0; $i<=$#_; $i++) {
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   180
		if (numberp($_[$i])) {
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   181
			$nsamp++;
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   182
			if ($_[$i]  > $nlv) {
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   183
				$sum += $_[$i];
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   184
			} else {
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   185
				$sum += $frac*$nlv;
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   186
			}
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   187
		}
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   188
	}
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   189
	return ($nsamp > 0) ? $sum/$nsamp : nan;
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   190
}
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   191
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 5
diff changeset
   192
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   193
sub stddev2(@)		# avg, val, val, val, ...
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   194
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   195
	my($N) = my($sum) = 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   196
	for (my($i)=1; $i<=$#_; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   197
		$N++,$sum+=($_[0]-$_[$i])**2 if (numberp($_[$i]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   198
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   199
	return ($N>1)?sqrt($sum/($N-1)):nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   200
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   201
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   202
sub stddev(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   203
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   204
	my($avg) = &avg(@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   205
	return numberp($avg) ? stddev2($avg,@_) : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   206
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   207
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   208
sub rms(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   209
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   210
	my($N) = my($sum) = 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   211
	for (my($i)=0; $i<=$#_; $i++) { $N++,$sum+=$_[$i]**2 if (numberp($_[$i])); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   212
	return ($N>0)?sqrt($sum/$N):nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   213
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   214
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   215
sub median(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   216
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   217
	my(@svals) = sort {$a <=> $b} grep { numberp($_) } @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   218
	return nan if (@svals == 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   219
	return (@svals & 1) ?
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   220
				$svals[$#svals/2] :
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   221
				0.5 * ($svals[$#svals/2] + $svals[$#svals/2+1]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   222
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   223
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   224
sub medianAnts_($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   225
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   226
	my($fnr) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   227
	my(@svals) = sort {@{$a}[$fnr] <=> @{$b}[$fnr]} grep { numberp(@{$_}[$fnr]) } @ants_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   228
	return nan if (@svals == 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   229
	return (@svals & 1) ?
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   230
				$svals[$#svals/2][$fnr] :
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   231
				0.5 * ($svals[$#svals/2][$fnr] + $svals[$#svals/2+1][$fnr]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   232
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   233
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   234
sub mad2(@)		# avg, val, val, val, ...
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   235
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   236
	my($N) = my($sum) = 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   237
	for (my($i)=1; $i<=$#_; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   238
		$N++,$sum+=abs($_[0]-$_[$i]) if (numberp($_[$i]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   239
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   240
	return ($N>0)?sqrt($sum/$N):nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   241
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   242
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   243
sub mad(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   244
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   245
	my($median) = &median(@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   246
	return numberp($median) ? mad2($median,@_) : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   247
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   248
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   249
sub mad2Ants_($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   250
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   251
	my($median,$fnr) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   252
	my($sum,$n);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   253
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   254
	for (my($r)=0; $r<@ants_; $r++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   255
		next unless numberp($ants_[$r][$fnr]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   256
		$sum += abs($median - $ants_[$r][$fnr]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   257
		$n++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   258
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   259
	return ($n>0) ? $sum/$n : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   260
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   261
5
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   262
sub fdiff(@)	# finite difference, e.g. for [rfilt]
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   263
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   264
	return (numberp($_[0]) && numberp($_[$#_])) ? $_[$#_] - $_[0] : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   265
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   266
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   267
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   268
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   269
# &bootstrap(nDraw,cLim,statFun,val[,...])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   270
#		nDraw		number of synthetic samples to draw
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   271
#		cLim		confidence limit (e.g. 0.95)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   272
#		statFun		pointer to stats function
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   273
#		val[,...]	data values
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   274
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   275
# e.g.  bootstrap(1000,.5,\&avg,1,2,1000)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   276
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   277
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   278
sub bootstrap($$$@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   279
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   280
	my($nDraw,$cLim,$statFun,@vals) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   281
	my(@sv,@stats);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   282
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   283
	for (my($s)=0; $s<$nDraw; $s++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   284
		for (my($i)=0; $i<@vals; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   285
			$sv[$i] = $vals[int(rand(@vals))];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   286
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   287
		$stats[$s] = &$statFun(@sv);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   288
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   289
	@stats = sort {$a <=> $b} grep { numberp($_) } @stats;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   290
	my($cli) = int($nDraw*(1-$cLim)/2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   291
	return ($stats[$cli],$stats[$#stats-$cli]);
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
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   295
# &fixLowSampStat(statRef,nsamp[])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   296
#	- replace stat (variance, stddev, stderr) based on small (<10) samples
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   297
#	  with median calculated from all stats
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   298
#	- median of all stats is chosen to allow routine to work even if all
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   299
#	  stats are based on small samples
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   300
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   301
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   302
sub fixLowSampStat($@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   303
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   304
	my($statR,@nsamp) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   305
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   306
	my($medStat) = median(@{$statR});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   307
	for (my($i)=0; $i<@{$statR}; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   308
		$statR->[$i] = $medStat
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   309
			unless ($nsamp[$i]>=10 || !defined($statR->[$i]) || $statR->[$i]>$medStat);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   310
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   311
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   312
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   313
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   314
# significance of difference of means (NR, 2nd ed, 14.2)
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
sub Students_t(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   318
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   319
	my($mu1,$sig1,$N1,$mu2,$sig2,$N2) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   320
		&antsFunUsage(6,"ffcffc","mu1, sigma1, N1, mu2, sigma2, N2",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   321
	my($var1) = $sig1 * $sig1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   322
	my($var2) = $sig2 * $sig2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   323
	my($sd) = sqrt($var1 + $var2 / ($N1+$N2-2) * (1/$N1 + 1/$N2));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   324
	return ($mu1-$mu2) / $sd;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   325
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   326
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   327
sub slevel_mudiff1(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   328
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   329
	my($mu1,$sig1,$N1,$mu2,$sig2,$N2) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   330
		&antsFunUsage(6,"ffcffc","mean1, sqrt(var1), N1, mean2, sqrt(var2), N2",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   331
	my($df) = $N1 + $N2 - 2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   332
	return &betai(0.5*$df,0.5,
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   333
		$df/($df + &Students_t(mu1,$sig1,$N1,$mu2,$sig2,$N2)**2));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   334
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   335
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   336
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   337
# significance of correlation coefficient (NR, 2nd ed, 14.5)
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
sub slevel_r(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   341
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   342
	my($r,$N) = &antsFunUsage(2,"fc","r, N",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   343
	return &erfcc(abs($r) * sqrt($N/2));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   344
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   345
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   346
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   347
# significance of difference btw two measured correlation coeffs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   348
# using Fisher's z (from NR, 2nd ed, 14.5). NB: averaging correlation
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   349
# coefficients is done using [avgr]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   350
# NB: significance level is only good if correlated variables form
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   351
#	  a binormal distribution
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   352
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   353
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   354
sub r2z(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   355
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   356
	my($r) = &antsFunUsage(1,"f","<r>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   357
	return 0.5 * log((1+$r)/(1-$r));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   358
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   359
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   360
sub z2r(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   361
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   362
	my($z) = &antsFunUsage(1,"f","<z>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   363
	my($e) = exp(2*$z);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   364
	return ($e-1) / ($e+1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   365
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   366
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   367
sub slevel_rrtrue(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   368
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   369
	my($r,$N,$rtrue) = &antsFunUsage(3,"fcf","r, N, r_true",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   370
	croak("$0 (libstats.pl): N (=$N) < 10 in &slevel_rrtrue()\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   371
		if ($N < 10);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   372
	return &erfcc(abs(&r2z($r) - (&r2z($rtrue) + $rtrue/(2*$N-2))) *
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   373
				sqrt($N - 3) / sqrt(2));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   374
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   375
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   376
sub slevel_zz(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   377
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   378
	my($z1,$N1,$z2,$N2) = &antsFunUsage(4,"fcfc","z1, N1, z2, N2",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   379
	croak("$0 (libstats.pl): N (=$N1,$N2) < 10 in &slevel_zz()\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   380
		if ($N1 < 10 || $N2 < 10);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   381
	return &erfcc(abs($z1-$z2) / sqrt(2/($N1-3) + 2/($N2-3)));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   382
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   383
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   384
sub slevel_rr(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   385
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   386
	my($r1,$N1,$r2,$N2) = &antsFunUsage(4,"fcfc","r1, N1, r2, N2",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   387
	return &slevel_zz(&r2z($r1),$N1,&r2z($r2),$N2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   388
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   389
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   390
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   391
# significance of difference btw two measured correlation coeffs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   392
# from brookes+dick63, p.216f
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   393
# NB: result is returned as ratio of difference in Fisher's z to
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   394
#	  standard error of Fisher's z; values >> 1 indicate that difference
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   395
#	  is significant
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   396
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   397
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   398
sub sig_rrtrue(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   399
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   400
	my($r,$N,$rtrue) = &antsFunUsage(3,"fcf","r, N, r_true",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   401
	return abs(&r2z($r) - &r2z($rtrue)) * sqrt($N-3);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   402
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   403
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   404
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   405
sub sig_rr(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   406
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   407
	my($r1,$N1,$r2,$N2) = &antsFunUsage(4,"fcfc","r1, N1, r2, N2",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   408
	return abs(&r2z($r1) - &r2z($r2)) / (1/sqrt($N1-3)+1/sqrt($N2-3));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   409
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   410
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   411
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   412
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   413
1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   414