2011-08-28 112 views

回答

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
$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); 
}