protected override void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            Configuration config = dashboardHelper.Config;
            Dictionary<string, string> setProperties = new Dictionary<string, string>();
            setProperties.Add("BLabels", config.Settings.RepresentationOfYes + ";" + config.Settings.RepresentationOfNo + ";" + config.Settings.RepresentationOfMissing); // TODO: Replace Yes, No, Missing with global vars

            bool includeMissing = true;

            Dictionary<string, string> inputVariableList = GadgetOptions.InputVariableList;

            lock (syncLock)
            {
                Stopwatch stopwatch = new Stopwatch();
                stopwatch.Start();

                this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToProcessingState));
                this.Dispatcher.BeginInvoke(new SimpleCallback(ClearResults));

                SetGridTextDelegate setText = new SetGridTextDelegate(SetGridText);
                AddGridRowDelegate addRow = new AddGridRowDelegate(AddGridRow);

                System.Collections.Generic.Dictionary<string, System.Data.DataTable> Freq_ListSet = new Dictionary<string, System.Data.DataTable>();

                string customFilter = string.Empty;
                List<string> columnNames = new List<string>();

                foreach (KeyValuePair<string, string> kvp in inputVariableList)
                {
                    if (kvp.Key.ToLower().Equals("includemissing"))
                    {
                        includeMissing = bool.Parse(kvp.Value);
                    }
                }

                foreach (KeyValuePair<string, string> kvp in inputVariableList)
                {
                    if (kvp.Value.ToLower().Equals("unsorted") || kvp.Value.ToLower().Equals("dependvar") || kvp.Value.ToLower().Equals("weightvar") || kvp.Value.ToLower().Equals("matchvar"))
                    {
                        columnNames.Add(kvp.Key);
                        if (!kvp.Value.ToLower().Equals("dependvar"))
                        {
                            customFilter = customFilter + StringLiterals.PARANTHESES_OPEN + StringLiterals.LEFT_SQUARE_BRACKET + kvp.Key + StringLiterals.RIGHT_SQUARE_BRACKET + StringLiterals.SPACE + "is not null" + StringLiterals.PARANTHESES_CLOSE + " AND ";
                        }
                    }
                    else if (kvp.Value.ToLower().Equals("discrete"))
                    {
                        columnNames.Add(kvp.Key);
                        customFilter = customFilter + StringLiterals.PARANTHESES_OPEN + StringLiterals.LEFT_SQUARE_BRACKET + kvp.Key + StringLiterals.RIGHT_SQUARE_BRACKET + StringLiterals.SPACE + "is not null" + StringLiterals.PARANTHESES_CLOSE + " AND ";
                    }
                }

                if (includeMissing)
                {
                    customFilter = string.Empty;
                }
                else
                {
                    customFilter = customFilter.Remove(customFilter.Length - 4, 4);
                }

                try
                {
                    lock (staticSyncLock)
                    {
                        DataTable regressTable = dashboardHelper.GenerateTable(columnNames, customFilter);
                        RegressionResults results = new RegressionResults();

                        if (regressTable == null || regressTable.Rows.Count <= 0)
                        {
                            this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.NO_RECORDS_SELECTED);
                            this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState));
                            Debug.Print("Thread stopped due to errors.");
                            return;
                        }
                        else if (worker.CancellationPending)
                        {
                            this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.DASHBOARD_GADGET_STATUS_OPERATION_CANCELLED);
                            this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState));
                            Debug.Print("Thread cancelled");
                            return;
                        }
                        else
                        {
                            StatisticsRepository.LogisticRegression logisticRegression = new StatisticsRepository.LogisticRegression();

                            results.regressionResults = logisticRegression.LogisticRegression(inputVariableList, regressTable);

                            results.casesIncluded = results.regressionResults.casesIncluded;
                            results.convergence = results.regressionResults.convergence;
                            results.finalLikelihood = results.regressionResults.finalLikelihood;
                            results.iterations = results.regressionResults.iterations;
                            results.LRDF = results.regressionResults.LRDF;
                            results.LRP = results.regressionResults.LRP;
                            results.LRStatistic = results.regressionResults.LRStatistic;
                            results.scoreDF = results.regressionResults.scoreDF;
                            results.scoreP = results.regressionResults.scoreP;
                            results.scoreStatistic = results.regressionResults.scoreStatistic;
                            results.errorMessage = results.regressionResults.errorMessage.Replace("<tlt>", string.Empty).Replace("</tlt>", string.Empty);
                            results.variables = new List<VariableRow>();

                            if (!string.IsNullOrEmpty(results.errorMessage))
                            {
                                throw new ApplicationException(results.errorMessage);

                            }
                            if (results.regressionResults.variables != null)
                            {
                                foreach (StatisticsRepository.LogisticRegression.VariableRow vrow in results.regressionResults.variables)
                                {
                                    VariableRow nrow = new VariableRow();
                                    nrow.coefficient = vrow.coefficient;
                                    nrow.ci = vrow.ci;
                                    nrow.P = vrow.P;
                                    nrow.ninetyFivePercent = vrow.ninetyFivePercent;
                                    nrow.oddsRatio = vrow.oddsRatio;
                                    nrow.se = vrow.se;
                                    nrow.variableName = vrow.variableName;
                                    nrow.Z = vrow.Z;
                                    results.variables.Add(nrow);
                                }

                                this.Dispatcher.BeginInvoke(new SimpleCallback(RenderRegressionHeader));

                                int rowCount = 1;
                                foreach (VariableRow row in results.variables)
                                {
                                    this.Dispatcher.Invoke(addRow, grdRegress, 30);

                                    string displayValue = row.variableName;

                                    this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(displayValue, new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Left, TextAlignment.Left, rowCount, 0, Visibility.Visible));
                                    if (row.oddsRatio <= -9999)
                                    {
                                        this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig("*", new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 1, Visibility.Visible));
                                        this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig("*", new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 2, Visibility.Visible));
                                        this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig("*", new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 3, Visibility.Visible));
                                    }
                                    else
                                    {
                                        this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(row.oddsRatio.ToString("F4"), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 1, Visibility.Visible));
                                        this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(row.ninetyFivePercent.ToString("F4"), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 2, Visibility.Visible));
                                        if (row.ci > 1.0E12)
                                        {
                                            this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(">1.0E12", new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 3, Visibility.Visible));
                                        }
                                        else
                                        {
                                            this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(row.ci.ToString("F4"), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 3, Visibility.Visible));
                                        }
                                    }
                                    this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(row.coefficient.ToString("F4"), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 4, Visibility.Visible));
                                    this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(row.se.ToString("F4"), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 5, Visibility.Visible));
                                    this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(row.Z.ToString("F4"), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 6, Visibility.Visible));
                                    this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(row.P.ToString("F4"), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 7, Visibility.Visible));

                                    rowCount++;
                                }

                                if (results.regressionResults.interactionOddsRatios != null)
                                {
                                    this.Dispatcher.BeginInvoke(new SimpleCallback(RenderIORHeader));
                                    rowCount = 1;
                                    foreach (StatisticsRepository.LogisticRegression.InteractionRow ir in results.regressionResults.interactionOddsRatios)
                                    {
                                        this.Dispatcher.Invoke(addRow, grdIOR, 30);
                                        this.Dispatcher.BeginInvoke(setText, grdIOR, new TextBlockConfig(ir.interactionName.ToString(), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Left, TextAlignment.Right, rowCount, 0, Visibility.Visible));
                                        this.Dispatcher.BeginInvoke(setText, grdIOR, new TextBlockConfig(ir.oddsRatio.ToString(), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Left, TextAlignment.Right, rowCount, 1, Visibility.Visible));
                                        this.Dispatcher.BeginInvoke(setText, grdIOR, new TextBlockConfig(ir.ninetyFivePercent.ToString(), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Left, TextAlignment.Right, rowCount, 2, Visibility.Visible));
                                        this.Dispatcher.BeginInvoke(setText, grdIOR, new TextBlockConfig(ir.ci.ToString(), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Left, TextAlignment.Right, rowCount, 3, Visibility.Visible));
                                        rowCount++;
                                    }
                                }

                                this.Dispatcher.BeginInvoke(new SimpleCallback(DrawRegressionBorders));
                            }

                        }

                        this.Dispatcher.BeginInvoke(new RenderGridDelegate(RenderRegressionResults), results);
                        this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState));
                    }
                }
                catch (Exception ex)
                {
                    this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), ex.Message);
                    this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState));
                }
                finally
                {
                    stopwatch.Stop();
                    Debug.Print("Logistic regression gadget took " + stopwatch.Elapsed.ToString() + " seconds to complete with " + dashboardHelper.RecordCount.ToString() + " records and the following filters:");
                    Debug.Print(dashboardHelper.DataFilters.GenerateDataFilterString());
                    //gridCells.singleTableResults = new StatisticsRepository.cTable().SigTable((double)gridCells.yyVal, (double)gridCells.ynVal, (double)gridCells.nyVal, (double)gridCells.nnVal, 0.95);
                }
            }
        }
        private void RenderRegressionResults(RegressionResults results)
        {
            txtConvergence.Visibility = Visibility.Visible;
            txtIterations.Visibility = Visibility.Visible;
            txtFinalLog.Visibility = Visibility.Visible;
            txtCasesIncluded.Visibility = Visibility.Visible;

            txtConvergenceLabel.Visibility = Visibility.Visible;
            txtIterationsLabel.Visibility = Visibility.Visible;
            txtFinalLogLabel.Visibility = Visibility.Visible;
            txtCasesIncludedLabel.Visibility = Visibility.Visible;

            grdRegress.Visibility = System.Windows.Visibility.Visible;
            grdIOR.Visibility = System.Windows.Visibility.Visible;
            grdStats.Visibility = System.Windows.Visibility.Visible;
            grdParameters.Visibility = System.Windows.Visibility.Visible;

            waitPanel.Visibility = System.Windows.Visibility.Collapsed;
            btnRun.IsEnabled = true;

            if (!string.IsNullOrEmpty(results.errorMessage) || results.variables == null)
            {
                grdParameters.Visibility = System.Windows.Visibility.Hidden;
                grdStats.Visibility = System.Windows.Visibility.Visible;

                txtConvergence.Text = string.Empty;
                txtIterations.Text = string.Empty;
                txtFinalLog.Text = string.Empty;
                txtCasesIncluded.Text = string.Empty;

                txtIterationsLabel.Text = string.Empty;
                txtFinalLogLabel.Text = string.Empty;
                txtCasesIncludedLabel.Text = string.Empty;

                txtConvergenceLabel.Text = results.errorMessage;
                txtConvergenceLabel.TextWrapping = TextWrapping.Wrap;
            }
            else
            {
                grdParameters.Visibility = System.Windows.Visibility.Visible;
                grdStats.Visibility = System.Windows.Visibility.Visible;

                txtScoreStatistic.Text = StringLiterals.SPACE + results.scoreStatistic.ToString("F4") + StringLiterals.SPACE;
                txtScoreDF.Text = StringLiterals.SPACE + results.scoreDF.ToString() + StringLiterals.SPACE;
                txtScoreP.Text = StringLiterals.SPACE + results.scoreP.ToString("F4") + StringLiterals.SPACE;

                txtLStatistic.Text = StringLiterals.SPACE + results.LRStatistic.ToString("F4") + StringLiterals.SPACE;
                txtLDF.Text = StringLiterals.SPACE + results.LRDF.ToString() + StringLiterals.SPACE;
                txtLP.Text = StringLiterals.SPACE + results.LRP.ToString("F4") + StringLiterals.SPACE;

                txtConvergence.Text = results.convergence;
                txtIterations.Text = StringLiterals.SPACE + results.iterations.ToString() + StringLiterals.SPACE;
                txtFinalLog.Text = StringLiterals.SPACE + results.finalLikelihood.ToString("F4") + StringLiterals.SPACE;
                txtCasesIncluded.Text = StringLiterals.SPACE + results.casesIncluded.ToString() + StringLiterals.SPACE;

                txtConvergenceLabel.Text = "Convergence:";
                txtIterationsLabel.Text ="Iterations:";
                txtFinalLogLabel.Text = "Final -2*Log-Likelihood:";
                txtCasesIncludedLabel.Text = "Cases Included:";
            }
        }
        protected override void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            lock (syncLock)
            {
                Configuration config = DashboardHelper.Config;
                Dictionary<string, string> setProperties = new Dictionary<string, string>();
                setProperties.Add("Intercept", "true");
                setProperties.Add("P", 0.95.ToString());
                setProperties.Add("BLabels", config.Settings.RepresentationOfYes + ";" + config.Settings.RepresentationOfNo + ";" + config.Settings.RepresentationOfMissing); // TODO: Replace Yes, No, Missing with global vars

                //Dictionary<string, string> inputVariableList = (Dictionary<string, string>)e.Argument;

                Stopwatch stopwatch = new Stopwatch();
                stopwatch.Start();

                this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToProcessingState));
                this.Dispatcher.BeginInvoke(new SimpleCallback(ClearResults));

                SetGridTextDelegate setText = new SetGridTextDelegate(SetGridText);
                AddGridRowDelegate addRow = new AddGridRowDelegate(AddGridRow);
                //SetGridBarDelegate setBar = new SetGridBarDelegate(SetGridBar);

                System.Collections.Generic.Dictionary<string, System.Data.DataTable> Freq_ListSet = new Dictionary<string, System.Data.DataTable>();

                //string customFilter = string.Empty;
                List<string> columnNames = new List<string>();

                foreach (KeyValuePair<string, string> kvp in GadgetOptions.InputVariableList)
                {
                    if (kvp.Value.ToLower().Equals("unsorted") || kvp.Value.ToLower().Equals("dependvar") || kvp.Value.ToLower().Equals("weightvar") || kvp.Value.ToLower().Equals("matchvar"))
                    {
                        columnNames.Add(kvp.Key);
                    }
                    else if (kvp.Value.ToLower().Equals("discrete"))
                    {
                        columnNames.Add(kvp.Key);
                    }
                }

                try
                {
                    lock (staticSyncLock)
                    {
                        RequestUpdateStatusDelegate requestUpdateStatus = new RequestUpdateStatusDelegate(RequestUpdateStatusMessage);
                        CheckForCancellationDelegate checkForCancellation = new CheckForCancellationDelegate(IsCancelled);

                        GadgetOptions.GadgetStatusUpdate += new GadgetStatusUpdateHandler(requestUpdateStatus);
                        GadgetOptions.GadgetCheckForCancellation += new GadgetCheckForCancellationHandler(checkForCancellation);

                        DataTable regressTable = DashboardHelper.GenerateTable(columnNames);
                        RegressionResults results = new RegressionResults();

                        if (regressTable == null || regressTable.Rows.Count <= 0)
                        {
                            this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.NO_RECORDS_SELECTED);
                            this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState));
                            Debug.Print("Thread stopped due to errors.");
                            return;
                        }
                        else if (worker.CancellationPending)
                        {
                            this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.DASHBOARD_GADGET_STATUS_OPERATION_CANCELLED);
                            this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState));
                            Debug.Print("Thread cancelled");
                            return;
                        }
                        else
                        {
                            StatisticsRepository.LinearRegression linearRegression = new StatisticsRepository.LinearRegression();

                            results.regressionResults = linearRegression.LinearRegression(GadgetOptions.InputVariableList, regressTable);

                            results.correlationCoefficient = results.regressionResults.correlationCoefficient;
                            results.regressionDf = results.regressionResults.regressionDf;
                            results.regressionF = results.regressionResults.regressionF;
                            results.regressionMeanSquare = results.regressionResults.regressionMeanSquare;
                            results.regressionSumOfSquares = results.regressionResults.regressionSumOfSquares;
                            results.residualsDf = results.regressionResults.residualsDf;
                            results.residualsMeanSquare = results.regressionResults.residualsMeanSquare;
                            results.residualsSumOfSquares = results.regressionResults.residualsSumOfSquares;
                            results.totalDf = results.regressionResults.totalDf;
                            results.totalSumOfSquares = results.regressionResults.totalSumOfSquares;
                            results.errorMessage = results.regressionResults.errorMessage.Replace("<tlt>", string.Empty).Replace("</tlt>", string.Empty);

                            if (!string.IsNullOrEmpty(results.errorMessage))
                            {
                                throw new ApplicationException(results.errorMessage);
                            }

                            results.variables = new List<VariableRow>();

                            if (results.regressionResults.variables != null)
                            {
                                double tScore = 1.9;
                                while (Epi.Statistics.SharedResources.PFromT(tScore, results.residualsDf) > 0.025)
                                {
                                    tScore += 0.000001;
                                }
                                foreach (StatisticsRepository.LinearRegression.VariableRow vrow in results.regressionResults.variables)
                                {
                                    VariableRow nrow = new VariableRow();
                                    nrow.coefficient = vrow.coefficient;
                                    nrow.Ftest = vrow.Ftest;
                                    nrow.P = vrow.P;
                                    nrow.stdError = vrow.stdError;
                                    nrow.variableName = vrow.variableName;
                                    nrow.coefficientLower = nrow.coefficient - tScore * nrow.stdError;
                                    nrow.coefficientUpper = nrow.coefficient + tScore * nrow.stdError;
                                    results.variables.Add(nrow);
                                }

                                results.regressionFp = Epi.Statistics.SharedResources.PFromF(results.regressionF, results.regressionDf, results.residualsDf);

                                this.Dispatcher.BeginInvoke(new SimpleCallback(RenderRegressionHeader));

                                int rowCount = 1;
                                foreach (VariableRow row in results.variables)
                                {
                                    this.Dispatcher.Invoke(addRow, grdRegress, 30);

                                    string displayValue = row.variableName;

                                    this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(StringLiterals.SPACE + displayValue + StringLiterals.SPACE, new Thickness(2, 0, 2, 0), VerticalAlignment.Center, HorizontalAlignment.Left, TextAlignment.Left, rowCount, 0, Visibility.Visible));
                                    this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(StringLiterals.SPACE + row.coefficient.ToString("F3") + StringLiterals.SPACE, new Thickness(2, 0, 2, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 1, Visibility.Visible));
                                    this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(StringLiterals.SPACE + row.coefficientLower.ToString("F3") + StringLiterals.SPACE, new Thickness(2, 0, 2, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 2, Visibility.Visible));
                                    this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(StringLiterals.SPACE + row.coefficientUpper.ToString("F3") + StringLiterals.SPACE, new Thickness(2, 0, 2, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 3, Visibility.Visible));

                                    this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(StringLiterals.SPACE + row.stdError.ToString("F3") + StringLiterals.SPACE, new Thickness(2, 0, 2, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 4, Visibility.Visible));
                                    this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(StringLiterals.SPACE + row.Ftest.ToString("F4") + StringLiterals.SPACE, new Thickness(2, 0, 2, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 5, Visibility.Visible));
                                    this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(StringLiterals.SPACE + row.P.ToString("F6") + StringLiterals.SPACE, new Thickness(2, 0, 2, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 6, Visibility.Visible));

                                    rowCount++;
                                }

                                //this.Dispatcher.BeginInvoke(new AddGridFooterDelegate(RenderFrequencyFooter), rowCount, count);
                                this.Dispatcher.BeginInvoke(new SimpleCallback(DrawRegressionBorders));
                            }
                        }

                        this.Dispatcher.BeginInvoke(new RenderGridDelegate(RenderRegressionResults), results);
                        this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState));
                    }
                }
                catch (Exception ex)
                {
                    this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), ex.Message);
                    this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState));
                }
                finally
                {
                    stopwatch.Stop();
                    Debug.Print("Linear regression gadget took " + stopwatch.Elapsed.ToString() + " seconds to complete with " + DashboardHelper.RecordCount.ToString() + " records and the following filters:");
                    Debug.Print(DashboardHelper.DataFilters.GenerateDataFilterString());
                }
            }
            //gridCells.singleTableResults = new StatisticsRepository.cTable().SigTable((double)gridCells.yyVal, (double)gridCells.ynVal, (double)gridCells.nyVal, (double)gridCells.nnVal, 0.95);
        }
