/*
* This file is part of ADDIS (Aggregate Data Drug Information System).
* ADDIS is distributed from http://drugis.org/.
* Copyright © 2009 Gert van Valkenhoef, Tommi Tervonen.
* Copyright © 2010 Gert van Valkenhoef, Tommi Tervonen, Tijs Zwinkels,
* Maarten Jacobs, Hanno Koeslag, Florin Schimbinschi, Ahmad Kamal, Daniel
* Reid.
* Copyright © 2011 Gert van Valkenhoef, Ahmad Kamal, Daniel Reid, Florin
* Schimbinschi.
* Copyright © 2012 Gert van Valkenhoef, Daniel Reid, Joël Kuiper, Wouter
* Reckman.
* Copyright © 2013 Gert van Valkenhoef, Joël Kuiper.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.drugis.addis.entities.analysis;
import org.drugis.addis.entities.OutcomeMeasure;
import org.drugis.addis.entities.RateVariableType;
import org.drugis.common.Interval;
/**
* Converts (odds-ratio) measurement scales to clinically interpretable numbers.
* Should not be used for continuous variables.
*/
public class OddsRatioToClinicalConverter {
private final MetaBenefitRiskAnalysis d_br;
private final OutcomeMeasure d_om;
public OddsRatioToClinicalConverter(MetaBenefitRiskAnalysis br, OutcomeMeasure om) {
d_br = br;
d_om = om;
if (!(om.getVariableType() instanceof RateVariableType)) throw new IllegalArgumentException("Only rate-outcomes supported");
if (!br.getCriteria().contains(om)) throw new IllegalArgumentException("OutcomeMeasure not present in Benefit-Risk analysis");
}
/**
* Converts the extremes of the measurement scale to odds-ratio.
* @param scale Measurement scale.
* @return OR associated with the extremes of the scale.
*/
public Interval<Double> getOddsRatio(Interval<Double> scale) {
return scale;
}
/**
* Converts the extremes of the measurement scale to (absolute) risk.
* This number is based on the median of the baseline distribution given in the BenefitRiskAnalysis.
* @param scale Measurement scale.
* @return Risk associated with the extremes of the scale.
*/
public Interval<Double> getRisk(Interval<Double> scale) {
double baselineOdds = d_br.getBaselineDistribution(d_om).getQuantile(0.5); // or: 1.0 for absolute measurements
double oddsL = scale.getLowerBound() * baselineOdds;
double oddsU = scale.getUpperBound() * baselineOdds;
return new Interval<Double>(oddsToRisk(oddsL), oddsToRisk(oddsU));
}
/**
* Calculates the risk difference associated with scale.
* This number is based on the median of the baseline distribution given in the BenefitRiskAnalysis.
* @param scale Measurement scale.
* @return RD associated with the scale range.
*/
public double getRiskDifference(Interval<Double> scale) {
Interval<Double> risk = getRisk(scale);
return risk.getUpperBound() - risk.getLowerBound();
}
/**
* Calculates the number needed to treat associated with the difference between upper and lower bound of the scale.
* In case the OutcomeMeasure has direction LOWER_IS_BETTER, this should be interpreted as number needed to harm.
* This number is based on the median of the baseline distribution given in the BenefitRiskAnalysis.
* @param scale Measurement scale.
* @return NNT associated with the range.
*/
public double getNumberNeededToTreat(Interval<Double> scale) {
return 1d / getRiskDifference(scale);
}
private static double oddsToRisk(double odds) {
return odds / (1 + odds);
}
}