package org.geogebra.common.gui.view.data; import org.apache.commons.math3.stat.StatUtils; import org.apache.commons.math3.stat.descriptive.SummaryStatistics; import org.geogebra.common.kernel.geos.GeoList; import org.geogebra.common.main.App; import org.geogebra.common.main.Localization; /** * Extension of StatTable that displays summary statistics for two data sets. * The two data sets are taken from the current collection of data provided by a * MultiVar StatDialog. JComboBoxes for choosing data sets are embedded in the * table. * * @author G. Sturr * */ public class TwoVarStatModel { public interface TwoVarStatListener { void setValueAt(String value, int row, int col); void setValueAt(double value, int row, int col); GeoList getDataSelected(); double[] getValueArray(GeoList dataList1); void clear(); } protected Localization loc; private Integer[] selectedDataIndex = { 0, 1 }; private boolean isPairedData = false; private double mean1, mean2, sd1, sd2, sdDifference, meanDifference; private long n1, n2; private TwoVarStatListener listener; public TwoVarStatModel(App app, boolean isPairedData, TwoVarStatListener listener) { this.loc = app.getLocalization(); this.isPairedData = isPairedData; this.listener = listener; } public void setPairedData(boolean isPairedData) { this.isPairedData = isPairedData; } public String[] getRowNames() { return null; /* * if(isPairedData){ String[] names = { "1", "2", * loc.getMenu("Differences") }; return names; }else{ String[] names = { * "1", "2" }; return names; } */ } public String[] getColumnNames() { String[] names = { " ", loc.getMenu("Mean"), loc.getMenu("SampleStandardDeviation.short"), loc.getMenu("Length.short") }; return names; } public int getRowCount() { if (isPairedData) { return 3; } return 2; } public int getColumnCount() { return getColumnNames().length; } public Integer[] getSelectedDataIndex() { return selectedDataIndex; } public void setSelectedDataIndex(Integer[] selectedDataIndex) { this.selectedDataIndex = selectedDataIndex; } public void update() { updateStat(); updateDifferences(); } private void updateStat() { // get the sample data statistics; if error clear the table and exit boolean ok = evaluateSampleData(); if (!ok) { listener.clear(); return; } // load table with the sample statistics listener.setValueAt(mean1, 0, 1); listener.setValueAt(sd1, 0, 2); listener.setValueAt(n1, 0, 3); listener.setValueAt(mean2, 1, 1); listener.setValueAt(sd2, 1, 2); listener.setValueAt(n2, 1, 3); } private void updateDifferences() { if (!isPairedData) { return; } // get the sample data statistics; if error (e.g. unequal sizes) clear // the table and exit boolean ok = evaluatePairedDifferences(); if (!ok) { listener.clear(); return; } // load paired difference statistics into the next row listener.setValueAt(loc.getMenu("Differences"), 2, 0); listener.setValueAt(meanDifference, 2, 1); listener.setValueAt(sdDifference, 2, 2); listener.setValueAt(n1, 2, 3); } public int getSelectedDataIndex0() { return selectedDataIndex[0]; } public int getSelectedDataIndex1() { return selectedDataIndex[1]; } private boolean evaluatePairedDifferences() { try { // get the sample data GeoList dataCollection = listener.getDataSelected(); GeoList dataList1 = (GeoList) dataCollection .get(selectedDataIndex[0]); double[] sample1 = listener.getValueArray(dataList1); SummaryStatistics stats1 = new SummaryStatistics(); for (int i = 0; i < sample1.length; i++) { stats1.addValue(sample1[i]); } GeoList dataList2 = (GeoList) dataCollection .get(selectedDataIndex[1]); double[] sample2 = listener.getValueArray(dataList2); SummaryStatistics stats2 = new SummaryStatistics(); for (int i = 0; i < sample2.length; i++) { stats2.addValue(sample2[i]); } // exit if sample sizes are unequal if (stats1.getN() != stats2.getN()) { return false; } // get statistics meanDifference = StatUtils.meanDifference(sample1, sample2); sdDifference = Math.sqrt(StatUtils.varianceDifference(sample1, sample2, meanDifference)); } catch (Exception e) { e.printStackTrace(); return false; } return true; } private boolean evaluateSampleData() { try { // get the sample data GeoList dataCollection = listener.getDataSelected(); GeoList dataList1 = (GeoList) dataCollection .get(selectedDataIndex[0]); double[] sample1 = listener.getValueArray(dataList1); SummaryStatistics stats1 = new SummaryStatistics(); for (int i = 0; i < sample1.length; i++) { stats1.addValue(sample1[i]); } GeoList dataList2 = (GeoList) dataCollection .get(selectedDataIndex[1]); double[] sample2 = listener.getValueArray(dataList2); SummaryStatistics stats2 = new SummaryStatistics(); for (int i = 0; i < sample2.length; i++) { stats2.addValue(sample2[i]); } mean1 = stats1.getMean(); sd1 = stats1.getStandardDeviation(); n1 = stats1.getN(); mean2 = stats2.getMean(); sd2 = stats2.getStandardDeviation(); n2 = stats2.getN(); } catch (Exception e) { e.printStackTrace(); return false; } return true; } public void setSelectedDataIndex0(int idx) { selectedDataIndex[0] = idx; } public void setSelectedDataIndex1(int idx) { selectedDataIndex[1] = idx; } }