Example #4
0
        public void MatchedLogisticRegressionTest()
        {
            int iterations = 100;

            var reader      = new StreamReader(File.OpenRead(@"..\..\Data\MatchedLogisticCoefficientResults.csv"));
            int linesinfile = 2 * iterations;

            double[] coefficients = new double[linesinfile];
            double[] stderrs      = new double[linesinfile];
            double[] chisqs       = new double[linesinfile];
            double[] ps           = new double[linesinfile];
            int      i            = 0;

            while (!reader.EndOfStream)
            {
                var  line   = reader.ReadLine();
                var  values = line.Split(',');
                bool rv     = Double.TryParse(values[2], out coefficients[i]);
                rv = Double.TryParse(values[3], out stderrs[i]);
                rv = Double.TryParse(values[4], out chisqs[i]);
                rv = Double.TryParse(values[5], out ps[i]);
                i++;
                if (i == linesinfile)
                {
                    break;
                }
            }

            reader      = new StreamReader(File.OpenRead(@"..\..\Data\MatchedLogisticOddsRatioResults.csv"));
            linesinfile = 2 * iterations;
            double[] oddsratios = new double[linesinfile];
            double[] lowercls   = new double[linesinfile];
            double[] uppercls   = new double[linesinfile];
            i = 0;
            while (!reader.EndOfStream)
            {
                var  line   = reader.ReadLine();
                var  values = line.Split(',');
                bool rv     = Double.TryParse(values[2], out oddsratios[i]);
                rv = Double.TryParse(values[3], out lowercls[i]);
                rv = Double.TryParse(values[4], out uppercls[i]);
                i++;
                if (i == linesinfile)
                {
                    break;
                }
            }

            reader      = new StreamReader(File.OpenRead(@"..\..\Data\MatchedLogisticGlobalTestResults.csv"));
            linesinfile = 2 * iterations;
            double[] globalchisqs = new double[linesinfile];
            double[] dfs          = new double[linesinfile];
            double[] probchisqs   = new double[linesinfile];
            i = 0;
            while (!reader.EndOfStream)
            {
                var  line   = reader.ReadLine();
                var  values = line.Split(',');
                bool rv     = Double.TryParse(values[2], out globalchisqs[i]);
                rv = Double.TryParse(values[3], out dfs[i]);
                rv = Double.TryParse(values[4], out probchisqs[i]);
                i++;
                if (i == linesinfile)
                {
                    break;
                }
            }

            reader      = new StreamReader(File.OpenRead(@"..\..\Data\MatchedLogisticFitStatisticResults.csv"));
            linesinfile = iterations;
            double[] withcovariates = new double[linesinfile];
            i = 0;
            while (!reader.EndOfStream)
            {
                var  line   = reader.ReadLine();
                var  values = line.Split(',');
                bool rv     = Double.TryParse(values[1], out withcovariates[i]);
                i++;
                if (i == linesinfile)
                {
                    break;
                }
            }

            for (int j = 0; j < iterations; j++)
            {
                getData("MatchedLogisticTestData", "iteration = " + j);

                Dictionary <string, string> inputVariableList = new Dictionary <string, string>();
                inputVariableList.Add("case", "dependvar");
                inputVariableList.Add("intercept", "true");
                inputVariableList.Add("includemissing", "false");
                inputVariableList.Add("GROUPID", "matchvar");
                inputVariableList.Add("P", "0.95");
                inputVariableList.Add("indepvar1", "unsorted");
                inputVariableList.Add("indepvar2", "unsorted");

                DataTable regressTable = new DataTable();

                RegressionResults results = new RegressionResults();

                StatisticsRepository.LogisticRegression logisticRegression = new StatisticsRepository.LogisticRegression();
                results.regressionResults = logisticRegression.LogisticRegression(inputVariableList, mainTable);
                if (false)
                {
                    System.Diagnostics.Trace.Write(results.regressionResults.variables[0].oddsRatio + "\t" +
                                                   results.regressionResults.variables[0].ninetyFivePercent + "\t" +
                                                   results.regressionResults.variables[0].ci + "\t" +
                                                   results.regressionResults.variables[0].coefficient + "\t" +
                                                   results.regressionResults.variables[0].se + "\t" +
                                                   results.regressionResults.variables[0].Z + "\t" +
                                                   results.regressionResults.variables[0].P + "\n");
                    System.Diagnostics.Trace.Write(results.regressionResults.variables[1].oddsRatio + "\t" +
                                                   results.regressionResults.variables[1].ninetyFivePercent + "\t" +
                                                   results.regressionResults.variables[1].ci + "\t" +
                                                   results.regressionResults.variables[1].coefficient + "\t" +
                                                   results.regressionResults.variables[1].se + "\t" +
                                                   results.regressionResults.variables[1].Z + "\t" +
                                                   results.regressionResults.variables[1].P + "\n");
                }
                Assert.AreEqual(results.regressionResults.variables[0].oddsRatio, oddsratios[j * 2], 0.01);
                Assert.AreEqual(results.regressionResults.variables[0].ninetyFivePercent, lowercls[j * 2], 0.01);
                Assert.AreEqual(results.regressionResults.variables[0].ci, uppercls[j * 2], 0.01);
                Assert.AreEqual(results.regressionResults.variables[0].coefficient, coefficients[j * 2], 0.01);
                Assert.AreEqual(results.regressionResults.variables[0].se, stderrs[j * 2], 0.01);
                //                Assert.AreEqual(results.regressionResults.variables[0].Z, chisqs[j * 3 + 1], 0.01);
                Assert.AreEqual(results.regressionResults.variables[0].P, ps[j * 2], 0.01);
                Assert.AreEqual(results.regressionResults.variables[1].oddsRatio, oddsratios[j * 2 + 1], 0.01);
                Assert.AreEqual(results.regressionResults.variables[1].ninetyFivePercent, lowercls[j * 2 + 1], 0.01);
                Assert.AreEqual(results.regressionResults.variables[1].ci, uppercls[j * 2 + 1], 0.01);
                Assert.AreEqual(results.regressionResults.variables[1].coefficient, coefficients[j * 2 + 1], 0.01);
                Assert.AreEqual(results.regressionResults.variables[1].se, stderrs[j * 2 + 1], 0.01);
                //                Assert.AreEqual(results.regressionResults.variables[1].Z, chisqs[j * 3 + 2], 0.01);
                Assert.AreEqual(results.regressionResults.variables[1].P, ps[j * 2 + 1], 0.01);

                Assert.AreEqual(results.regressionResults.finalLikelihood, withcovariates[j], 0.0001);
                Assert.AreEqual(results.regressionResults.LRStatistic, globalchisqs[j * 2], 0.0001);
                Assert.AreEqual(results.regressionResults.scoreStatistic, globalchisqs[j * 2 + 1], 0.0001);
                Assert.AreEqual(results.regressionResults.LRDF, dfs[j * 2], 0.0001);
                Assert.AreEqual(results.regressionResults.scoreDF, dfs[j * 2 + 1], 0.0001);
                Assert.AreEqual(results.regressionResults.LRP, probchisqs[j * 2], 0.0001);
                Assert.AreEqual(results.regressionResults.scoreP, probchisqs[j * 2 + 1], 0.0001);
            }
        }
        private void RenderRegressionResults(RegressionResults results)
        {
            txtCorrelation.Visibility = Visibility.Visible;
            //waitCursor.Visibility = Visibility.Collapsed;
            waitPanel.Visibility = System.Windows.Visibility.Collapsed;
            grdParameters.Visibility = Visibility.Visible;
            grdRegress.Visibility = System.Windows.Visibility.Visible;
            btnRun.IsEnabled = true;

            if (!string.IsNullOrEmpty(results.errorMessage))
            {
                txtCorrelation.Text = results.errorMessage;
                Thickness margin = txtCorrelation.Margin;
                margin.Top = 52;
                txtCorrelation.Margin = margin;
                grdParameters.Visibility = System.Windows.Visibility.Hidden;
            }
            else if (results.variables == null)
            {
                txtCorrelation.Text = string.Empty;
                Thickness margin = txtCorrelation.Margin;
                margin.Top = 8;
                txtCorrelation.Margin = margin;
                grdParameters.Visibility = System.Windows.Visibility.Hidden;
            }
            else
            {
                Thickness margin = txtCorrelation.Margin;
                margin.Top = 8;
                txtCorrelation.Margin = margin;
                grdParameters.Visibility = System.Windows.Visibility.Visible;

                txtRegressionDf.Text = StringLiterals.SPACE + results.regressionDf.ToString() + StringLiterals.SPACE;
                txtRegressionSumOfSquares.Text = StringLiterals.SPACE + results.regressionSumOfSquares.ToString("F4") + StringLiterals.SPACE;
                txtRegressionMeanSquare.Text = StringLiterals.SPACE + results.regressionMeanSquare.ToString("F4") + StringLiterals.SPACE;
                txtRegressionFstatistic.Text = StringLiterals.SPACE + results.regressionF.ToString("F4") + StringLiterals.SPACE;
                txtRegressionFstatisticP.Text = StringLiterals.SPACE + results.regressionFp.ToString("F4") + StringLiterals.SPACE;

                txtResidualsDf.Text = StringLiterals.SPACE + results.residualsDf.ToString() + StringLiterals.SPACE;
                txtResidualsSumOfSquares.Text = StringLiterals.SPACE + results.residualsSumOfSquares.ToString("F4") + StringLiterals.SPACE;
                txtResidualsMeanSquare.Text = StringLiterals.SPACE + results.residualsMeanSquare.ToString("F4") + StringLiterals.SPACE;

                txtTotalDf.Text = StringLiterals.SPACE + results.totalDf.ToString() + StringLiterals.SPACE;
                txtTotalSumOfSquares.Text = StringLiterals.SPACE + results.totalSumOfSquares.ToString("F4") + StringLiterals.SPACE;

                txtCorrelation.Text = "Correlation Coefficient: r^2 = " + results.correlationCoefficient.ToString("F2");

                if (results.regressionResults.pearsonCoefficient <= 1.0)
                {
                    grdPearson.Visibility = System.Windows.Visibility.Visible;
                    txtPearsonAnalysis.Visibility = System.Windows.Visibility.Visible;
                    txtPearsonCoefficient.Text = results.regressionResults.pearsonCoefficient.ToString("F4");
                    txtPearsonCoefficientT.Text = results.regressionResults.pearsonCoefficientT.ToString("F4");
                    txtPearsonCoefficientTP.Text = results.regressionResults.pearsonCoefficientTP.ToString("F4");
                    if (results.regressionResults.pearsonCoefficientTP < 0.0001)
                        txtPearsonCoefficientTP.Text = "<0.0001";
                    if (results.regressionResults.spearmanCoefficient <= 1.0)
                    {
                        grdSpearman.Visibility = System.Windows.Visibility.Visible;
                        txtSpearmanAnalysis.Visibility = System.Windows.Visibility.Visible;
                        txtSpearmanCoefficient.Text = results.regressionResults.spearmanCoefficient.ToString("F4");
                        txtSpearmanCoefficientT.Text = results.regressionResults.spearmanCoefficientT.ToString("F4");
                        txtSpearmannCoefficientTP.Text = results.regressionResults.spearmanCoefficientTP.ToString("F4");
                        if (results.regressionResults.spearmanCoefficientTP < 0.0001)
                            txtSpearmannCoefficientTP.Text = "<0.0001";
                    }
                    else
                    {
                        grdSpearman.Visibility = System.Windows.Visibility.Collapsed;
                        txtSpearmanAnalysis.Visibility = System.Windows.Visibility.Collapsed;
                    }
                }
                else
                {
                    grdPearson.Visibility = System.Windows.Visibility.Collapsed;
                    txtPearsonAnalysis.Visibility = System.Windows.Visibility.Collapsed;
                    grdSpearman.Visibility = System.Windows.Visibility.Collapsed;
                    txtSpearmanAnalysis.Visibility = System.Windows.Visibility.Collapsed;
                }
            }

            HideConfigPanel();
        }