pearsn.pl
author Andreas Thurnherr <ant@ldeo.columbia.edu>
Mon, 13 Apr 2020 11:06:22 -0400
changeset 40 c1803ae2540f
parent 0 a5233793bf69
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
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     2
#                    P E A R S N . P L 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    doc: Wed Mar 24 11:23:29 1999
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     4
#                    dlm: Mon Jul 24 15:02:14 2006
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
#                    (c) 1999 A.M. Thurnherr
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     6
#                    uE-Info: 26 0 NIL 0 0 72 66 2 4 NIL ofnI
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 from NR c-version
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
#	Mar 26, 1999: - cosmetic changes
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
#	May 23, 1999: - allowed for N==2
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
#	Oct 04, 1999: - changed from specfuns to funs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
#	Oct 13, 1999: - BUG: had to change TINY from 1e-20 to 1e-19
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#	Nov 11, 1999: - BUG: had to change TINY from to 1e-16
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
#	Dec 11, 2001: - BUG: NaNs had not been handled correctly
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
#	Dec 12, 2001: - BUG: croak() had been used (this produces
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
#						 a pipe #ERROR# output which is wrong
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
#						 if pearsn is called within eval as in [fit])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
#	Jan  9, 2006: - removed @antsFlagged
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
require "$ANTS/libfuns.pl";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
{											# static scope
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
my($TINY) = 1e-16;							# for complete correlation
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
# get correlation coefficient (retval); N (ref); significance level at which 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
# null hypothesis of zero correlation is disproved (ref; small value
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
# indicates significant correlation); and Fisher's z (ref). Missing refs
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
# indicate values are not returned. Adapted for ANTS.
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
sub pearsn(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
	my($xfnr,$yfnr,$NR,$pR,$zR) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
	my($n,$r);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
	my($j);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
	my($yt,$xt,$t,$df);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
	my($syy,$sxy,$sxx,$ay,$ax);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
	for ($j=0; $j<=$#ants_; $j++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
		next unless (numberp($ants_[$j][$xfnr]) && numberp($ants_[$j][$yfnr]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
		$n++;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
		$ax += $ants_[$j][$xfnr];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
		$ay += $ants_[$j][$yfnr];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
	die("$0 (pearsn.pl): no data\n") unless ($n >= 2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
	$ax /= $n;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
	$ay /= $n;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
	for ($j=0; $j<=$#ants_; $j++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
		next unless (numberp($ants_[$j][$xfnr]) && numberp($ants_[$j][$yfnr]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
		$xt = $ants_[$j][$xfnr] - $ax;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
		$yt = $ants_[$j][$yfnr] - $ay;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
		$sxx += $xt * $xt;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
		$syy += $yt * $yt;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
		$sxy += $xt * $yt;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
	$r   = $sxy/(sqrt($sxx * $syy) + $TINY);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
	$df  = $n - 2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
	$t   = $r * sqrt($df/((1-$r+$TINY) * (1+$r+$TINY)));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
	$$NR = $n if (defined($NR));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
	$$pR = ($n == 2) ? 0 : &betai(0.5*$df,0.5,$df/($df+$t*$t))
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
		if (defined($pR));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
	$$zR = 0.5 * log((1+$r+$TINY) / (1-$r+$TINY))
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
		if (defined($zR));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
	return $r;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
}													# end of static scope