-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
+package org.simantics.spreadsheet.graph.formula;
+
+import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression;
+import org.simantics.spreadsheet.graph.CellFormulaFunction;
+import org.simantics.spreadsheet.graph.CellValueVisitor;
+import org.simantics.spreadsheet.graph.SpreadsheetGraphUtils;
+import org.simantics.spreadsheet.graph.SpreadsheetMatrix;
+import org.simantics.spreadsheet.graph.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] = SpreadsheetGraphUtils.asNumber(ysm.values[i]);
+ for (int j = 0; j < xsm.getWidth(); j++) {
+ x[i][j] = SpreadsheetGraphUtils.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;
+ }
+
+}