/*
* 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.util;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import org.drugis.addis.entities.Arm;
import org.drugis.addis.entities.BasicMeasurement;
import org.drugis.addis.entities.ContinuousMeasurement;
import org.drugis.addis.entities.ContinuousVariableType;
import org.drugis.addis.entities.Endpoint;
import org.drugis.addis.entities.Measurement;
import org.drugis.addis.entities.RateMeasurement;
import org.drugis.addis.entities.Study;
import org.drugis.addis.entities.relativeeffect.AbstractBasicRelativeEffect;
import org.drugis.addis.entities.relativeeffect.BasicMeanDifference;
import org.drugis.addis.entities.relativeeffect.BasicRiskRatio;
import org.drugis.addis.entities.relativeeffect.ConfidenceInterval;
import org.drugis.addis.util.D80TableGenerator.StatisticType;
public class EndpointForTemplate {
private final Study d_study;
private final Endpoint d_endpoint;
private final Boolean d_isPrimary;
public EndpointForTemplate(Study study, Endpoint endpoint, Boolean isPrimary) {
d_study = study;
d_endpoint = endpoint;
d_isPrimary = isPrimary;
}
public String getType() {
return d_endpoint.getVariableType().getType();
}
public String getPrimary() {
return d_isPrimary ? "Primary" : "Secondary";
}
public String getName() {
return d_endpoint.getName();
}
public String getDescription() {
return d_endpoint.getLabel();
}
public String[] getMeasurements() {
List<String> ms = new ArrayList<String>();
for (Arm a : d_study.getArms()) {
BasicMeasurement measurement = d_study.getMeasurement(d_endpoint, a);
ms.add(measurement == null ? "MISSING" : measurement.toString());
}
return ms.toArray(new String[0]);
}
// These three are not used in Java but called by the template
public String[] getTestStatistics() {
return getStatistics(StatisticType.POINT_ESTIMATE);
}
public String[] getVariabilityStatistics() {
return getStatistics(StatisticType.CONFIDENCE_INTERVAL);
}
public String[] getPValueStatistics() {
return getStatistics(StatisticType.P_VALUE);
}
public String[] getStatistics(StatisticType type) {
List<String> statistics = new ArrayList<String>();
Arm base = d_study.getArms().get(0);
BasicMeasurement baseline = d_study.getMeasurement(d_endpoint, base);
for (Arm a : d_study.getArms().subList(1, d_study.getArms().size())) {
BasicMeasurement subject = d_study.getMeasurement(d_endpoint, a);
statistics.add(getStatistic(type, baseline, subject));
}
return statistics.toArray(new String[0]);
}
private String getStatistic(StatisticType type, BasicMeasurement baseline, BasicMeasurement subject) {
if (baseline == null || subject == null) return "MISSING";
DecimalFormat df = new DecimalFormat("###0.00");
switch(type) {
case CONFIDENCE_INTERVAL :
return formatConfidenceInterval(baseline, subject, df);
case POINT_ESTIMATE :
return formatPointEstimate(baseline, subject, df);
case P_VALUE :
return formatPValue(baseline, subject, df);
default:
throw new RuntimeException("D80 table generator: unknown statistic type.");
}
}
private String formatPValue(BasicMeasurement baseline, BasicMeasurement subject, DecimalFormat df) {
AbstractBasicRelativeEffect<? extends Measurement> relEffect = getRelativeEffect(baseline, subject);
if (relEffect.getTwoSidedPValue() >= 0.01) {
return df.format(relEffect.getTwoSidedPValue());
} else {
return "<0.01";
}
}
private String formatConfidenceInterval(BasicMeasurement baseline, BasicMeasurement subject, DecimalFormat df) {
ConfidenceInterval ci = (getRelativeEffect(baseline, subject)).getConfidenceInterval();
return "(" + df.format(ci.getLowerBound()) + ", " + df.format(ci.getUpperBound()) + ")";
}
private String formatPointEstimate(BasicMeasurement baseline, BasicMeasurement subject, DecimalFormat df) {
ConfidenceInterval ci = (getRelativeEffect(baseline, subject)).getConfidenceInterval();
return df.format(ci.getPointEstimate());
}
private AbstractBasicRelativeEffect<? extends Measurement> getRelativeEffect(BasicMeasurement baseline, BasicMeasurement subject) {
return (d_endpoint.getVariableType() instanceof ContinuousVariableType ?
new BasicMeanDifference((ContinuousMeasurement)baseline, (ContinuousMeasurement)subject) :
new BasicRiskRatio((RateMeasurement) baseline, (RateMeasurement) subject));
}
public String getTestStatisticType() {
return d_endpoint.getVariableType() instanceof ContinuousVariableType ? "Mean Difference" : "Risk Ratio";
}
}