/* * 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.relativeeffect; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.drugis.addis.entities.Arm; import org.drugis.addis.entities.BasicRateMeasurement; import org.drugis.common.Interval; import org.drugis.common.StudentTTable; import org.junit.Before; import org.junit.Test; public class BasicRiskDifferenceTest { private static final int s_sizeNum = 142; private static final int s_sizeDen = 144; private static final int s_effectNum = 73; private static final int s_effectDen = 63; // Paper data [Warn2002]: private static final int s_cooper1977rT = 15; private static final int s_cooper1977nT = 38; private static final int s_cooper1977rC = 6; private static final int s_cooper1977nC = 40; private static final double s_cooper1977RD = 0.245; private static final double s_cooper1977RDvar = 0.009; BasicRateMeasurement d_cooper1977Num; BasicRateMeasurement d_cooper1977Den; BasicRiskDifference d_cooperRD; BasicRateMeasurement d_numerator; BasicRateMeasurement d_denominator; BasicRiskDifference d_riskDif; @Before public void setUp() { Arm pnum = new Arm("Num", s_sizeNum); Arm pden = new Arm("Den", s_sizeDen); d_numerator = new BasicRateMeasurement(s_effectNum, pnum.getSize()); d_denominator = new BasicRateMeasurement(s_effectDen, pden.getSize()); d_riskDif = new BasicRiskDifference(d_denominator, d_numerator); //cooper 1977 from Warn2002 Arm fnum = new Arm("T", s_cooper1977nT); Arm fden = new Arm("C", s_cooper1977nC); d_cooper1977Num = new BasicRateMeasurement(s_cooper1977rT, fnum.getSize()); d_cooper1977Den = new BasicRateMeasurement(s_cooper1977rC, fden.getSize()); d_cooperRD = new BasicRiskDifference(d_cooper1977Den, d_cooper1977Num); } @Test public void testGetSampleSize() { assertEquals(s_sizeNum + s_sizeDen, (int)d_riskDif.getSampleSize()); } @Test public void testGetRelativeEffect() { assertEquals(RiskDifference(), (double)d_riskDif.getConfidenceInterval().getPointEstimate(), 0.00001); } @Test public void testGetRelativeEffectvsCooper1977() { assertEquals(s_cooper1977RD, d_cooperRD.getConfidenceInterval().getPointEstimate(), 0.001); } @Test public void testGetCI() { double helper1 = (double)s_effectNum * (double)(s_sizeNum - s_effectNum) / Math.pow(s_sizeNum, 3); double helper2 = (double)s_effectDen * (double)(s_sizeDen - s_effectDen) / Math.pow(s_sizeDen, 3); double expectedSE = Math.sqrt(helper1 + helper2); double t = StudentTTable.getT(s_sizeNum + s_sizeDen - 2); double lower = RiskDifference() - t * expectedSE; double upper = RiskDifference() + t * expectedSE; Interval<Double> ci = d_riskDif.getConfidenceInterval(); assertEquals(lower, ci.getLowerBound(), 0.00001); assertEquals(upper, ci.getUpperBound(), 0.00001); } private double RiskDifference() { return (double)s_effectNum/(double)s_sizeNum - (double)s_effectDen/(double)s_sizeDen; } private double square(double d) { return d * d; } @Test public void testGetErrorvsCooper() { assertEquals(s_cooper1977RDvar,square(d_cooperRD.getError()),0.001); } @Test public void testBothRatesZeroShouldBeUndefined() { // although we can calculate a point estimate, the CI is not well defined. BasicRateMeasurement base = new BasicRateMeasurement(0, 10); BasicRateMeasurement subj = new BasicRateMeasurement(0, 10); BasicRiskDifference rd = new BasicRiskDifference(base, subj); assertFalse(rd.isDefined()); } @Test public void testOneRateZeroShouldBeDefined() { BasicRateMeasurement base = new BasicRateMeasurement(0, 10); BasicRateMeasurement subj = new BasicRateMeasurement(5, 10); BasicRiskDifference rd = new BasicRiskDifference(base, subj); assertTrue(rd.isDefined()); BasicRiskDifference rd2 = new BasicRiskDifference(subj, base); assertTrue(rd2.isDefined()); } @Test public void testGettersWellBehavedWhenUndefined() { BasicRateMeasurement base = new BasicRateMeasurement(0, 10); BasicRateMeasurement subj = new BasicRateMeasurement(0, 10); BasicRiskDifference rd = new BasicRiskDifference(base, subj); assertFalse(rd.isDefined()); assertEquals(AxisType.LINEAR, rd.getAxisType()); } }