Exemplo n.º 1
0
        private static Dictionary <string, Dictionary <string, object> > BuildPlotsForAsthmaResults(AllergenData allData, AllergenData data, int[] numClasses, AsthmaModel.Beliefs[] trainingResults)
        {
            var allergenSensitizationPlots = trainingResults.Select(res => AsthmaPlotData.GetSensitizationPerAllergenPerClass(res, data.Allergens)).ToArray();
            var yearSensitizationPlots     = trainingResults.Select(res => AsthmaPlotData.GetSensitizationPerYearPerClass(res, data.Allergens)).ToArray();
            var sensitizationCounts        = trainingResults.Select(res => AsthmaPlotData.GetNumberOfChildrenWithInferredSensitization(res, data.Allergens)).ToArray();
            var probGainingSensitivity     = trainingResults.Select(res => AsthmaPlotData.GetTransitionProbabilities(res, false, data.Allergens)).ToArray();
            var probRetainingSensitivity   = trainingResults.Select(res => AsthmaPlotData.GetTransitionProbabilities(res, true, data.Allergens)).ToArray();
            var conditionalProbs           = trainingResults.Select(res => AsthmaPlotData.GetConditionalProbsOfPositiveTestAsStrings(res)).ToArray();
            var outcomePercentagePlots     = trainingResults.Select(res => AsthmaPlotData.GetPercentageChildrenWithOutcome(res, allData, new int[] { allData.OutcomeNameToOutcomeIndex["Asthma"] })).ToArray();
            var outcomePlusMinusPlots      = trainingResults.Select(res => AsthmaPlotData.GetPlusMinusStringChildrenWithOutcome(res, allData, new int[] { allData.OutcomeNameToOutcomeIndex["Asthma"] })).ToArray();

            var results = Enumerable.Range(0, numClasses.Length).ToDictionary(
                c => "AsthmaResults" + numClasses[c],
                c =>
            {
                var result = new Dictionary <string, object>();
                result["AllergenSensitizationPlots"]      = (object)allergenSensitizationPlots[c];
                result["YearSensitizationPlots"]          = (object)yearSensitizationPlots[c];
                result["SensitizationPlots"]              = (object)sensitizationCounts[c];
                result["ProbabilityGainingSensitivity"]   = (object)probGainingSensitivity[c];
                result["ProbabilityRetainingSensitivity"] = (object)probRetainingSensitivity[c];
                result["ConditionalProbsOfPositiveTest"]  = conditionalProbs[c];
                result["PercentageChildrenWithOutcome"]   = outcomePercentagePlots[c];
                result["PlusMinusChildrenWithOutcome"]    = outcomePlusMinusPlots[c];
                return(result);
            });

            return(results);
        }
Exemplo n.º 2
0
        /// </param>
        /// <summary>
        /// Runs experiments, takes results and shows them via outputter.
        /// </summary>
        /// <param name="outputter">A container for experiments output.</param>
        /// <param name="numClassesForMultiClassRuns">Numbers of classes to use in experiments.</param>
        public static void RunExperiments(Outputter outputter, int[] numClassesForMultipleClassRuns)
        {
            bool showFactorGraph = false;

            Rand.Restart(2);

            Console.WriteLine($"\n{Contents.S2TryingOutTheModel.NumberedName}.\n");
            Console.WriteLine("Running asthma model on synthetic data.");
            Console.WriteLine("Results will slightly differ from those in the book.");
            // Synthetic dataset was created using the following call
            //DatasetSynthesizer.Synthesize(
            //    DatasetSynthesizer.DefaultSensitizationClassCollection,
            //    DatasetSynthesizer.DefaultTests,
            //    DatasetSynthesizer.DefaultDataMissingProbabilities,
            //    Path.Combine("Data", "SyntheticDataset.tsv"),
            //    Rand.Int());
            AllergenData allData = new AllergenData();

            allData.LoadDataFromTabDelimitedFile(Path.Combine("Data", "SyntheticDataset.tsv"));
            outputter.Out(allData, Contents.S2TryingOutTheModel.NumberedName, "Asthma model", "Inputs");

            var dataCounts = AsthmaPlotData.GetDataCounts(allData);

            outputter.Out(dataCounts, Contents.S2TryingOutTheModel.NumberedName, "Asthma model", "DataCounts");

            // Remove mould and peanut allergens from following analysis.
            AllergenData data = AllergenData.WithAllergensRemoved(allData, new List <string> {
                "Mould", "Peanut"
            });

            int[] numClasses1Comp = new int[] { 1 };
            AsthmaModel.Beliefs[] trainingResults1Comp = RunTraining(data, numClasses1Comp, showFactorGraph);
            outputter.Out(trainingResults1Comp, Contents.S2TryingOutTheModel.NumberedName, "Asthma model", "TrainingResults");

            // Data for plots
            Dictionary <string, Dictionary <string, object> > results1Comp = BuildPlotsForAsthmaResults(allData, data, numClasses1Comp, trainingResults1Comp);

            outputter.Out(results1Comp, Contents.S2TryingOutTheModel.NumberedName, "Asthma model", "Plots");

            Console.WriteLine($"\n{Contents.S4ModellingWithGates.NumberedName}.\n");
            Rand.Restart(1);
            var trialResult = RunClinicalTrialExperiment(showFactorGraph);

            outputter.Out(trialResult, Contents.S4ModellingWithGates.NumberedName, "ClinicalTrialPlots");

            Console.WriteLine($"\n{Contents.S5DiscoveringSensitizationClasses.NumberedName}.\n");
            Console.WriteLine("Running asthma model on synthetic data.");
            Console.WriteLine("Results will slightly differ from those in the book.");
            outputter.Out(allData, Contents.S5DiscoveringSensitizationClasses.NumberedName, "Asthma model", "Inputs");
            outputter.Out(dataCounts, Contents.S5DiscoveringSensitizationClasses.NumberedName, "Asthma model", "DataCounts");

            Rand.Restart(3); // With this random seed we get exactly 4 classes in models allowing 5 or 6
                             // provided numClassesForMultipleClassRuns == new int[] { 2, 3, 4, 5, 6 }
                             // With other seeds we may get additional classes containing very few people, which is normal
            AsthmaModel.Beliefs[] trainingResults = RunTraining(data, numClassesForMultipleClassRuns, showFactorGraph);
            outputter.Out(trainingResults, Contents.S5DiscoveringSensitizationClasses.NumberedName, "Asthma model", "TrainingResults");

            // Data for plots
            Dictionary <string, Dictionary <string, object> > results = BuildPlotsForAsthmaResults(allData, data, numClassesForMultipleClassRuns, trainingResults);

            outputter.Out(results, Contents.S5DiscoveringSensitizationClasses.NumberedName, "Asthma model", "Plots");

            Console.WriteLine("\nCompleted all experiments.");
        }