/* * #%L * org.gitools.ui.app * %% * Copyright (C) 2013 - 2014 Universitat Pompeu Fabra - Biomedical Genomics group * %% * 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/gpl-3.0.html>. * #L% */ package org.gitools.ui.app.analysis.groupcomparison.wizard; import org.gitools.analysis.groupcomparison.format.math33Preview.CombinatoricsUtils; import org.gitools.analysis.stats.test.EnrichmentTest; import org.gitools.analysis.stats.test.MannWhitneyWilcoxonTest; import org.gitools.analysis.stats.test.OneWayAnovaTest; import org.gitools.api.matrix.IMatrixLayer; import org.gitools.ui.platform.IconUtils; import org.gitools.ui.platform.dialog.MessageStatus; import org.gitools.ui.platform.icons.IconNames; import org.gitools.ui.platform.wizard.AbstractWizardPage; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class GroupComparisonStatisticsPage extends AbstractWizardPage { private JPanel panel1; private JComboBox testCb; private JComboBox mtcCb; private JTextPane testExplanation; private int groupNumber; public GroupComparisonStatisticsPage() { super(); setTitle("Select data and statistical test"); setLogo(IconUtils.getImageIconResourceScaledByHeight(IconNames.LOGO_METHOD, 96)); setComplete(true); testCb.setModel(new DefaultComboBoxModel(new TestElement[]{ new TestElement(new OneWayAnovaTest()), new TestElement(new MannWhitneyWilcoxonTest()) })); testCb.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateControls(); } }); mtcCb.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"Bonferroni", "Benjamini Hochberg FDR"})); mtcCb.setSelectedIndex(1); testExplanation.setContentType("text/html"); } public void setGroupNumber(int groupNumber) { this.groupNumber = groupNumber; } private static class TestElement { public final EnrichmentTest test; public TestElement(EnrichmentTest test) { this.test = test; } @Override public String toString() { return this.test.getName(); } public EnrichmentTest getTest() { return this.test; } } public class AttrOption { private String name; private IMatrixLayer attr; public AttrOption(IMatrixLayer attr) { this.attr = attr; } public IMatrixLayer getAttr() { return attr; } @Override public String toString() { return attr != null ? attr.getName() : name; } } @Override public void updateControls() { if (testCb.getSelectedIndex() == 0) { testExplanation.setText("<html><body style=\"font-size: 9px;\">" + "A one-way ANOVA (analysis of variance) test will be carried out" + " for each data row. <br/>" + "Wikipedia explains: The ANOVA tests the <b>null hypothesis<b> that samples in two or more groups are " + "drawn from populations with the same mean values. To do this, two estimates are made of the population variance. </body></html>"); } else if (testCb.getSelectedIndex() == 1) { testExplanation.setText("<html><body style=\"font-size: 9px;\">" + "The two-sample Mann-Whitney-Wilcoxon rank sum test will be carried out" + " for each pair of groups. The <b>null hypothesis</b> is that the distributions of Group 1 and Group 2 do " + "not differ. The <b>alternative</b> is that they do: The one-sided alternative \"greater\" is that " + "Group 1 is shifted to the right of Group 2 resulting in a low right-tail p-value. " + "The one-sided alternative \"less\" is that " + "Group 1 is shifted to the left of Group 2 resulting in a low left-tail p-value." + "<br><img src=\"" + IconNames.ANALYSIS_IMAGE_MANN_WHITNEY_WILCOXON.toString() + "\" > <br>" + "Above, Expression value distribution of Group 1 (Gain) is shifted to the right of Group 2 (Loss)</body></html>"); double v = CombinatoricsUtils.binomialCoefficientDouble(groupNumber, 2); if (v < 101) { setMessage(MessageStatus.INFO, "You will be calculating " + String.valueOf(Math.round(v)) + " group combinations"); } else { setMessage(MessageStatus.WARN, "This would yield " + String.valueOf(v) + " group combinations. Gitools" + " refuses to do that much work."); } } } public EnrichmentTest getTest() { TestElement testElement = (TestElement) testCb.getModel().getSelectedItem(); return testElement.getTest(); } public String getMtc() { switch (mtcCb.getSelectedIndex()) { case 0: return "bonferroni"; case 1: return "bh"; } return "bh"; } @Override public JComponent createControls() { return panel1; } }