public TrainAndTestReportCrisp computeAvgCTS( List<TrainAndTestReportCrisp> reportsCTS, Model model) { if (reportsCTS.size() == 1) { // does not make sense to compute average over one series return reportsCTS.get( 0); // TODO do not return anything (but take care of it on the receiving end), because // otherwise it draws twice. but then problems with "drawOnlyAVG" } else { if (!allTheSamePercentTrain(reportsCTS)) { return null; } else { StringBuilder fittedValsAvgAll = new StringBuilder("("); StringBuilder forecastValsTestAvgAll = new StringBuilder("("); StringBuilder forecastValsFutureAvgAll = new StringBuilder("("); StringBuilder sumWeightsTrain = new StringBuilder("("); StringBuilder sumWeightsTest = new StringBuilder("("); StringBuilder sumWeightsFuture = new StringBuilder("("); boolean next = false; for (TrainAndTestReportCrisp r : reportsCTS) { if (next) { fittedValsAvgAll.append(" + "); forecastValsTestAvgAll.append(" + "); forecastValsFutureAvgAll.append(" + "); sumWeightsTrain.append(" + "); sumWeightsTest.append(" + "); sumWeightsFuture.append(" + "); } else { next = true; } double weightTrain = getWeightForModelTrain(r); double weightTest = getWeightForModelTest(r); double weightFuture = getWeightForModelFuture(r); weightsCrisp.put(r.toString(), weightFuture); sumWeightsTrain.append(weightTrain); sumWeightsTest.append(weightTest); fittedValsAvgAll .append(weightTrain) .append("*") .append(Utils.arrayToRVectorString(r.getFittedValues())); forecastValsTestAvgAll .append(weightTest) .append("*") .append(Utils.arrayToRVectorString(r.getForecastValuesTest())); forecastValsFutureAvgAll.append(weightFuture).append("*"); if (r.getForecastValuesFuture().length > 0) { forecastValsFutureAvgAll.append( Utils.arrayToRVectorString(r.getForecastValuesFuture())); sumWeightsFuture.append(weightFuture); } else { forecastValsFutureAvgAll.append("0"); sumWeightsFuture.append("0"); } } sumWeightsTrain.append(")"); sumWeightsTest.append(")"); sumWeightsFuture.append(")"); fittedValsAvgAll.append(")/").append(sumWeightsTrain); forecastValsTestAvgAll.append(")/").append(sumWeightsTest); forecastValsFutureAvgAll.append(")/").append(sumWeightsFuture); String avgAll = "c(" + fittedValsAvgAll + "," + forecastValsTestAvgAll + "," + forecastValsFutureAvgAll + ")"; MyRengine rengine = MyRengine.getRengine(); // and create a new report for this avg and add it to reportsCTS: TrainAndTestReportCrisp thisAvgReport = new TrainAndTestReportCrisp(model, "(" + getName() + ")", true); double[] fittedValsAvg = rengine.evalAndReturnArray(fittedValsAvgAll.toString()); double[] forecastValsTestAvg = rengine.evalAndReturnArray(forecastValsTestAvgAll.toString()); ErrorMeasuresCrisp errorMeasures = ErrorMeasuresUtils.computeAllErrorMeasuresCrisp( Utils.arrayToList(reportsCTS.get(0).getRealOutputsTrain()), Utils.arrayToList(reportsCTS.get(0).getRealOutputsTest()), Utils.arrayToList(fittedValsAvg), Utils.arrayToList(forecastValsTestAvg), 0); thisAvgReport.setErrorMeasures(errorMeasures); double[] forecastValsFutureAvg = rengine.evalAndReturnArray(forecastValsFutureAvgAll.toString()); thisAvgReport.setForecastValuesFuture(forecastValsFutureAvg); thisAvgReport.setPlotCode("plot.ts(" + avgAll + ", lty=2)"); thisAvgReport.setFittedValues(fittedValsAvg); thisAvgReport.setForecastValuesTest(forecastValsTestAvg); thisAvgReport.setNumTrainingEntries(fittedValsAvg.length); thisAvgReport.setRealOutputsTrain(reportsCTS.get(0).getRealOutputsTrain()); thisAvgReport.setRealOutputsTest(reportsCTS.get(0).getRealOutputsTest()); return thisAvgReport; } } }