]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/formula/LinestFormulaFunction.java
SpreadsheetCells with Circular References support iterations.
[simantics/platform.git] / bundles / org.simantics.spreadsheet.graph / src / org / simantics / spreadsheet / graph / formula / LinestFormulaFunction.java
1 package org.simantics.spreadsheet.graph.formula;\r
2 \r
3 import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression;\r
4 import org.simantics.spreadsheet.graph.CellFormulaFunction;\r
5 import org.simantics.spreadsheet.graph.CellValueVisitor;\r
6 import org.simantics.spreadsheet.graph.SpreadsheetGraphUtils;\r
7 import org.simantics.spreadsheet.graph.SpreadsheetMatrix;\r
8 import org.simantics.spreadsheet.graph.parser.ast.AstArgList;\r
9 \r
10 public class LinestFormulaFunction implements CellFormulaFunction<SpreadsheetMatrix> {\r
11 \r
12     @Override\r
13     public SpreadsheetMatrix evaluate(CellValueVisitor visitor, AstArgList args) {\r
14         if (args.values.size() != 4)\r
15             throw new IllegalStateException();\r
16 \r
17         Object ys = args.values.get(0).accept(visitor);\r
18         Object xs = args.values.get(1).accept(visitor);\r
19 \r
20         if (xs instanceof SpreadsheetMatrix) {\r
21 \r
22             OLSMultipleLinearRegression reg = new OLSMultipleLinearRegression();\r
23 \r
24             SpreadsheetMatrix xsm = (SpreadsheetMatrix) xs;\r
25             SpreadsheetMatrix ysm = (SpreadsheetMatrix) ys;\r
26 \r
27             if (xsm.getWidth() > 1) {\r
28 \r
29                 double y[] = new double[ysm.values.length];\r
30                 double x[][] = new double[ysm.values.length][xsm.getWidth()];\r
31 \r
32                 for (int i = 0; i < ysm.values.length; i++) {\r
33                     y[i] = SpreadsheetGraphUtils.asNumber(ysm.values[i]);\r
34                     for (int j = 0; j < xsm.getWidth(); j++) {\r
35                         x[i][j] = SpreadsheetGraphUtils.asNumber(xsm.get(i, j));\r
36                     }\r
37                 }\r
38 \r
39                 reg.newSampleData(y, x);\r
40 \r
41                 int width = xsm.getWidth() + 1;\r
42                 SpreadsheetMatrix result = new SpreadsheetMatrix(width, 5);\r
43                 double[] pars = reg.estimateRegressionParameters();\r
44                 for (int i = 0; i < width; i++)\r
45                     result.set(0, width - i - 1, pars[i]);\r
46                 double[] errs = reg.estimateRegressionParametersStandardErrors();\r
47                 for (int i = 0; i < width; i++)\r
48                     result.set(1, width - i - 1, errs[i]);\r
49 \r
50                 double sstotal = reg.calculateTotalSumOfSquares();\r
51                 double ssresid = reg.calculateResidualSumOfSquares();\r
52                 double ssreg = sstotal - ssresid;\r
53                 double F = 0;\r
54                 double r2 = ssreg / sstotal;\r
55                 double sey = reg.estimateRegressionStandardError();\r
56                 double df = width;\r
57 \r
58                 result.set(2, 0, r2);\r
59                 result.set(2, 1, sey);\r
60                 result.set(3, 0, F);\r
61                 result.set(3, 1, df);\r
62                 result.set(4, 0, ssreg);\r
63                 result.set(4, 1, ssresid);\r
64                 result.set(2,2, FormulaError2.NA.getString());\r
65                 result.set(3,2, FormulaError2.NA.getString());\r
66                 result.set(4,2, FormulaError2.NA.getString());\r
67                 \r
68                 return result;\r
69 \r
70             }\r
71 \r
72         }\r
73 \r
74         return null;\r
75     }\r
76 \r
77 }\r