/* * 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.lyndobrien; import java.util.ArrayList; import java.util.List; import org.drugis.addis.lyndobrien.BenefitRiskDistribution.Sample; import org.drugis.common.threading.AbstractIterativeComputation; import org.drugis.common.threading.IterativeTask; import org.drugis.common.threading.Task; import fi.smaa.common.RandomUtil; public class LyndOBrienModelImpl extends AbstractIterativeComputation implements LyndOBrienModel { private BenefitRiskDistribution d_brd; private static final int SIMULATION_ITERATIONS = 3000; private static final int REPORTING_INTERVAL = 100; private List<Sample> d_data; private IterativeTask d_task; private RandomUtil d_random; public LyndOBrienModelImpl(BenefitRiskDistribution brd) { super(SIMULATION_ITERATIONS); d_brd = brd; d_random = RandomUtil.createWithRandomSeed(); d_data = new ArrayList<Sample>(); d_task = new IterativeTask(this, "Lynd & O'Brien Simulation"); d_task.setReportingInterval(REPORTING_INTERVAL); } public Sample getData(int arg0) { return d_data.get(arg0); } public String getXAxisName() { return d_brd.getBenefitAxisName(); } public String getYAxisName() { return d_brd.getRiskAxisName(); } public Double getPValue(double mu) { double belowMu = 0; final int n = d_data.size(); for(int i = 0; i < n; ++i) { Sample s = d_data.get(i); if(s.benefit < 0) { if((s.risk / s.benefit) > mu) { ++belowMu; } } else if (s.benefit > 0) { if((s.risk / s.benefit) < mu) { ++belowMu; } } else { if (s.risk < 0) { ++belowMu; } } } return belowMu / n; } public Task getTask() { return d_task; } @Override public void doStep() { d_data.add(d_brd.nextSample(d_random)); } public int getSimulationIterations() { return SIMULATION_ITERATIONS; } }