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