Exemplo n.º 1
0
        static AsthmaModel.Beliefs[] RunTraining(
            AllergenData data,
            int[] numberSensitizationClasses,
            bool showFactorGraph = false)
        {
            AsthmaModel.Beliefs[] result = new AsthmaModel.Beliefs[numberSensitizationClasses.Length];
            AsthmaModel[]         model  = Util.ArrayInit(
                numberSensitizationClasses.Length,
                n => new AsthmaModel("AsthmaTrainingModel_" + numberSensitizationClasses[n])
            {
                Iterations = AsthmaModelIterations     // Increase this for more classes.
            });

            Console.WriteLine("Model iteration progress");
            var reporter = new ConsoleMultiProgressReporter(
                Util.ArrayInit(numberSensitizationClasses.Length, n => "AsthmaTrainingModel_" + numberSensitizationClasses[n]),
                Util.ArrayInit(numberSensitizationClasses.Length, n => AsthmaModelIterations));

            // Randomly initialize messages externally to parallel loop so we remain deterministic.
            for (int n = 0; n < numberSensitizationClasses.Length; n++)
            {
                int idx = n; // for closure to work
                model[n].InitializeMessages(data, numberSensitizationClasses[n]);
                model[n].ProgressChanged += (e, p) => reporter.UpdateProgress(idx, p.Iteration + 1);
            }

            Parallel.For(0, numberSensitizationClasses.Length, n =>
            {
                result[n] = model[n].Run(data, numberSensitizationClasses[n], initializeMessages: false, showFactorGraph: showFactorGraph);
            });

            return(result);
        }
Exemplo n.º 2
0
        public static Dictionary <string, IList> GetConditionalProbsOfPositiveTest(AsthmaModel.Beliefs beliefs)
        {
            var result = new Dictionary <string, IList>();

            result[""] = new List <string> {
                "Prob. of Pos. Skin Test", "Prob. of Pos. IgE Test",
            };
            result["If Sensitized"] = new List <Beta> {
                beliefs.ProbSkinIfSensitized, beliefs.ProbIgEIfSensitized
            };
            result["If Not Sensitized"] = new List <Beta> {
                beliefs.ProbSkinIfNotSensitized, beliefs.ProbIgEIfNotSensitized
            };

            return(result);
        }
Exemplo n.º 3
0
        public static Dictionary <string, Dictionary <string, Dictionary <string, double> > > GetSensitizationPerYearPerClass(AsthmaModel.Beliefs beliefs, List <string> allergens, bool usePercentages = false)
        {
            int nY = AllergenData.NumYears;
            int nA = allergens.Count;
            var childVulnerabilityClass = beliefs.VulnerabilityClass.Select(cl => cl.GetMode()).ToArray();
            var classCount         = Enumerable.Range(0, beliefs.NumberOfClasses).Select(c => childVulnerabilityClass.Count(childVuln => childVuln == c)).ToArray();
            var sortedClassIndices = classCount.Select((classCnt, classIndex) => new { classCnt, classIndex }).OrderByDescending(ci => ci.classCnt).Select(ic => ic.classIndex).ToArray();

            string[] keys = BuildKeys(sortedClassIndices.Select(idx => classCount[idx]).ToArray());
            var      percentInverseClassCount = classCount.Select(cnt => 100.0 / cnt).ToArray();

            return(Enumerable.Range(0, beliefs.NumberOfClasses).ToDictionary(
                       cx => keys[cx].ToString(),
                       cx =>
            {
                int c = sortedClassIndices[cx];
                var indicesInClass = Enumerable.Range(0, beliefs.NumberOfChildren).Where(childIndex => childVulnerabilityClass[childIndex] == c);

                // The sensitivity counts accumulated over allergens
                var sensitivityExpectationsAccumOverAllergens = indicesInClass.Select(childIndex =>
                                                                                      Enumerable.Range(0, nY).Select(
                                                                                          y => Enumerable.Range(0, nA).Sum(a => beliefs.Sensitization[y][childIndex, a].GetProbTrue())).ToArray());
                return Enumerable.Range(0, seriesNamesForSensitizationPlots.Length).ToDictionary(
                    s => seriesNamesForSensitizationPlots[s],
                    s => Enumerable.Range(0, nY).ToDictionary(
                        y => AllergenData.Years[y],
                        y => (usePercentages ? percentInverseClassCount[c] : 1.0) * sensitivityExpectationsAccumOverAllergens.Count(sc => sc[y] >= lowCutoffsForSensitizationPlots[s] && sc[y] < highCutoffsForSensitizationPlots[s])));
            }));
        }
