--- /dev/null
+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