1 package org.simantics.spreadsheet.solver.formula;
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;
8 public class LinestFormulaFunction implements CellFormulaFunction<SpreadsheetMatrix> {
11 public SpreadsheetMatrix evaluate(CellValueVisitor visitor, AstArgList args) {
12 if (args.values.size() != 4)
13 throw new IllegalStateException();
15 Object ys = args.values.get(0).accept(visitor);
16 Object xs = args.values.get(1).accept(visitor);
18 if (xs instanceof SpreadsheetMatrix) {
20 OLSMultipleLinearRegression reg = new OLSMultipleLinearRegression();
22 SpreadsheetMatrix xsm = (SpreadsheetMatrix) xs;
23 SpreadsheetMatrix ysm = (SpreadsheetMatrix) ys;
25 if (xsm.getWidth() > 1) {
27 double y[] = new double[ysm.values.length];
28 double x[][] = new double[ysm.values.length][xsm.getWidth()];
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));
37 reg.newSampleData(y, x);
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]);
48 double sstotal = reg.calculateTotalSumOfSquares();
49 double ssresid = reg.calculateResidualSumOfSquares();
50 double ssreg = sstotal - ssresid;
52 double r2 = ssreg / sstotal;
53 double sey = reg.estimateRegressionStandardError();
57 result.set(2, 1, sey);
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());