]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.spreadsheet/src/org/simantics/spreadsheet/solver/formula/LinestFormulaFunction.java
Adopt spreadsheet changes made in Balas development
[simantics/platform.git] / bundles / org.simantics.spreadsheet / src / org / simantics / spreadsheet / solver / formula / LinestFormulaFunction.java
diff --git a/bundles/org.simantics.spreadsheet/src/org/simantics/spreadsheet/solver/formula/LinestFormulaFunction.java b/bundles/org.simantics.spreadsheet/src/org/simantics/spreadsheet/solver/formula/LinestFormulaFunction.java
new file mode 100644 (file)
index 0000000..8d952c1
--- /dev/null
@@ -0,0 +1,75 @@
+package org.simantics.spreadsheet.solver.formula;
+
+import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression;
+import org.simantics.spreadsheet.SpreadsheetMatrix;
+import org.simantics.spreadsheet.Spreadsheets;
+import org.simantics.spreadsheet.solver.formula.parser.ast.AstArgList;
+
+public class LinestFormulaFunction implements CellFormulaFunction<SpreadsheetMatrix> {
+
+    @Override
+    public SpreadsheetMatrix evaluate(CellValueVisitor visitor, AstArgList args) {
+        if (args.values.size() != 4)
+            throw new IllegalStateException();
+
+        Object ys = args.values.get(0).accept(visitor);
+        Object xs = args.values.get(1).accept(visitor);
+
+        if (xs instanceof SpreadsheetMatrix) {
+
+            OLSMultipleLinearRegression reg = new OLSMultipleLinearRegression();
+
+            SpreadsheetMatrix xsm = (SpreadsheetMatrix) xs;
+            SpreadsheetMatrix ysm = (SpreadsheetMatrix) ys;
+
+            if (xsm.getWidth() > 1) {
+
+                double y[] = new double[ysm.values.length];
+                double x[][] = new double[ysm.values.length][xsm.getWidth()];
+
+                for (int i = 0; i < ysm.values.length; i++) {
+                    y[i] = Spreadsheets.asNumber(ysm.values[i]);
+                    for (int j = 0; j < xsm.getWidth(); j++) {
+                        x[i][j] = Spreadsheets.asNumber(xsm.get(i, j));
+                    }
+                }
+
+                reg.newSampleData(y, x);
+
+                int width = xsm.getWidth() + 1;
+                SpreadsheetMatrix result = new SpreadsheetMatrix(width, 5);
+                double[] pars = reg.estimateRegressionParameters();
+                for (int i = 0; i < width; i++)
+                    result.set(0, width - i - 1, pars[i]);
+                double[] errs = reg.estimateRegressionParametersStandardErrors();
+                for (int i = 0; i < width; i++)
+                    result.set(1, width - i - 1, errs[i]);
+
+                double sstotal = reg.calculateTotalSumOfSquares();
+                double ssresid = reg.calculateResidualSumOfSquares();
+                double ssreg = sstotal - ssresid;
+                double F = 0;
+                double r2 = ssreg / sstotal;
+                double sey = reg.estimateRegressionStandardError();
+                double df = width;
+
+                result.set(2, 0, r2);
+                result.set(2, 1, sey);
+                result.set(3, 0, F);
+                result.set(3, 1, df);
+                result.set(4, 0, ssreg);
+                result.set(4, 1, ssresid);
+                result.set(2,2, FormulaError2.NA.getString());
+                result.set(3,2, FormulaError2.NA.getString());
+                result.set(4,2, FormulaError2.NA.getString());
+
+                return result;
+
+            }
+
+        }
+
+        return null;
+    }
+
+}