@Override public Object doWork(Object... values) throws IOException { List<double[]> mannWhitneyUInput = Arrays.stream(values) .map(value -> ((List<Number>) value).stream().mapToDouble(Number::doubleValue).toArray()) .collect(Collectors.toList()); if(mannWhitneyUInput.size() == 2) { MannWhitneyUTest mannwhitneyutest = new MannWhitneyUTest(); double u = mannwhitneyutest.mannWhitneyU(mannWhitneyUInput.get(0), mannWhitneyUInput.get(1)); double p = mannwhitneyutest.mannWhitneyUTest(mannWhitneyUInput.get(0), mannWhitneyUInput.get(1)); Map<String,Number> m = new HashMap<>(); m.put("u-statistic", u); m.put("p-value", p); return new Tuple(m); }else{ throw new IOException(String.format(Locale.ROOT,"%s(...) only works with a list of 2 arrays but a list of %d array(s) was provided.", constructingFactory.getFunctionName(getClass()), mannWhitneyUInput.size())); } } }
/** * Mann-Whitney statistic, specialized for comparing survey questions. * @param q1 * @param q2 * @param list1 * @param list2 * @return */ public static ImmutablePair<Double, Double> mannWhitney(Question q1, Question q2, List<SurveyDatum> list1, List<SurveyDatum> list2) { if (list1.size()==0 || list2.size()==0) { SurveyMan.LOGGER.warn(String.format("Cannot compare response lists of sizes: %d and %d", list1.size(), list2.size())); return new ImmutablePair<>(-0.0, -0.0); } // make ranks on the basis of the source row index Collections.sort(list1); Collections.sort(list2); double[] list1ranks = new double[list1.size()]; double[] list2ranks = new double[list2.size()]; for (int i = 0 ; i < list1.size() ; i++) list1ranks[i] = (double) list1.get(i).getSourceRow() - q1.getSourceRow() + 1; for (int i = 0 ; i < list2.size() ; i++) list2ranks[i] = (double) list2.get(i).getSourceRow() - q2.getSourceRow() + 1; // default constructor for mann whitney averages ties. MannWhitneyUTest test = new MannWhitneyUTest(); double testStatistic = test.mannWhitneyU(list1ranks, list2ranks); double pvalue = test.mannWhitneyUTest(list1ranks, list2ranks); return new ImmutablePair<>(testStatistic, pvalue); }