Looking for any feedback on improvements that could be made to this class. I am attempting to represent a 2-dimensional data set(one variable input, one variable output). I have included all analytical computations I could think of. I am open to feedback for new features as well as review changes to functionality. package statTool; import java.util.ArrayList; import javafx.util.Pair; /** * This class is used to model a data sampled from a standard distribution, and computes several values used * to analyze the behavior of the population to which the sample belongs. * The values computed and retained for both input and output are: * Mean * Min/Max * Sum of Squared Error * Mean Squared Error(Variance) * Standard Deviation (Standard Error) * Sum * Square Sum *Singular Variables are: * R correlation * Covariance * Linear fit equation * input*output Product Sum * @author wood */ public class XYSample { private float size; private float xMean, xMin, xMax, xVariance, xError, xSumSquaredError; private float yMean, yMin, yMax, yVariance, yError, ySumSquaredError; private float xSum, ySum, xySum, x2Sum, y2Sum; private float R, covariance; LinearEquation fitFunction; //Using ArrayList for the AddAll function private ArrayList<Float> X; private ArrayList<Float> Y; //-------------------------------------------------------------------------------------------------------------- // Constructors // -------------------------------------------------------------------------------------------------------------- public XYSample() { initSample(); } public XYSample(ArrayList<Pair<Float, Float>> data){ initSample(); addValues(data); } public XYSample(ArrayList<Float> xData, ArrayList<Float> yData) { initSample(); addValues(xData, yData); } private void initSample(){ size = 0; //Initialize List X = new ArrayList<Float>(); Y = new ArrayList<Float>(); //Initialize comparator values xMin = Float.MAX_VALUE; yMin = Float.MAX_VALUE; xMax = Float.MIN_VALUE; yMax = Float.MIN_VALUE; } //-------------------------------------------------------------------------------------------------------------- // Populate Sample //-------------------------------------------------------------------------------------------------------------- //As the above suggests, the below methods serve to extract values from ArrayLists and add them to the //appropriate input or output list /** * Splits pairData into two lists of input and output then calls addValues * @param toAdd */ public void addValues(ArrayList<Pair<Float,Float>> toAdd) { ArrayList<Float> input = new ArrayList<Float>(); ArrayList<Float> output = new ArrayList<Float>(); for(Pair<Float,Float> pair : toAdd){ input.add(pair.getKey()); output.add(pair.getValue()); } } /** * This method allows the user to add additional values to the existing data set * Checks for new max or min now, to avoid iterating through the entire input/output set needlessly, * then calls setValues() to recalculate sample analysis * @param toAdd */ public void addValues(ArrayList<Float> input, ArrayList<Float> output) { X.addAll(input); Y.addAll(output); //Check input minimum and maximum float temp; for(int i = 0; i < input.size(); i++){ temp = input.get(i); if(temp > xMax){ xMax = temp; } if(temp < xMin){ xMin = temp; } } //Check output minimum and maximum for(int i = 0; i < output.size(); i++){ temp = output.get(i); if(temp > yMax){ yMax = temp; } if(temp < yMin){ yMin = temp; } } setValues(); } //-------------------------------------------------------------------------------------------------------------- // Basic Analysis //-------------------------------------------------------------------------------------------------------------- //The method below is called every time the sample is changed. It initializes each basic analytical value private void setValues() { size = (float)X.size(); xSum = sum(X); ySum = sum(Y); xMean = mean(xSum); yMean = mean(ySum); xSumSquaredError = squaredError(X, xMean); ySumSquaredError = squaredError(Y, yMean); xVariance = variance(xSumSquaredError); yVariance = variance(ySumSquaredError); xError = standardError(xSumSquaredError); yError = standardError(ySumSquaredError); x2Sum = squareSum(X); y2Sum = squareSum(Y); xySum = productSum(X,Y); R = correlation(); covariance = covariance(); fitFunction = linearFit(); } /** * s the Sample Mean by creating a running summation of the values and then dividing by the * number of values in the set * @return double */ private Float mean(float sum) { return sum / size; } /** * s the Sum of the Squared Error for the sample, which is used to the variance and * standard error * @return double */ private float squaredError(ArrayList<Float> data, float mean){ float temp; float tempSum = 0; for (float value: data) { temp = (float) Math.pow(value - mean, 2); tempSum += temp; } return tempSum; } /** * The sample variance carries a bias of n-1/n, where n is the size of the sample. Multiplying this values * by n/n-1 removes this bias as an estimate of the population variance. This results in the variance * being calculated with n-1 as opposed to n * @return double */ private float variance(float sumsquaredError) { return sumsquaredError / (size-1); } /** * As a population estimate, the samples standard error carries a bias of (sqrt(n-1.5)/sqrt(n)). Removing * this bias, as above with variance, results in calculating with sqrt(n-1.5) as the denominator * @return */ private float standardError(float sumSquaredError){ return (float) Math.sqrt(sumSquaredError / (size-1.5)); } //-------------------------------------------------------------------------------------------------------------- // Summations //-------------------------------------------------------------------------------------------------------------- //The methods below return summations of the given data private float sum(ArrayList<Float> data){ float tempSum = 0; for(int i = 0; i < data.size(); i++){ tempSum += data.get(i); } return tempSum; } private float productSum(ArrayList<Float> data1, ArrayList<Float> data2){ float tempSum = 0; for(int i = 0; i < data1.size(); i++){ tempSum += (data1.get(i)* data2.get(i)); } return tempSum; } private float squareSum(ArrayList<Float> data){ float tempSum = 0; for(int i = 0; i < data.size(); i++){ tempSum += Math.pow(data.get(i), 2); } return tempSum; } //-------------------------------------------------------------------------------------------------------------- // Regression Analysis //-------------------------------------------------------------------------------------------------------------- //The methods below perform regression on the samples input and output to a linear equation //of form Slope*(input) + Intercept = (output). R^2 correlation is returned as a decimal between 0 and 1 private float correlation(){ float numerator = (X.size() * xySum) - (xSum * ySum); float denominatorLeft = (X.size() * x2Sum) - ((float)Math.pow(xSum, 2)); float denominatorRight = (Y.size() * y2Sum) - ((float)Math.pow(ySum, 2)); return numerator/((float)Math.sqrt(denominatorLeft*denominatorRight)); } private float covariance(){ float runSum = 0; for(int i = 0; i < X.size(); i++){ runSum += (X.get(i) - xMean) * (Y.get(i) - yMean); } return runSum/(X.size() -1); } private LinearEquation linearFit(){ float slope = slope(xySum, xSum, ySum, x2Sum); float intercept = intercept(xySum, xSum, ySum, x2Sum); LinearEquation toReturn = new LinearEquation(slope, intercept); return toReturn; } private float slope(float xySum, float xSum, float ySum, float x2Sum) { float numerator = (X.size()*xySum) - (xSum*ySum); float denominator = (X.size()*x2Sum) - (float)Math.pow(xSum, 2); return numerator/denominator; } private float intercept(float xySum, float xSum, float ySum, float x2Sum) { float numerator = (ySum*x2Sum) - (xSum*xySum); float denominator = (X.size()*x2Sum) - (float)Math.pow(xSum, 2); return numerator/denominator; } //-------------------------------------------------------------------------------------------------------------- // Getters //-------------------------------------------------------------------------------------------------------------- public float getSize(){return size;} public float getXMean(){return xMean;} public float getYMean(){return yMean;} public float getXMin(){return xMin;} public float getYMin(){return yMin;} public float getXMax(){return xMax;} public float getYMax(){return yMax;} public float getXVariance(){return xVariance;} public float getYVariance(){return yVariance;} public float getXError(){return xError;} public float getYError(){return yError;} public float getXSumsquaredError(){return xSumSquaredError;} public float getYSumsquaredError(){return ySumSquaredError;} public float getXSum(){return xSum;} public float getYSum(){return ySum;} public float getXSquareSum(){return x2Sum;} public float getYSquareSum(){return y2Sum;} public float getProductSum(){return xySum;} public float getR(){return R;} public float getRSquare(){return (float)Math.pow(R,2);} public float getCovariance(){return covariance;} public LinearEquation getLinearFit(){return fitFunction;} }