2011-08-28 3 views
2

PHP를 사용하여 숫자 배열의 z- 점수를 계산하려면 어떻게해야합니까? z- 점수를 계산 한 다음 백분위 수 (CDF)를 찾아야합니다! 어떤 PHP 함수를 사용할 수 있습니까? 감사!PHP 통계 z- 점수 정규 분포

답변

2

다음 코드는 CDF (아브라모 위츠 & Stegun (1964))

function normal_pdf($x) { 
    return exp(-$x * $x/4)/sqrt(2 * M_PI); 
} 

function normal_cdf($x) { 
    $b = array(0.2316419, 0.319381530, -0.356563782, 1.781477937, -1.821255978, 1.330274429); 
    $t = 1/(1 + $b[0] * $x); 
    $result = 0; 
    for ($i = 1; $i < 6; $i++) { 
     $result += $b[$i] * pow($t, $i); 
    } 
    return 1 - normal_pdf($x) * $result; 
} 

이 표준 정규 분포를 가정의 좋은 근사치를 제공 할 것입니다. 즉 표준화 기억 z = (x - mean)/(standard deviantion)

+1

normal_cdf 기능이 올바르지 않습니다. x의 일부 값에 대해 음의 값을 제공합니다. –

0

을 (를) 원할 경우 PHP statistics extension에 몇 가지 기능이 있습니다.

+0

내가 그 기능을 잘 설명되지 않지만 보인다 stats_cdf_binomial 필요 사용 .. 심지어 그 함수의 인수가 무엇인지 모르는 .. –

0
$control=array(15,7); 
$treatment=array(46,8); 
$confidence=number_format(cumnormdist(zscore($control, $treatment))*100,0); 

function cr($t) 
{ 
    return $t[1]/$t[0]; 
} 

function zscore($c, $t) 
{ 
    $z = cr($t)-cr($c); 
    $s = (cr($t)*(1-cr($t)))/$t[0] + (cr($c)*(1-cr($c)))/$c[0]; 
    return $z/sqrt($s); 
} 

function cumnormdist($x) 
{ 
    $b1 = 0.319381530; 
    $b2 = -0.356563782; 
    $b3 = 1.781477937; 
    $b4 = -1.821255978; 
    $b5 = 1.330274429; 
    $p = 0.2316419; 
    $c = 0.39894228; 

    if($x >= 0.0) { 
     $t = 1.0/(1.0 + $p * $x); 
     return (1.0 - $c * exp(-$x * $x/2.0) * $t * 
     ($t *($t * ($t * ($t * $b5 + $b4) + $b3) + $b2) + $b1)); 
    } 
    else { 
     $t = 1.0/(1.0 - $p * $x); 
     return ($c * exp(-$x * $x/2.0) * $t * 
     ($t *($t * ($t * ($t * $b5 + $b4) + $b3) + $b2) + $b1)); 
    } 
} 
1
/* Mean */ 
function mean($input_array) 
{ 
    $total = 0; 
    foreach ($input_array as $value) 
    { 
    $total += $value; 
    } 
    return ($total/count($input_array)); 
} 

/* Standard Deviation */ 
function std($arr) 
{ 
    if (!count($arr)) 
    return 0; 
    $mean = mean($arr); 
    $sos = 0; // Sum of squares 
    for ($i = 0; $i < count($arr); $i++) 
    { 
    $sos += ($arr[$i] - $mean) * ($arr[$i] - $mean); 
    } 
    return sqrt($sos/(count($arr) - 1)); 
} 

/* Z Scores */ 
function z($var, $arr) 
{ 
    return ($var -mean($arr))/std($arr); 
}