BioPHP - Sensibility and Specificity of diagnostic tests
Original code submitted by josebaCode bellow is covered by GNU GPL v2 license.
Description
Last change: 2010/10/18 21:09 | Recent Changes | Original descriptionComputes Sensitivity, Specificity, Positive Predictive Value, Negative Predictive Value,Positive Likelihood Ratio and Negative Likelihood Ratio .
Code
Last change: 2016/10/28 21:41 | Recent Changes | Download | Original code and<html>
<head>
<title>Sensitivity and Specificity of diagnostic tests</title>
</head>
<body bgcolor=FFFFFF>
<center>
<h1>Sensitivity and Specificity of diagnostic tests</h1>
<?php
// author Joseba Bikandi
// license GNU GPL v2
// biophp.org
error_reporting(0);
// if formula is requested, show it
if ($_GET["show"]=="formula"){print_formula();die;}
if (!$_POST){
// when nothing is posted, this data is used as an example
$TP=88;
$FP=7;
$TN=12;
$FN=15;
}else{
// when data is posted, get the data
$TP=$_POST["TP"];
$FP=$_POST["FP"];
$TN=$_POST["TN"];
$FN=$_POST["FN"];
}
$sensitivity =$TP/($TP+$FN);
$specificity=$TN/($TN+$FP);
$PPV=$TP/($TP+$FP);
$NPV=$TN/($TN+$FN);
$LRp = $sensitivity / (1-$specificity);
$LRn = (1-$sensitivity) / $specificity;
print_form($TP,$FP,$TN,$FN);
print_results($sensitivity,$specificity,$PPV,$NPV,$LRp,$LRn);
//########print form
function print_form($TP,$FP,$TN,$FN){
?>
<form action="<?php print $_SERVER["PHP_SELF"]; ?>" method=post>
<table border="1" cellpadding="0" cellspacing="2" bgcolor=EEEEFF>
<tbody>
<tr>
<td rowspan=2 colspan=2></td>
<td colspan=2 align=center bgcolor=AAAAAA>Disease</td>
<td rowspan=2></td>
</tr>
<tr>
<td align=center bgcolor=AAAAFF>Positive</td>
<td align=center bgcolor=AAAAFF>Negative</td>
</tr>
<tr>
<td rowspan=2 align=center bgcolor=AAAAAA>Test</td>
<td align=center bgcolor=AAAAFF>Positive</td>
<td align=center bgcolor=DDDDFF>True Positive (TP)<br><input type=text name=TP value="<?php print $TP; ?>" size=5></td>
<td align=center bgcolor=DDDDFF>False Positive (FP)<br><input type=text name=FP value="<?php print $FP; ?>" size=5></td>
<td align=center>TP + FP<br><b><?php print $TP+$FP; ?></b></td>
</tr>
<tr>
<td align=center bgcolor=AAAAFF>Negative</td>
<td align=center bgcolor=DDDDFF>False Negative (FN)<br><input type=text name=FN value="<?php print $FN; ?>" size=5></td>
<td align=center bgcolor=DDDDFF>True Negative (TN)<br><input type=text name=TN value="<?php print $TN; ?>" size=5></td>
<td align=center>FN + TN<br><b><?php print $FN+$TN; ?></b></td>
</tr>
<tr>
<td colspan=2></td>
<td align=center>TP + FN<br><b><?php print $TP+$FN; ?></b></td>
<td align=center>FP + TN<br><b><?php print $FP+$TN; ?></b></td>
<td align=center><?php print $TP+$FN+$FP+$TN; ?></td>
</tr>
</tbody>
</table>
<input type=submit value=Submit>
</form>
<?php
}
//######## print results
function print_results($sensitivity,$specificity,$PPV,$NPV,$LRp,$LRn){
?>
<table>
<tr><td><a href=?show=formula>Sensitivity:</a></td><td><?php print $sensitivity; ?></td></tr>
<tr><td><a href=?show=formula>Specificity:</a></td><td><?php print $specificity; ?></td></tr>
<tr><td><a href=?show=formula>Positive Predictive Value (PPV):</a></td><td><?php print $PPV; ?></td></tr>
<tr><td><a href=?show=formula>Negative Predictive Value (NPV):</a></td><td><?php print $NPV; ?></td></tr>
<tr><td><a href=?show=formula>Likelihood Ratio Positive (LR+):</a></td><td><?php print $LRp; ?> </td></tr>
<tr><td><a href=?show=formula>Likelihood Ratio Negative (LR-):</a></td><td><?php print $LRn; ?></td></tr>
</table>
<?php
}
// #################### print example
function print_formula(){
?>
<table width=600>
<tr><td>
<b>Sensitivity</b>
<p>The probability of the test finding disease among those who have the disease
or the proportion of people with disease who have a positive test result.
<p> Sensitivity = true positives / (true positives + false negatives)
<hr>
<b>Specificity</b>
<p>The probability of the test finding NO disease among those who do NOT have
the disease or the proportion of people free of a disease who have a negative test.
<p> Specificity = true negatives / (true negatives + false positives)
<hr>
<b>Positive Predictive Value (PPV)</b>
<p>The percentage of people with a positive test result who actually have the disease.
<p> Positive predictive value = true positives / (true positives + false positives)
<hr>
<b>Negative Predictive Value (NPV)</b>
<p>The percentage of people with a negative test who do NOT have the disease.
<p> Negative predictive value = true negatives / (true negatives + false negatives)
<hr>
<b>Likelihood Ratio Positive (LR+)</b>
<p>The odds that a positive test result would be found in a patient with,
versus without, a disease.
<p> Likelihood Ratio Positive (LR+) = Sensitivity / (1 - Specificity).
<hr>
<b>Likelihood Ratio Negative (LR-)</b>
<p>The odds that a negative test result would be found in a patient without,
versus with, a disease.
<p> Likelihood Ratio Negative (LR-) = (1- Sensitivity) / Specificity.
<hr>
<div align=right><a href="<? print $_SERVER["PHP_SELF"]; ?>">Go back to this tool</a></div>
</td></tr>
</table>
<?php
}
function sum ($nums) {
$temp = 0;
foreach ($nums as $key => $val) {
$temp += $val;
}
return $temp;
}
function sum2 ($nums) {
$temp = 0;
foreach ($nums as $key => $val) {
$temp += pow($val,2);
}
return $temp;
}
function mean ($nums) {
$temp = 0;
foreach ($nums as $key => $val) {
$temp += $val;
}
return $temp/sizeof($nums);;
}
function median ($nums) {
$n = count($nums);
sort($nums);
if ($n & 1) {
return $nums [($n-1)/2];
} else {
return ($nums [($n-1)/2] + $nums [$n/2])/2;
}
}
function mode ($nums) {
foreach ($nums as $key => $val) {
$counts[$val]++;
}
arsort($counts);
if (count($nums)==count($counts)){
return "frequency for each data is 1";
}else{
return key($counts);
}
}
function variance ($nums) {
$n = count($nums);
$mean = mean($nums);
foreach ($nums as $key => $val) {
$temp += pow($val - $mean, 2);
}
return $temp/$n;
}
function sd ($nums) {
return sqrt(variance($nums));
}
function skewness ($nums) {
$n = count($nums);
$mean = mean($nums);
$sd = sd($nums);
foreach ($nums as $key => $val) {
$temp += pow(($val - $mean), 3);
}
$s = $temp/(($n - 1)*pow($sd,3));
return $s;
}
function kurtosis ($nums) {
$n = count($nums);
$mean = mean($nums);
$sd = sd($nums);
foreach ($nums as $key => $val) {
$temp += pow(($val - $mean), 4);
}
$s = ($temp/(($n - 1)*pow($sd,4)))-3;
return $s;
}
?>
<hr>
Source code is available at <a href=http://www.biophp.org/stats/sensitivity_specificity/>biophp.org</a>
</center>
</body>
</html>