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