package com.compomics.util.math.roc; import com.compomics.util.math.statistics.Distribution; import com.compomics.util.math.statistics.ROC; import org.apache.commons.math.MathException; /** * This class can be used to draw roc curves from experimental data. * * @author Marc Vaudel */ public class DistributionRoc implements ROC { /** * The control distribution. */ private final Distribution distributionControl; /** * The patient distribution. */ private final Distribution distributionPatient; /** * Constructor. The patient distribution should be higher (to the right) * than the control distribution. * * @param distributionControl the control distribution * @param distributionPatient the patient distribution */ public DistributionRoc(Distribution distributionControl, Distribution distributionPatient) { this.distributionControl = distributionControl; this.distributionPatient = distributionPatient; } @Override public double getValueAt(double specificity) throws MathException { double x = distributionPatient.getValueAtCumulativeProbability(specificity); return distributionControl.getCumulativeProbabilityAt(x); } @Override public double getSpecificityAt(double sensitivity) throws MathException { double x = distributionControl.getValueAtCumulativeProbability(sensitivity); return distributionPatient.getCumulativeProbabilityAt(x); } @Override public double[][] getxYValues() throws MathException { double[][] result = new double[101][2]; for (int i = 0; i <= 100; i++) { double x = ((double) i) / 100; double y = getValueAt(x); result[i][0] = x; result[i][1] = y; } return result; } @Override public double getAuc() throws MathException { int nBins = 1000; double binSize = 1.0 / nBins; double halfBin = binSize / 2; double auc = 0.0; for (int i = 0; i < nBins; i++) { double x = i * binSize + halfBin; double y = getValueAt(x); auc += y; } auc *= binSize; return auc; } }