Exemplo n.º 4
0
        public static Dictionary <string, Dictionary <string, PointWithBounds[]> > GetTransitionProbabilities(AsthmaModel.Beliefs beliefs, bool getRetain, List <string> allergens)
        {
            int nY = AllergenData.NumYears;
            int nA = allergens.Count;
            var childVulnerabilityClass = beliefs.VulnerabilityClass.Select(cl => cl.GetMode()).ToArray();
            var classCount         = Enumerable.Range(0, beliefs.NumberOfClasses).Select(c => childVulnerabilityClass.Count(childVuln => childVuln == c)).ToArray();
            var sortedClassIndices = classCount.Select((classCnt, classIndex) => new { classCnt, classIndex }).OrderByDescending(ci => ci.classCnt).Select(ic => ic.classIndex).ToArray();

            string[] keys = BuildKeys(sortedClassIndices.Select(idx => classCount[idx]).ToArray());
            return(Enumerable.Range(0, beliefs.NumberOfClasses).ToDictionary(
                       cx => keys[cx].ToString(),
                       cx =>
            {
                return Enumerable.Range(0, nA).ToDictionary(
                    a => allergens[a],
                    a =>
                {
                    int startY = getRetain ? 1 : 0;
                    int c = sortedClassIndices[cx];
                    return Enumerable.Range(startY, nY - startY).Select(
                        y =>
                    {
                        var beta = y == 0 ?
                                   beliefs.ProbSensitizationAgeOne[a, c] :
                                   getRetain ? beliefs.ProbRetainSensitization[y][a, c] : beliefs.ProbGainSensitization[y][a, c];
                        return new PointWithBounds(
                            int.Parse(AllergenData.Years[y]),
                            beta.GetMean(),
                            BetaQuantile(beta, 0.25),
                            BetaQuantile(beta, 0.75));
                    }).ToArray();
                });
            }
                       ));
        }
Exemplo n.º 5
0
        public static Dictionary <string, Dictionary <string, string> > GetPlusMinusStringChildrenWithOutcome(AsthmaModel.Beliefs beliefs, AllergenData data, int[] outcomeIndicesToPlot)
        {
            var childrenCountsPerOutcome = getChildrenCountsPerOutcome(beliefs, data, outcomeIndicesToPlot);

            return(childrenCountsPerOutcome.ToDictionary(
                       kvp => kvp.Key, kvp => kvp.Value.ToDictionary(
                           kvp1 => kvp1.Key,
                           kvp1 => PlusMinusString(new Beta(kvp1.Value.Item1 + 1, kvp1.Value.Item2 + 1)))));
        }
Exemplo n.º 6
0
        public static Dictionary <string, Dictionary <string, double> > GetPercentageChildrenWithOutcome(AsthmaModel.Beliefs beliefs, AllergenData data, int[] outcomeIndicesToPlot)
        {
            var childrenCountsPerOutcome = getChildrenCountsPerOutcome(beliefs, data, outcomeIndicesToPlot);

            return(childrenCountsPerOutcome.ToDictionary(
                       kvp => kvp.Key, kvp => kvp.Value.ToDictionary(
                           kvp1 => kvp1.Key,
                           kvp1 =>
            {
                var denom = kvp1.Value.Item1 + kvp1.Value.Item2;
                return denom == 0.0 ? 0.0 : 100.00 * kvp1.Value.Item1 / denom;
            })));
        }
