1 package org.simantics.spreadsheet.graph.formula;
\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
10 public class LinestFormulaFunction implements CellFormulaFunction<SpreadsheetMatrix> {
\r
13 public SpreadsheetMatrix evaluate(CellValueVisitor visitor, AstArgList args) {
\r
14 if (args.values.size() != 4)
\r
15 throw new IllegalStateException();
\r
17 Object ys = args.values.get(0).accept(visitor);
\r
18 Object xs = args.values.get(1).accept(visitor);
\r
20 if (xs instanceof SpreadsheetMatrix) {
\r
22 OLSMultipleLinearRegression reg = new OLSMultipleLinearRegression();
\r
24 SpreadsheetMatrix xsm = (SpreadsheetMatrix) xs;
\r
25 SpreadsheetMatrix ysm = (SpreadsheetMatrix) ys;
\r
27 if (xsm.getWidth() > 1) {
\r
29 double y[] = new double[ysm.values.length];
\r
30 double x[][] = new double[ysm.values.length][xsm.getWidth()];
\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
39 reg.newSampleData(y, x);
\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
50 double sstotal = reg.calculateTotalSumOfSquares();
\r
51 double ssresid = reg.calculateResidualSumOfSquares();
\r
52 double ssreg = sstotal - ssresid;
\r
54 double r2 = ssreg / sstotal;
\r
55 double sey = reg.estimateRegressionStandardError();
\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