public static string OutputFitResults(LinearFitBySvd fit, string[] paramNames) { // Output of results Current.Console.WriteLine(""); Current.Console.WriteLine("---- " + DateTime.Now.ToString() + " -----------------------"); Current.Console.WriteLine("Multivariate regression of order {0}", fit.NumberOfParameter); Current.Console.WriteLine("{0,-15} {1,20} {2,20} {3,20} {4,20}", "Name", "Value", "Error", "F-Value", "Prob>F"); for (int i = 0; i < fit.Parameter.Length; i++) { Current.Console.WriteLine("{0,-15} {1,20} {2,20} {3,20} {4,20}", paramNames == null ? string.Format("A{0}", i) : paramNames[i], fit.Parameter[i], fit.StandardErrorOfParameter(i), fit.TofParameter(i), 1 - FDistribution.CDF(fit.TofParameter(i), fit.NumberOfParameter, fit.NumberOfData - 1) ); } Current.Console.WriteLine("R²: {0}, Adjusted R²: {1}", fit.RSquared, fit.AdjustedRSquared); Current.Console.WriteLine("------------------------------------------------------------"); Current.Console.WriteLine("Source of Degrees of"); Current.Console.WriteLine("variation freedom Sum of Squares Mean Square F0 P value"); double regressionmeansquare = fit.RegressionCorrectedSumOfSquares / fit.NumberOfParameter; double residualmeansquare = fit.ResidualSumOfSquares / (fit.NumberOfData - fit.NumberOfParameter - 1); Current.Console.WriteLine("Regression {0,10} {1,20} {2,20} {3,20} {4,20}", fit.NumberOfParameter, fit.RegressionCorrectedSumOfSquares, fit.RegressionCorrectedSumOfSquares / fit.NumberOfParameter, regressionmeansquare / residualmeansquare, 1 - FDistribution.CDF(regressionmeansquare / residualmeansquare, fit.NumberOfParameter, fit.NumberOfData - 1) ); Current.Console.WriteLine("Residual {0,10} {1,20} {2,20}", fit.NumberOfData - 1 - fit.NumberOfParameter, fit.ResidualSumOfSquares, residualmeansquare ); Current.Console.WriteLine("Total {0,10} {1,20}", fit.NumberOfData - 1, fit.TotalCorrectedSumOfSquares ); Current.Console.WriteLine("------------------------------------------------------------"); return(null); }
public static LinearFitBySvd Regress(MultivariateLinearFitParameters parameters, out string[] paramNames) { DataColumnCollection table = parameters.Table; IAscendingIntegerCollection selectedCols = parameters.SelectedDataColumns; var selectedColsWODependent = new AscendingIntegerCollection(selectedCols); selectedColsWODependent.RemoveAt(parameters.DependentColumnIndexIntoSelection); IAscendingIntegerCollection validRows = DataTableWrapper.GetCollectionOfValidNumericRows(parameters.Table, selectedCols); parameters.SelectedDataRows = validRows; IROMatrix <double> xbase; if (parameters.IncludeIntercept) { xbase = DataTableWrapper.ToROColumnMatrixWithIntercept(parameters.Table, selectedColsWODependent, validRows); } else { xbase = DataTableWrapper.ToROColumnMatrix(parameters.Table, selectedColsWODependent, validRows); } paramNames = new string[xbase.ColumnCount]; if (parameters.IncludeIntercept) { paramNames[0] = "Intercept"; for (int i = 0; i < selectedColsWODependent.Count; i++) { paramNames[i + 1] = table[selectedColsWODependent[i]].Name; } } else { for (int i = 0; i < selectedColsWODependent.Count; i++) { paramNames[i] = table[selectedColsWODependent[i]].Name; } } // Fill the y and the error array double[] yarr = new double[validRows.Count]; double[] earr = new double[validRows.Count]; var ycol = (Altaxo.Data.INumericColumn)table[selectedCols[parameters.DependentColumnIndexIntoSelection]]; for (int i = 0; i < validRows.Count; i++) { yarr[i] = ycol[validRows[i]]; earr[i] = 1; } var fit = new LinearFitBySvd( xbase, yarr, earr, xbase.RowCount, xbase.ColumnCount, 1E-5); return(fit); }
public static LinearFitBySvd Regress(MultivariateLinearFitParameters parameters, bool outputResults) { LinearFitBySvd fit = Regress(parameters, out var paramNames); if (outputResults) { OutputFitResults(fit, paramNames); if (parameters.GenerateRegressionValues) { GenerateValues(parameters, fit); } } return(fit); }
/// <summary> /// Fits data provided as xcolumn and ycolumn with a polynomial base. /// </summary> /// <param name="order">The order of the fit (1:linear, 2:quadratic, etc.)</param> /// <param name="xcolumn">The column of x-values.</param> /// <param name="ycolumn">The column of y-values.</param> /// <returns>The fit.</returns> public static LinearFitBySvd Fit(int order, Altaxo.Data.DataColumn xcolumn, Altaxo.Data.DataColumn ycolumn) { if (!(xcolumn is Altaxo.Data.INumericColumn)) { throw new ArgumentException("The x-column must be numeric", "xcolumn"); } if (!(ycolumn is Altaxo.Data.INumericColumn)) { throw new ArgumentException("The y-column must be numeric", "ycolumn"); } int firstIndex = 0; int count = Math.Min(xcolumn.Count, ycolumn.Count); double[] xarr = new double[count]; double[] yarr = new double[count]; double[] earr = new double[count]; Altaxo.Data.INumericColumn xcol = (Altaxo.Data.INumericColumn)xcolumn; Altaxo.Data.INumericColumn ycol = (Altaxo.Data.INumericColumn)ycolumn; int numberOfDataPoints = 0; int endIndex = firstIndex + count; for (int i = firstIndex; i < endIndex; i++) { double x = xcol[i]; double y = ycol[i]; if (double.IsNaN(x) || double.IsNaN(y)) { continue; } xarr[numberOfDataPoints] = x; yarr[numberOfDataPoints] = y; earr[numberOfDataPoints] = 1; numberOfDataPoints++; } LinearFitBySvd fit = new LinearFitBySvd( xarr, yarr, earr, numberOfDataPoints, order + 1, new FunctionBaseEvaluator(EvaluatePolynomialBase), 1E-5); return(fit); }
public static LinearFitBySvd ShowDialogAndRegress(DataColumnCollection table, IAscendingIntegerCollection selectedColumns) { if (selectedColumns.Count < 2) { return(null); } object paramobject = new MultivariateLinearFitParameters(table, selectedColumns); if (!Current.Gui.ShowDialog(ref paramobject, "Multivariate linear fit")) { return(null); } var parameters = (MultivariateLinearFitParameters)paramobject; LinearFitBySvd result = Regress(parameters, true); return(result); }
/// <summary> /// Fits data provided as xcolumn and ycolumn with a polynomial base. /// </summary> /// <param name="order">The order of the fit (1:linear, 2:quadratic, etc.)</param> /// <param name="xcolumn">The column of x-values.</param> /// <param name="ycolumn">The column of y-values.</param> /// <returns>The fit.</returns> public static LinearFitBySvd Fit(int order, Altaxo.Data.DataColumn xcolumn, Altaxo.Data.DataColumn ycolumn) { if (!(xcolumn is Altaxo.Data.INumericColumn)) { throw new ArgumentException("The x-column must be numeric", "xcolumn"); } if (!(ycolumn is Altaxo.Data.INumericColumn)) { throw new ArgumentException("The y-column must be numeric", "ycolumn"); } int firstIndex = 0; int count = Math.Min(xcolumn.Count, ycolumn.Count); double[] xarr = new double[count]; double[] yarr = new double[count]; double[] earr = new double[count]; var xcol = (Altaxo.Data.INumericColumn)xcolumn; var ycol = (Altaxo.Data.INumericColumn)ycolumn; int numberOfDataPoints = 0; int endIndex = firstIndex + count; for (int i = firstIndex; i < endIndex; i++) { double x = xcol[i]; double y = ycol[i]; if (double.IsNaN(x) || double.IsNaN(y)) { continue; } xarr[numberOfDataPoints] = x; yarr[numberOfDataPoints] = y; earr[numberOfDataPoints] = 1; numberOfDataPoints++; } return(LinearFitBySvd.FitPolymomialDestructive(order, xarr, yarr, earr, numberOfDataPoints)); }
public static string Fit(Altaxo.Gui.Graph.Gdi.Viewing.IGraphController ctrl, int order, double fitCurveXmin, double fitCurveXmax, bool showFormulaOnGraph) { string error; error = GetActivePlotPoints(ctrl, out var xarr, out var yarr); int numberOfDataPoints = xarr.Length; if (null != error) { return(error); } string[] plotNames = GetActivePlotName(ctrl); int numberOfParameter = order + 1; double[] parameter = new double[numberOfParameter]; var fit = LinearFitBySvd.FitPolymomialDestructive(order, xarr, yarr, null, numberOfDataPoints); // Output of results Current.Console.WriteLine(""); Current.Console.WriteLine("---- " + DateTime.Now.ToString() + " -----------------------"); Current.Console.WriteLine("Polynomial regression of order {0} of {1} over {2}", order, plotNames[1], plotNames[0]); Current.Console.WriteLine( "Name Value Error F-Value Prob>F"); for (int i = 0; i < fit.Parameter.Length; i++) { Current.Console.WriteLine("A{0,-3} {1,20} {2,20} {3,20} {4,20}", i, fit.Parameter[i], fit.StandardErrorOfParameter(i), fit.TofParameter(i), 1 - FDistribution.CDF(fit.TofParameter(i), numberOfParameter, numberOfDataPoints - 1) ); } Current.Console.WriteLine("R²: {0}, Adjusted R²: {1}", fit.RSquared, fit.AdjustedRSquared); Current.Console.WriteLine("Condition number: {0}, Loss of precision (digits): {1}", fit.ConditionNumber, Math.Log10(fit.ConditionNumber)); Current.Console.WriteLine("------------------------------------------------------------"); Current.Console.WriteLine("Source of Degrees of"); Current.Console.WriteLine("variation freedom Sum of Squares Mean Square F0 P value"); double regressionmeansquare = fit.RegressionCorrectedSumOfSquares / numberOfParameter; double residualmeansquare = fit.ResidualSumOfSquares / (numberOfDataPoints - numberOfParameter - 1); Current.Console.WriteLine("Regression {0,10} {1,20} {2,20} {3,20} {4,20}", numberOfParameter, fit.RegressionCorrectedSumOfSquares, fit.RegressionCorrectedSumOfSquares / numberOfParameter, regressionmeansquare / residualmeansquare, 1 - FDistribution.CDF(regressionmeansquare / residualmeansquare, numberOfParameter, numberOfDataPoints - 1) ); Current.Console.WriteLine("Residual {0,10} {1,20} {2,20}", numberOfDataPoints - 1 - numberOfParameter, fit.ResidualSumOfSquares, residualmeansquare ); Current.Console.WriteLine("Total {0,10} {1,20}", numberOfDataPoints - 1, fit.TotalCorrectedSumOfSquares ); Current.Console.WriteLine("------------------------------------------------------------"); // add the fit curve to the graph IScalarFunctionDD plotfunction = new PolynomialFunction(fit.Parameter); var fittedCurve = new XYFunctionPlotItem(new XYFunctionPlotData(plotfunction), new G2DPlotStyleCollection(LineScatterPlotStyleKind.Line, ctrl.Doc.GetPropertyContext())); var xylayer = ctrl.ActiveLayer as XYPlotLayer; if (null != xylayer) { xylayer.PlotItems.Add(fittedCurve); } return(null); }
public static string Fit(Altaxo.Graph.GUI.GraphController ctrl, int order, double fitCurveXmin, double fitCurveXmax, bool showFormulaOnGraph) { string error; int numberOfDataPoints; double[] xarr = null, yarr = null, earr = null; error = GetActivePlotPoints(ctrl, ref xarr, ref yarr, out numberOfDataPoints); if (null != error) { return(error); } string[] plotNames = GetActivePlotName(ctrl); // Error-Array earr = new double[numberOfDataPoints]; for (int i = 0; i < earr.Length; i++) { earr[i] = 1; } int numberOfParameter = order + 1; double[] parameter = new double[numberOfParameter]; LinearFitBySvd fit = new LinearFitBySvd( xarr, yarr, earr, numberOfDataPoints, order + 1, new FunctionBaseEvaluator(EvaluatePolynomialBase), 1E-5); // Output of results Current.Console.WriteLine(""); Current.Console.WriteLine("---- " + DateTime.Now.ToString() + " -----------------------"); Current.Console.WriteLine("Polynomial regression of order {0} of {1} over {2}", order, plotNames[1], plotNames[0]); Current.Console.WriteLine( "Name Value Error F-Value Prob>F"); for (int i = 0; i < fit.Parameter.Length; i++) { Current.Console.WriteLine("A{0,-3} {1,20} {2,20} {3,20} {4,20}", i, fit.Parameter[i], fit.StandardErrorOfParameter(i), fit.TofParameter(i), 1 - FDistribution.CDF(fit.TofParameter(i), numberOfParameter, numberOfDataPoints - 1) ); } Current.Console.WriteLine("R²: {0}, Adjusted R²: {1}", fit.RSquared, fit.AdjustedRSquared); Current.Console.WriteLine("------------------------------------------------------------"); Current.Console.WriteLine("Source of Degrees of"); Current.Console.WriteLine("variation freedom Sum of Squares Mean Square F0 P value"); double regressionmeansquare = fit.RegressionCorrectedSumOfSquares / numberOfParameter; double residualmeansquare = fit.ResidualSumOfSquares / (numberOfDataPoints - numberOfParameter - 1); Current.Console.WriteLine("Regression {0,10} {1,20} {2,20} {3,20} {4,20}", numberOfParameter, fit.RegressionCorrectedSumOfSquares, fit.RegressionCorrectedSumOfSquares / numberOfParameter, regressionmeansquare / residualmeansquare, 1 - FDistribution.CDF(regressionmeansquare / residualmeansquare, numberOfParameter, numberOfDataPoints - 1) ); Current.Console.WriteLine("Residual {0,10} {1,20} {2,20}", numberOfDataPoints - 1 - numberOfParameter, fit.ResidualSumOfSquares, residualmeansquare ); Current.Console.WriteLine("Total {0,10} {1,20}", numberOfDataPoints - 1, fit.TotalCorrectedSumOfSquares ); Current.Console.WriteLine("------------------------------------------------------------"); // add the fit curve to the graph IScalarFunctionDD plotfunction = new PolynomialFunction(fit.Parameter); XYFunctionPlotItem fittedCurve = new XYFunctionPlotItem(new XYFunctionPlotData(plotfunction), new G2DPlotStyleCollection(LineScatterPlotStyleKind.Line)); ctrl.ActiveLayer.PlotItems.Add(fittedCurve); return(null); }
public static string OutputFitResults(LinearFitBySvd fit, string[] paramNames) { // Output of results Current.Console.WriteLine(""); Current.Console.WriteLine("---- " + DateTime.Now.ToString() + " -----------------------"); Current.Console.WriteLine("Multivariate regression of order {0}",fit.NumberOfParameter); Current.Console.WriteLine("{0,-15} {1,20} {2,20} {3,20} {4,20}", "Name","Value","Error","F-Value","Prob>F"); for(int i=0;i<fit.Parameter.Length;i++) Current.Console.WriteLine("{0,-15} {1,20} {2,20} {3,20} {4,20}", paramNames==null ? string.Format("A{0}",i) : paramNames[i], fit.Parameter[i], fit.StandardErrorOfParameter(i), fit.TofParameter(i), 1-FDistribution.CDF(fit.TofParameter(i),fit.NumberOfParameter,fit.NumberOfData-1) ); Current.Console.WriteLine("R²: {0}, Adjusted R²: {1}", fit.RSquared, fit.AdjustedRSquared); Current.Console.WriteLine("------------------------------------------------------------"); Current.Console.WriteLine("Source of Degrees of"); Current.Console.WriteLine("variation freedom Sum of Squares Mean Square F0 P value"); double regressionmeansquare = fit.RegressionCorrectedSumOfSquares/fit.NumberOfParameter; double residualmeansquare = fit.ResidualSumOfSquares/(fit.NumberOfData-fit.NumberOfParameter-1); Current.Console.WriteLine("Regression {0,10} {1,20} {2,20} {3,20} {4,20}", fit.NumberOfParameter, fit.RegressionCorrectedSumOfSquares, fit.RegressionCorrectedSumOfSquares/fit.NumberOfParameter, regressionmeansquare/residualmeansquare, 1-FDistribution.CDF(regressionmeansquare/residualmeansquare,fit.NumberOfParameter,fit.NumberOfData-1) ); Current.Console.WriteLine("Residual {0,10} {1,20} {2,20}", fit.NumberOfData-1-fit.NumberOfParameter, fit.ResidualSumOfSquares, residualmeansquare ); Current.Console.WriteLine("Total {0,10} {1,20}", fit.NumberOfData-1, fit.TotalCorrectedSumOfSquares ); Current.Console.WriteLine("------------------------------------------------------------"); return null; }
public static void GenerateValues(MultivariateLinearFitParameters parameters, LinearFitBySvd fit) { DataColumn dependentColumn = parameters.Table[parameters.SelectedDataColumns[parameters.DependentColumnIndexIntoSelection]]; if(parameters.GenerateRegressionValues) { DoubleColumn col = new DoubleColumn(); VectorMath.Copy(VectorMath.ToROVector(fit.PredictedValues),DataColumnWrapper.ToVector(col,parameters.SelectedDataRows)); parameters.Table.Add(col,dependentColumn.Name + "(predicted)",ColumnKind.V, parameters.Table.GetColumnGroup(dependentColumn)); } if(parameters.GenerateResidualValues) { DoubleColumn col = new DoubleColumn(); VectorMath.Copy(VectorMath.ToROVector(fit.ResidualValues),DataColumnWrapper.ToVector(col,parameters.SelectedDataRows)); parameters.Table.Add(col,dependentColumn.Name + "(residual)",ColumnKind.V, parameters.Table.GetColumnGroup(dependentColumn)); } }
public static LinearFitBySvd Regress(MultivariateLinearFitParameters parameters, out string[] paramNames) { DataColumnCollection table = parameters.Table; IAscendingIntegerCollection selectedCols = parameters.SelectedDataColumns; AscendingIntegerCollection selectedColsWODependent = new AscendingIntegerCollection(selectedCols); selectedColsWODependent.RemoveAt(parameters.DependentColumnIndexIntoSelection); IAscendingIntegerCollection validRows = DataTableWrapper.GetCollectionOfValidNumericRows(parameters.Table,selectedCols); parameters.SelectedDataRows = validRows; IROMatrix xbase; if(parameters.IncludeIntercept) { xbase = DataTableWrapper.ToROColumnMatrixWithIntercept(parameters.Table,selectedColsWODependent,validRows); } else { xbase = DataTableWrapper.ToROColumnMatrix(parameters.Table,selectedColsWODependent,validRows); } paramNames = new string[xbase.Columns]; if(parameters.IncludeIntercept) { paramNames[0] = "Intercept"; for(int i=0;i<selectedColsWODependent.Count;i++) paramNames[i+1]=table[selectedColsWODependent[i]].Name; } else { for(int i=0;i<selectedColsWODependent.Count;i++) paramNames[i]=table[selectedColsWODependent[i]].Name; } // Fill the y and the error array double[] yarr = new double[validRows.Count]; double[] earr = new double[validRows.Count]; Altaxo.Data.INumericColumn ycol = (Altaxo.Data.INumericColumn)table[selectedCols[parameters.DependentColumnIndexIntoSelection]]; for(int i=0;i<validRows.Count;i++) { yarr[i] = ycol[validRows[i]]; earr[i] = 1; } LinearFitBySvd fit = new LinearFitBySvd( xbase,yarr,earr, xbase.Rows, xbase.Columns, 1E-5); return fit; }
public static void GenerateValues(MultivariateLinearFitParameters parameters, LinearFitBySvd fit) { DataColumn dependentColumn = parameters.Table[parameters.SelectedDataColumns[parameters.DependentColumnIndexIntoSelection]]; if (parameters.GenerateRegressionValues) { var col = new DoubleColumn(); VectorMath.Copy(VectorMath.ToROVector(fit.PredictedValues), DataColumnWrapper.ToVector(col, parameters.SelectedDataRows)); parameters.Table.Add(col, dependentColumn.Name + "(predicted)", ColumnKind.V, parameters.Table.GetColumnGroup(dependentColumn)); } if (parameters.GenerateResidualValues) { var col = new DoubleColumn(); VectorMath.Copy(VectorMath.ToROVector(fit.ResidualValues), DataColumnWrapper.ToVector(col, parameters.SelectedDataRows)); parameters.Table.Add(col, dependentColumn.Name + "(residual)", ColumnKind.V, parameters.Table.GetColumnGroup(dependentColumn)); } }