Exemplo n.º 7
0
        private static Dictionary <string, Dictionary <string, Tuple <double, double, double> > > getChildrenCountsPerOutcome(AsthmaModel.Beliefs beliefs, AllergenData data, int[] outcomeIndicesToPlot)
        {
            var childVulnerabilityClass = beliefs.VulnerabilityClass.Select(cl => cl.GetMode()).ToArray();
            var classCount         = Enumerable.Range(0, beliefs.NumberOfClasses).Select(c => childVulnerabilityClass.Count(childVuln => childVuln == c)).ToArray();
            var sortedClassIndices = classCount.Select((classCnt, classIndex) => new { classCnt, classIndex }).OrderByDescending(ci => ci.classCnt).Select(ic => ic.classIndex).ToArray();

            return(Enumerable.Range(0, beliefs.NumberOfClasses).Where(cx => classCount[sortedClassIndices[cx]] > 0).ToDictionary(
                       cx => "Class " + cx.ToString(),
                       cx =>
            {
                int c = sortedClassIndices[cx];
                var indicesInClass = Enumerable.Range(0, beliefs.NumberOfChildren).Where(childIndex => childVulnerabilityClass[childIndex] == c);

                return Enumerable.Range(0, outcomeIndicesToPlot.Length).ToDictionary(
                    o => data.OutcomeIndexToOutcomeName[outcomeIndicesToPlot[o]],
                    o =>
                {
                    int oIdx = outcomeIndicesToPlot[o];
                    var postiveCount = indicesInClass.Count(childIndex => data.Outcomes[oIdx][childIndex] != null && data.Outcomes[oIdx][childIndex].Value == 1);
                    var negativeCount = indicesInClass.Count(childIndex => data.Outcomes[oIdx][childIndex] != null && data.Outcomes[oIdx][childIndex].Value == 0);
                    var nullCount = indicesInClass.Count(childIndex => data.Outcomes[oIdx][childIndex] == null);
                    return Tuple.Create((double)postiveCount, (double)negativeCount, (double)nullCount);
                });
            }));
        }
Exemplo n.º 8
0
        public static Dictionary <string, Dictionary <string, Dictionary <string, double> > > GetNumberOfChildrenWithInferredSensitization(AsthmaModel.Beliefs beliefs, List <string> allergens, bool usePercentages = false)
        {
            int nY = AllergenData.NumYears;
            int nA = allergens.Count;
            var childVulnerabilityClass = beliefs.VulnerabilityClass.Select(cl => cl.GetMode()).ToArray();
            var classCount         = Enumerable.Range(0, beliefs.NumberOfClasses).Select(c => childVulnerabilityClass.Count(childVuln => childVuln == c)).ToArray();
            var sortedClassIndices = classCount.Select((classCnt, classIndex) => new { classCnt, classIndex }).OrderByDescending(ci => ci.classCnt).Select(ic => ic.classIndex).ToArray();

            string[] keys = BuildKeys(sortedClassIndices.Select(idx => classCount[idx]).ToArray());
            var      percentInverseClassCount = classCount.Select(cnt => 100.0 / cnt).ToArray();

            return(Enumerable.Range(0, beliefs.NumberOfClasses).ToDictionary(
                       cx => keys[cx].ToString(),
                       cx =>
            {
                int c = sortedClassIndices[cx];
                var indicesInClass = Enumerable.Range(0, beliefs.NumberOfChildren).Where(childIndex => childVulnerabilityClass[childIndex] == c);

                return Enumerable.Range(0, nY).ToDictionary(
                    y => $"Age {AllergenData.Years[y]}",
                    y => Enumerable.Range(0, nA).ToDictionary(
                        a => allergens[a],
                        a => (usePercentages ? percentInverseClassCount[c] : 1.0) * indicesInClass.Count(childIndex => beliefs.Sensitization[y][childIndex, a].GetProbTrue() > 0.5)));
            }));
        }