/*
* 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 static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.drugis.addis.ExampleData;
import org.drugis.addis.entities.AdverseEvent;
import org.drugis.addis.entities.Arm;
import org.drugis.addis.entities.BasicRateMeasurement;
import org.drugis.addis.entities.ContinuousMeasurement;
import org.drugis.addis.entities.Endpoint;
import org.drugis.addis.entities.Entity;
import org.drugis.addis.entities.Indication;
import org.drugis.addis.entities.OutcomeMeasure;
import org.drugis.addis.entities.RateMeasurement;
import org.drugis.addis.entities.Study;
import org.drugis.addis.entities.analysis.BenefitRiskAnalysis.AnalysisType;
import org.drugis.addis.entities.relativeeffect.BasicOddsRatio;
import org.drugis.addis.entities.relativeeffect.BasicStandardisedMeanDifference;
import org.drugis.addis.entities.relativeeffect.Beta;
import org.drugis.addis.entities.relativeeffect.TransformedStudentT;
import org.drugis.addis.entities.relativeeffect.TransformedStudentTBase;
import org.junit.Before;
import org.junit.Test;
public class StudyBenefitRiskAnalysisTest {
private static final String NAME = "Je Moeder";
private StudyBenefitRiskAnalysis d_analysis;
private Arm d_baseline;
private Arm d_subject;
@Before
public void setUp() {
Indication indication = ExampleData.buildIndicationDepression();
Study study = ExampleData.buildStudyChouinard();
List<OutcomeMeasure> criteria = new ArrayList<OutcomeMeasure>();
criteria.add(ExampleData.buildEndpointHamd());
criteria.add(ExampleData.buildEndpointCgi());
List<Arm> alternatives = study.getArms();
d_analysis = new StudyBenefitRiskAnalysis(NAME, indication, study, criteria, alternatives, AnalysisType.SMAA);
d_baseline = alternatives.get(0);
d_subject = alternatives.get(1);
}
@Test
public void testInitialization() {
assertEquals(NAME, d_analysis.getName());
assertEquals(ExampleData.buildStudyChouinard(), d_analysis.getStudy());
List<OutcomeMeasure> criteria = new ArrayList<OutcomeMeasure>();
criteria.add(ExampleData.buildEndpointCgi());
criteria.add(ExampleData.buildEndpointHamd());
assertEquals(criteria, d_analysis.getCriteria());
assertEquals(ExampleData.buildStudyChouinard().getArms(), d_analysis.getAlternatives());
assertEquals(d_analysis.getAlternatives().get(0), d_analysis.getBaseline());
StudyBenefitRiskAnalysis analysis = buildOtherBaseline();
assertEquals(d_analysis.getAlternatives().get(1), analysis.getBaseline());
}
private StudyBenefitRiskAnalysis buildOtherBaseline() {
return new StudyBenefitRiskAnalysis(d_analysis.getName(), d_analysis.getIndication(), d_analysis.getStudy(),
d_analysis.getCriteria(), d_analysis.getAlternatives().get(1), d_analysis.getAlternatives(), d_analysis.getAnalysisType());
}
@Test(expected=IllegalArgumentException.class)
public void testBadInitialization() {
List<OutcomeMeasure> criteria = new ArrayList<OutcomeMeasure>();
criteria.add(ExampleData.buildEndpointHamd());
criteria.add(ExampleData.buildAdverseEventConvulsion());
criteria.add(ExampleData.buildAdverseEventSexualDysfunction());
new StudyBenefitRiskAnalysis("Test SBA", ExampleData.buildIndicationDepression(),
ExampleData.buildStudyFava2002(), criteria, ExampleData.buildStudyFava2002().getArms(), AnalysisType.SMAA);
}
@Test
public void testDependencies() {
Set<Entity> expected = new HashSet<Entity>();
expected.add(d_analysis.getStudy());
expected.addAll(d_analysis.getCriteria());
expected.add(d_analysis.getIndication());
expected.addAll(d_analysis.getStudy().getDependencies());
assertEquals(expected , d_analysis.getDependencies());
}
@Test
public void testCompareTo() {
assertTrue(d_analysis.compareTo(null) > 0);
assertEquals(0, d_analysis.compareTo(d_analysis));
MetaBenefitRiskAnalysis otherBRAnalysis = ExampleData.buildMetaBenefitRiskAnalysis();
assertTrue(d_analysis.compareTo(otherBRAnalysis) < 0);
assertTrue(otherBRAnalysis.compareTo(d_analysis) > 0);
}
@Test
public void testDeepEquals() {
assertFalse(d_analysis.deepEquals(buildOtherBaseline()));
}
@Test
public void testGetMeasurementForRateOutcome() {
Study study = d_analysis.getStudy();
Arm arm = study.getArms().get(0);
Endpoint endpoint = ExampleData.buildEndpointHamd();
RateMeasurement measurement = (RateMeasurement) study.getMeasurement(endpoint, arm);
Beta expected = new Beta(1 + measurement.getRate(), 1 + measurement.getSampleSize() - measurement.getRate());
assertEquals(expected, d_analysis.getMeasurement(endpoint, arm));
}
@Test
public void testGetMeasurementForContinuousOutcome() {
Indication indication = ExampleData.buildIndicationDepression();
Study study = ExampleData.buildStudyChouinard();
List<OutcomeMeasure> criteria = new ArrayList<OutcomeMeasure>();
Endpoint endpoint = ExampleData.buildEndpointCgi();
criteria.add(endpoint);
criteria.add(ExampleData.buildAdverseEventConvulsion());
List<Arm> alternatives = study.getArms();
d_analysis = new StudyBenefitRiskAnalysis(NAME, indication, study, criteria, alternatives, AnalysisType.SMAA);
Arm arm = study.getArms().get(1);
ContinuousMeasurement measurement = (ContinuousMeasurement) study.getMeasurement(endpoint, arm);
TransformedStudentTBase expected = new TransformedStudentT(measurement.getMean(), measurement.getStdDev() / Math.sqrt(measurement.getSampleSize()),
measurement.getSampleSize() - 1);
assertEquals(expected, d_analysis.getMeasurement(endpoint, arm));
}
@Test
public void testLyndOBrienException() throws IllegalArgumentException {
Indication indication = ExampleData.buildIndicationDepression();
Study study = ExampleData.buildStudyChouinard();
List<OutcomeMeasure> criteria = new ArrayList<OutcomeMeasure>();
criteria.add(ExampleData.buildEndpointHamd());
criteria.add(ExampleData.buildAdverseEventConvulsion());
List<Arm> alternatives = new ArrayList<Arm>();
alternatives.add(study.getArms().get(0));
boolean caught = false;
try {
new StudyBenefitRiskAnalysis(NAME, indication, study, criteria, alternatives, AnalysisType.LyndOBrien);
} catch(IllegalArgumentException e)
{ caught = true;}
assertTrue(caught);
}
@Test
public void testRelativeEffectDistribution() {
OutcomeMeasure v = d_analysis.getCriteria().get(1);
BasicOddsRatio ratio = new BasicOddsRatio((RateMeasurement) d_analysis.getStudy().getMeasurement(v, d_baseline),
(RateMeasurement) d_analysis.getStudy().getMeasurement(v, d_subject));
assertEquals(ratio.getDistribution(), d_analysis.getRelativeEffectDistribution(v, d_subject));
OutcomeMeasure v2 = d_analysis.getCriteria().get(0);
BasicStandardisedMeanDifference diff = new BasicStandardisedMeanDifference(
(ContinuousMeasurement) d_analysis.getStudy().getMeasurement(v2, d_baseline),
(ContinuousMeasurement) d_analysis.getStudy().getMeasurement(v2, d_subject));
assertEquals(diff.getDistribution(), d_analysis.getRelativeEffectDistribution(v2, d_subject));
}
@Test
public void testCorrectedRelativeEffectDistribution() {
OutcomeMeasure om = ExampleData.buildEndpointHamd();
((BasicRateMeasurement) d_analysis.getStudy().getMeasurement(om, d_baseline)).setRate(0);
BasicOddsRatio ratio = new BasicOddsRatio((RateMeasurement) d_analysis.getStudy().getMeasurement(om, d_baseline),
(RateMeasurement) d_analysis.getStudy().getMeasurement(om, d_subject));
assertEquals(ratio.getCorrected().getDistribution(), d_analysis.getRelativeEffectDistribution(om, d_subject));
}
@Test
public void testCorrectedRelativeEffectDistribution2() {
OutcomeMeasure om = ExampleData.buildEndpointHamd();
BasicRateMeasurement m = ((BasicRateMeasurement) d_analysis.getStudy().getMeasurement(om, d_subject));
m.setRate(m.getSampleSize());
BasicOddsRatio ratio = new BasicOddsRatio((RateMeasurement) d_analysis.getStudy().getMeasurement(om, d_baseline),
(RateMeasurement) d_analysis.getStudy().getMeasurement(om, d_subject));
assertEquals(ratio.getCorrected().getDistribution(), d_analysis.getRelativeEffectDistribution(om, d_subject));
}
@Test
public void testNullIfRelativeEffectDistributionUncorrectable() {
Indication indication = ExampleData.buildIndicationDepression();
Study study = ExampleData.buildStudyFava2002().clone();
List<OutcomeMeasure> criteria = new ArrayList<OutcomeMeasure>();
criteria.add(ExampleData.buildEndpointHamd());
AdverseEvent om = ExampleData.buildAdverseEventConvulsion();
criteria.add(om);
List<Arm> alternatives = study.getArms();
for (Arm a : alternatives) {
study.setMeasurement(study.findStudyOutcomeMeasure(om), a, new BasicRateMeasurement(0, 100));
}
((BasicRateMeasurement) study.getMeasurement(om, alternatives.get(0))).setRate(5);
StudyBenefitRiskAnalysis analysis = new StudyBenefitRiskAnalysis(NAME, indication, study, criteria, alternatives, AnalysisType.SMAA);
assertNotNull(analysis.getRelativeEffectDistribution(om, alternatives.get(1)));
assertNotNull(analysis.getRelativeEffectDistribution(om, alternatives.get(2)));
StudyBenefitRiskAnalysis analysis2 = new StudyBenefitRiskAnalysis(NAME, indication, study, criteria, alternatives.get(1), alternatives, AnalysisType.SMAA);
assertNull(analysis2.getRelativeEffectDistribution(om, alternatives.get(2)));
}
}