protected double cacluateGroupRSquare( DataSet dataSet, String tableName, String labelName, LinearRegressionModelDB model, String groupValue, StringBuilder sb_notNull) throws OperatorException { // String notnull=sb_notNull.toString().substring(beginIndex, endIndex); // notnull.replace("where", " and "); double RSquare = 0.0; StringBuffer RSquareSQL = new StringBuffer(); StringBuffer avgSQL = new StringBuffer(); avgSQL .append(" select avg(") .append(labelName) .append(") from ") .append(tableName) .append(sb_notNull) .append(" and ") .append(StringHandler.doubleQ(groupbyColumn)) .append("=") .append(StringHandler.singleQ(groupValue)); double avg = 0.0; try { itsLogger.debug(classLogInfo + ".cacluateRSquare():sql=" + avgSQL); ResultSet rs = st.executeQuery(avgSQL.toString()); if (rs.next()) { avg = rs.getDouble(1); } } catch (SQLException e) { itsLogger.error(e.getMessage(), e); return Double.NaN; } StringBuffer predictedValueSQL = new StringBuffer(); predictedValueSQL.append(model.generatePredictedString(dataSet)); RSquareSQL.append("select 1 - sum((") .append(predictedValueSQL) .append("-") .append(labelName) .append(")*(") .append(predictedValueSQL) .append("-") .append(labelName) .append("))*1.0/sum((") .append(labelName) .append("-(") .append(avg) .append("))*(") .append(labelName) .append("-(") .append(avg) .append("))) from ") .append(tableName) .append(sb_notNull) .append(" and ") .append(StringHandler.doubleQ(groupbyColumn)) .append("=") .append(StringHandler.singleQ(groupValue)); try { itsLogger.debug("LinearRegressionImpPGGP.cacluateRSquare():sql=" + RSquareSQL); ResultSet rs = st.executeQuery(RSquareSQL.toString()); if (rs.next()) { RSquare = rs.getDouble(1); } } catch (SQLException e) { itsLogger.error(e.getMessage(), e); return Double.NaN; } return RSquare; }
protected void getCoefficientAndR2Group( String columNames, DataSet dataSet, String labelName, String tableName, String newTableName, Columns atts, String[] columnNames, StringBuilder sb_notNull) throws OperatorException { Iterator<Column> atts_i; StringBuffer columnNamesArray = new StringBuffer(); columnNamesArray.append("array[1.0,"); atts_i = atts.iterator(); int i = 0; while (atts_i.hasNext()) { Column att = atts_i.next(); if (i != 0) { columnNamesArray.append(","); } columnNamesArray.append(StringHandler.doubleQ(att.getName())).append("::float"); i++; } columnNamesArray.append("]"); String sql = null; sql = "select alpine_miner_mregr_coef(" + labelName + "::float," + columnNamesArray + ") , " + StringHandler.doubleQ(groupbyColumn) + " from " + newTableName + sb_notNull + " group by " + StringHandler.doubleQ(groupbyColumn); itsLogger.debug(classLogInfo + ".getCoefficientAndR2():sql=" + sql); HashMap<String, Matrix> XY = new HashMap<String, Matrix>(); try { Object[] object = null; ResultSet rs = st.executeQuery(sql.toString()); while (rs.next()) { Matrix tempXY = new Matrix(columnNames.length + 1, 1); Matrix tempHessian = new Matrix(columnNames.length + 1, columnNames.length + 1); String groupValue = rs.getString(2); object = (Object[]) rs.getArray(1).getArray(); for (int x = 0; x < columnNames.length + 1; x++) { int y = x + 1; double doubleValue = 0.0; if (object[y] != null) { if (object[y] instanceof BigDecimal) { doubleValue = ((BigDecimal) object[y]).doubleValue(); } else if (object[y] instanceof Double) { doubleValue = ((Double) object[y]).doubleValue(); } else if (object[y] instanceof Integer) { doubleValue = ((Integer) object[y]).doubleValue(); } else { doubleValue = ((Number) object[y]).doubleValue(); } } tempXY.set(x, 0, doubleValue); } XY.put(groupValue, tempXY); double[] arrayarrayResult = getHessian( object, columnNames.length + 2, (columnNames.length + 1) * (columnNames.length + 2) / 2); // new double[sbAllArray.size()]; i = 0; for (int x = 0; x < columnNames.length + 1; x++) { for (int y = x; y < columnNames.length + 1; y++) { { double h = 0.0; if (!Double.isNaN(arrayarrayResult[i])) { h = arrayarrayResult[i]; } tempHessian.set(x, y, h); if (x != y) { tempHessian.set(y, x, h); } i++; } } } hessian.put(groupValue, tempHessian); } } catch (SQLException e) { itsLogger.error(e.getMessage(), e); throw new OperatorException(e.getLocalizedMessage()); } boolean first = true; for (String tempString : hessian.keySet()) { Matrix beta = null; Matrix varianceCovarianceMatrix = null; Double[] tempCoefficients = new Double[columnNames.length + 1]; for (i = 0; i < tempCoefficients.length; i++) { tempCoefficients[i] = 0.0; } try { varianceCovarianceMatrix = hessian.get(tempString).SVDInverse(); beta = varianceCovarianceMatrix.times(XY.get(tempString)); for (i = 0; i < beta.getRowDimension(); i++) { if (i == 0) { tempCoefficients[beta.getRowDimension() - 1] = beta.get(i, 0); } else { tempCoefficients[i - 1] = beta.get(i, 0); } } coefficients.put(tempString, tempCoefficients); double r2 = 0; getGroupCoefficientMap(columnNames, tempString); if (first == true) { model = new LinearRegressionGroupGPModel( dataSet, columnNames, columNames, tempCoefficients, coefficientmap.get(tempString)); first = false; } LinearRegressionModelDB tempModel = new LinearRegressionModelDB( dataSet, columnNames, columNames, tempCoefficients, coefficientmap.get(tempString)); if (!this.newDataSet.equals(this.dataSet)) { tempModel.setAllTransformMap_valueKey(transformer.getAllTransformMap_valueKey()); } tempModel.setInteractionColumnExpMap(transformer.getInteractionColumnExpMap()); tempModel.setInteractionColumnColumnMap(transformer.getInteractionColumnColumnMap()); r2 = cacluateGroupRSquare(dataSet, tableName, labelName, tempModel, tempString, sb_notNull); tempModel.setR2(r2); model.addOneModel(tempModel, tempString); } catch (Exception e) { itsLogger.error(e.getMessage(), e); } } }