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