Kategorien
PHP

PHP Analyse von Stichproben mit Pearsons C

Zur Analyse eine Stichprobe oder einfacher gesagt, wenn man von bestehenden Daten Rückschlüsse auf andere Daten machen will, kann man je nach Typ der Daten verschiedene statistische Zusammenhangskennzahlen berechnen. Da PHP leider so gut wie keine brauchbare Bibliothek für eine statistische Auswertung bietet, habe ich die Berechnung von Pearsons C bzw. des Korrigierter Kontingenzkoeffizient nach Pearson selber implementiert sowie die nötige Berechnung von Chi-Quadrat:

class CorrelationRatio
{
    private $dataMatrix;

    public function setDataMatrix($matrix)
    {
        $this->dataMatrix = $matrix;
    }
    public function getPearsonC()
    {
        $chiSquareObject = new ChiSquare();
        if($chiSquareObject->setDataMatrix($this->dataMatrix))
        {
            $chiSquare = $chiSquareObject->getChiSquareValue();
            $nenner = $chiSquare + $chiSquareObject->getSumAllValuesN();
            return sqrt($chiSquare / $nenner);

        }
        return false;

    }
    public function getPearsonCCorrected()
    {
        $pearsonC = $this->getPearsonC();
        /*dump("Pearson C: ".$pearsonC);*/
        $k = $this->getMinimumDifferentAttributs();
        $pearsonCCorrected = sqrt($k / ($k - 1)) * $pearsonC;
        /*dump("Pearson C Corrected: ".$pearsonCCorrected);*/
        return $pearsonCCorrected;
    }
    private function getMinimumDifferentAttributs()
    {
        $rows = count($this->dataMatrix[0]);
        $colums = count($this->dataMatrix);
        return min(array($rows, $colums));
    }
}

die Berechnung von Chi-Quadrat in PHP:

class ChiSquare
{
    private $dataMatrix;

    public function setDataMatrix($matrix)
    {
        if(!is_array($matrix) || !is_array($matrix[0]) || !is_array($matrix[1]) ||
            count($matrix[0]) != count($matrix[1]))
        {
            //handleError("sorry, no valid input", __LINE__, __FILE__);
            dump($matrix);
            return false;
        }
        else
        {
            $this->dataMatrix = $matrix;
        }
        return true;
    }

    public function getChiSquareValue()
    {
        /*dump("Calculate ChiSquare");*/
        $chiSquare = 0;
        $n = $this->getSumAllValuesN();
        for($i = 0; $i < count($this->dataMatrix); $i++)
        {
            $sumI = $this->getSumRow($i);
            for($j = 0; $j < count($this->dataMatrix[$i]); $j++)
            {
                $sumJ = $this->getSumColumn($j);
                $term = ($sumI * $sumJ) / $n;
                if($term != 0)
                {
                    $chiSquare += pow($this->dataMatrix[$i][$j] - $term, 2) / ($term);
                }

            }
        }
        /*dump("Chi Square:".$chiSquare);*/
       return $chiSquare;
    }
    private function getSumRow($row)
    {
        $sumRow = 0;
        for($i = 0; $i < count($this->dataMatrix[$row]); $i++)
        {
            $sumRow += $this->dataMatrix[$row][$i];
        }
        return $sumRow;
    }
    private function getSumColumn($column)
    {
        $sumColumn = 0;
        for($i = 0; $i < count($this->dataMatrix); $i++)
        {
            $sumColumn += $this->dataMatrix[$i][$column];
        }
        return $sumColumn;
    }
    public function getSumAllValuesN()
    {
        $n = 0;
        for($i = 0; $i < count($this->dataMatrix); $i++)
        {
            for($j = 0; $j < count($this->dataMatrix[$i]); $j++)
            {
                $n += $this->dataMatrix[$i][$j];
            }
        }
        return $n;
    }
}