<?php
/*
* This is a statistic class that accepts one or two unidimensional arrays of data.
* It returns a stat array using the getStats() method.
* If only one array is sent, it will return the min,max, sum, median, average and standard
* deviation for this array. If two arrays are sent, in addition to these values for both
* arrays, a linear regression line is computed: m is the slope b is the Yaxis intersect,
* r is the correlation, a measure of the quality of the data fit by the regression line (r=1
* being a perfect fit) and t is the "t"test, to test whether the association between X and Y
* data is real or merely apparent, I leave the user to interpret this test himself. (See the
* tutorial and the table at: http://www.bmj.com/collections/statsbk/apptabb.html).
* The regression line will be calculated only if both arrays have the same number of samples.
* Note that it is the responsibility of the user to make sure that his data are in linear form
* (For the linear regression to work, Median and Average values should be close).
* I tried to use the histogram class wrote by Jesus Castagnetto as an inheritance for
* this script, but it was too complicated since that I needed two arrays. Probably the other
* way around, using Stat1 as an inheritance for an histogram class, will be easier now.
* Tested with PHP4 beta 4.
* (c) Alain M. Samoun 3/12/00 alain@samoun.com
* License: Same as the GNU's Free Software Foundation or the open source PHP license as you
prefer;).
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
*/
class Stat1 {
/* variables */
var $N,$NY,$MINX,$MAXX,$MAXY,$MINY,$AVGX,$AVGY,$STDVX,$STDVY,$SUMX,$SUMY,$SUMX2,$SUMY2,$SUMXY;
var $X = array(),$Y = array();
var $MEDX,$MEDY,$DEV,$m,$b,$r;
var $STATS = array();
/* Constructor */
function Stat1($X="", $Y="",$DEV=0, $title="") {
if ($X && $Y && $title) {
$this>create($X,$Y,$title);
}
}
/* Create the class */
function create($X,$Y,$title="") {
/* Check if we got a valid set of data*/
(($this>N = count($X)) > 1) or die("Not enough data, number of values : ".$this>N."\n");
/* initialize values */
$this>MINX = (float) min($X);
$this>MAXX= (float) max($X);
/* Compute X Median */
# Sort values in array X
$XX = $X;
sort ($XX);
if ($this>N%2 == 0){
$this>MEDX = (($XX[($this>N)/2])+($XX[1+($this>N/2)]))/2;
}else{
$this>MEDX = $XX[floor($this>N/2)];
}
$this>NY = count($Y);
$this>MINY = (float) min($Y);
$this>MAXY= (float) max($Y);
/* Compute Y Median */
# Sort values in array Y
$YY = $Y;
sort ($YY);
if ($this>NY%2 == 0){
$this>MEDY = (($YY[($this>NY)/2])+($YY[1+($this>NY/2)]))/2;
}else{
$this>MEDY = $YY[floor($this>NY/2)];
}
$this>setTitle($title);
/* stats */
for ($i = 0; $i < $this>N ; $i++) {
$this>SUMX += (float) $X[$i];
$this>SUMX2 += (float) pow($X[$i],2);
$this>SUMXY += (float) $X[$i]* (float)$Y[$i];
}
$this>AVGX = (float) $this>SUMX/ (float) $this>N;
$this>STDVX = (float) sqrt(($this>SUMX2  $this>N*pow($this>AVGX,2))/(float)($this>N  1));
for ($i = 0; $i < $this>NY ; $i++) {
$this>SUMY += (float) $Y[$i];
$this>SUMY2 += (float) pow($Y[$i],2);
}
$this>AVGY = (float) $this>SUMY/ (float)$this>NY;
$this>STDVY = (float) sqrt(($this>SUMY2  $this>NY*pow($this>AVGY,2))/(float)($this>NY  1));
if ($this>NY == $this>N){
$this>DEV = (float) (($this>SUMX2 * $this>N) ($this>SUMX * $this>SUMX));
$this>m = (float)(($this>SUMXY * $this>N) ($this>SUMX * $this>SUMY))/$this>DEV;
$this>b = (float)(($this>SUMX2 * $this>SUMY) ($this>SUMXY * $this>SUMX))/$this>DEV;
$this>r = (float) ($this>SUMXY ($this>N * $this>AVGX * $this>AVGY))/(($this>N1)*$this>STDVX * $this>STDVY);
$this>t = (float) $this>r * sqrt(($this>N 2)/(1 pow($this>r,2)));
}
/* make the STATS array */
$this>STATS = array (
N=>$this>N,
NY=>$this>NY,
MINX=>$this>MINX,
MAXX=>$this>MAXX,
SUMX=>$this>SUMX,
MEDX=>$this>MEDX,
AVGX=>$this>AVGX,
STDVX=>$this>STDVX,
MINY=>$this>MINY,
MAXY=>$this>MAXY,
SUMY=>$this>SUMY,
MEDY=>$this>MEDY,
AVGY=>$this>AVGY,
STDVY=>$this>STDVY,
m=>$this>m,
b=>$this>b,
r=>$this>r,
t=>$this>t
);
}
/* sets the Title */
function setTitle($title) {
$this>TITLE=$title;
}
/* send back STATS array */
function getStats() {
return $this>STATS;
}
/* simple printStats */
function printStats() {
$s = "Statistics for : ".$this>TITLE."\n";
$s .= "Number of data in X axis: $this>N \n";
$s .= sprintf("Min = %2.4f\tMax = %2.4f\tAvg = %2.4f\tMED = %2.4f\tStDev = %2.4f \n",$this>MINX,$this>MAXX,$this>AVGX,$this>MEDX, $this>STDVX );
$s .= "\nNumber of data in Y axis: $this>NY \n";
$s .= sprintf("Min = %2.4f\tMax = %2.4f\tAvg = %2.4f\tMED = %2.4f\tStDev = %2.4f \n",$this>MINY,$this>MAXY,$this>AVGY,$this>MEDY, $this>STDVY );
if($this>NY ==$this>N){
$s .= "\nLinear regression line: \n";
if ($this>b >=0){
$s .= "Y = $this>m X + $this>b with correlation (r)= $this>r\n \"t\"test (df=$this>N2) = $this>t";
}else{
$s .= "Y = $this>m X $this>b with correlation (r)= $this>r\n \"t\"test (df=$this>N2) = $this>t";
}
}
echo $s;
}
} /* end of Stat1 class */
?>
