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); }
/// </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."); }