Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        /// <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));
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
        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;

    }
Ejemplo n.º 12
0
        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));
            }
        }