Esempio n. 1
0
        internal static string GetXmlEduName(OccidentalEdu edu)
        {
            var eduName = "High School";

            if ((short)edu < (short)(OccidentalEdu.HighSchool | OccidentalEdu.Some))
            {
                eduName = "DropOut";
            }
            if ((short)edu > (short)(OccidentalEdu.HighSchool | OccidentalEdu.Grad) &&
                (short)edu < (short)(OccidentalEdu.Assoc | OccidentalEdu.Grad))
            {
                eduName = "Some College, No Degree";
            }
            if ((short)edu >= (short)(OccidentalEdu.Assoc | OccidentalEdu.Grad) &&
                (short)edu < (short)(OccidentalEdu.Bachelor | OccidentalEdu.Grad))
            {
                eduName = "Associate";
            }
            if ((short)edu >= (short)(OccidentalEdu.Bachelor | OccidentalEdu.Grad) &&
                (short)edu < (short)(OccidentalEdu.Master | OccidentalEdu.Grad))
            {
                eduName = "Bachelor";
            }
            if ((short)edu >= (short)(OccidentalEdu.Master | OccidentalEdu.Grad))
            {
                eduName = "PostGrad";
            }
            return(eduName);
        }
Esempio n. 2
0
        /// <summary>
        /// Produces the probability of childlessness
        /// </summary>
        /// <param name="dob"></param>
        /// <param name="educationLevel">
        /// https://en.wikipedia.org/wiki/Childfree#Education
        /// </param>
        /// <returns></returns>
        /// <remarks>
        /// Data regarded women-only and did not incorporate <see cref="NorthAmericanRace"/>
        /// </remarks>
        public static double SolveForProbabilityChildless(DateTime?dob,
                                                          OccidentalEdu educationLevel = OccidentalEdu.HighSchool | OccidentalEdu.Grad)
        {
            dob = dob ?? Etx.RandomAdultBirthDate();
            var eduAdditive = 0.0;

            if (educationLevel == (OccidentalEdu.Bachelor | OccidentalEdu.Grad))
            {
                eduAdditive = 0.09;
            }
            if (educationLevel == (OccidentalEdu.Bachelor | OccidentalEdu.Some))
            {
                eduAdditive = 0.04;
            }
            if (educationLevel == (OccidentalEdu.HighSchool | OccidentalEdu.Grad))
            {
                eduAdditive = 0.02;
            }

            var probChildless = Math.Round(AmericanEquations.FemaleYob2ProbChildless.SolveForY(dob.Value.Year), 2);

            probChildless += eduAdditive;

            return(probChildless);
        }
Esempio n. 3
0
        /// <summary>
        /// Difference of national avg to race average added to state average.
        /// </summary>
        /// <param name="state"></param>
        /// <param name="race"></param>
        /// <param name="edu"></param>
        /// <returns></returns>
        public static double SolvePercentGradByStateAndRace(string state, NorthAmericanRace?race,
                                                            OccidentalEdu edu = OccidentalEdu.HighSchool | OccidentalEdu.Grad)
        {
            AmericanRacePercents p;

            p = edu >= OccidentalEdu.Bachelor ? AmericanUniversity.NatlGradRate() : AmericanHighSchool.NatlGradRate();
            var stateAvg  = p.National;
            var natlAvg   = p.National;
            var stateData = UsStateData.GetStateData(state);

            if (stateData?.PercentOfGrads != null && stateData.PercentOfGrads.Count > 0)
            {
                var f = stateData.PercentOfGrads.FirstOrDefault(x => x.Item1 == edu);
                if (f != null)
                {
                    stateAvg = Math.Round(f.Item2, 1);
                }
            }

            var raceNatlAvg = new Dictionary <NorthAmericanRace, double>
            {
                { NorthAmericanRace.AmericanIndian, p.AmericanIndian - natlAvg },
                { NorthAmericanRace.Asian, p.Asian - natlAvg },
                { NorthAmericanRace.Hispanic, p.Hispanic - natlAvg },
                { NorthAmericanRace.Black, p.Black - natlAvg },
                { NorthAmericanRace.White, p.White - natlAvg },
                { NorthAmericanRace.Pacific, p.Pacific - natlAvg },
                { NorthAmericanRace.Mixed, p.Mixed - natlAvg }
            };

            if (race == null || !raceNatlAvg.ContainsKey(race.Value))
            {
                return(Math.Round(stateAvg, 1));
            }

            return(Math.Round(stateAvg + raceNatlAvg[race.Value], 1));
        }
Esempio n. 4
0
        /// <summary>
        /// Get an ordered list of employment for the last three years at random
        /// </summary>
        /// <param name="options"></param>
        /// <param name="personality"></param>
        /// <param name="eduLevel"></param>
        /// <param name="emplyRanges">
        /// Optional, allows calling assembly to set this directly, defaults to <see cref="GetEmploymentRanges"/>
        /// </param>
        /// <returns></returns>
        protected internal virtual List <ILaboris> GetRandomEmployment(AmericanDomusOpesOptions options, IPersonality personality = null,
                                                                       OccidentalEdu eduLevel = OccidentalEdu.None, List <Tuple <DateTime, DateTime?> > emplyRanges = null)
        {
            options = options ?? AmericanDomusOpesOptions.RandomOpesOptions();
            var empls = new HashSet <ILaboris>();

            emplyRanges = emplyRanges ?? GetEmploymentRanges(options, personality);

            //limit result to those which match the edu level
            Predicate <SocDetailedOccupation> filter = null;

            if (eduLevel < (OccidentalEdu.Bachelor | OccidentalEdu.Grad))
            {
                filter = s => !StandardOccupationalClassification.IsDegreeRequired(s);
            }

            var occ = StandardOccupationalClassification.RandomOccupation(filter);

            foreach (var range in emplyRanges)
            {
                var emply = new AmericanEmployment()
                {
                    Occupation = occ
                };
                var cloneOptions = options.GetClone();
                cloneOptions.Inception = range.Item1;
                cloneOptions.Terminus  = range.Item2;
                emply.RandomizeAllItems(options);
                empls.Add(emply);
            }

            var e = empls.ToList();

            e.Sort(Comparer);
            return(e);
        }
Esempio n. 5
0
        /// <summary>
        /// Helper method to assign the <see cref="EduLevel"/> and <see cref="EduFlag"/>
        /// by this instances current fields.
        /// </summary>
        protected internal void AssignEduFlagAndLevel()
        {
            //determine predicates
            var hasHs               = HighSchool?.Item1 != null;
            var isHsGrad            = HighSchool?.Item2 != null;
            var hasUndergradCollege = Universities.Any(x => x.School != null);
            var isCollegeGrad       = Universities.Any(x => x.Graduation != null);
            var isCollegePostgrad   = Universities.Count(x => x.Graduation != null) > 1;
            var isDocGrad           = false;

            //determine number of years in post-grad
            if (isCollegePostgrad)
            {
                var firstGradDate    = Universities.First(x => x.Graduation != null).Graduation.Value;
                var lastGradDate     = Universities.Last(x => x.Graduation != null).Graduation.Value;
                var numYearsPostGrad =
                    Math.Abs((firstGradDate - lastGradDate).TotalDays) / Constants.DBL_TROPICAL_YEAR;

                //consider doctorate as right-side second sigma of postgrad years
                isDocGrad = numYearsPostGrad >
                            AmericanUniversity.YearsInPostgradCollege.Mean +
                            AmericanUniversity.YearsInPostgradCollege.StdDev;
            }

            //assign flag and name based on the above
            if (new[] { hasHs, isHsGrad, hasUndergradCollege, isCollegeGrad }.All(x => x == false))
            {
                _eduLevel = "No Education";
                _eduFlag  = OccidentalEdu.None;
                return;
            }
            if (isCollegePostgrad)
            {
                _eduLevel = isDocGrad ? "Doctorate" : "Masters Grad";
                _eduFlag  = isDocGrad
                    ? OccidentalEdu.Doctorate | OccidentalEdu.Grad
                    : OccidentalEdu.Master | OccidentalEdu.Grad;
                return;
            }
            if (hasUndergradCollege && isCollegeGrad)
            {
                _eduLevel = "College Grad";
                _eduFlag  = OccidentalEdu.Bachelor | OccidentalEdu.Grad;
                return;
            }
            if (hasUndergradCollege)
            {
                _eduLevel = "Some College";
                _eduFlag  = OccidentalEdu.Bachelor | OccidentalEdu.Some;
                return;
            }
            if (hasHs && isHsGrad)
            {
                _eduLevel = "High School Grad";
                _eduFlag  = OccidentalEdu.HighSchool | OccidentalEdu.Grad;
            }
            else
            {
                _eduLevel = "Some High School";
                _eduFlag  = OccidentalEdu.HighSchool | OccidentalEdu.Some;
            }
        }
Esempio n. 6
0
 internal static string GetXmlEduName(OccidentalEdu edu)
 {
     var eduName = "High School";
     if ((short)edu < (short)(OccidentalEdu.HighSchool | OccidentalEdu.Some))
         eduName = "DropOut";
     if ((short)edu > (short)(OccidentalEdu.HighSchool | OccidentalEdu.Grad) &&
         (short)edu < (short)(OccidentalEdu.Assoc | OccidentalEdu.Grad))
         eduName = "Some College, No Degree";
     if ((short)edu >= (short)(OccidentalEdu.Assoc | OccidentalEdu.Grad) &&
         (short)edu < (short)(OccidentalEdu.Bachelor | OccidentalEdu.Grad))
         eduName = "Associate";
     if ((short)edu >= (short)(OccidentalEdu.Bachelor | OccidentalEdu.Grad) &&
         (short)edu < (short)(OccidentalEdu.Post | OccidentalEdu.Grad))
         eduName = "Bachelor";
     if ((short)edu >= (short)(OccidentalEdu.Post | OccidentalEdu.Grad))
         eduName = "PostGrad";
     return eduName;
 }
Esempio n. 7
0
        /// <summary>
        /// Gets the sum of the factors based on the criteria.
        /// </summary>
        /// <param name="tbl"></param>
        /// <param name="edu"></param>
        /// <param name="race"></param>
        /// <param name="region"></param>
        /// <param name="age"></param>
        /// <param name="gender"></param>
        /// <param name="maritialStatus"></param>
        /// <returns></returns>
        internal static double GetFactor(FactorTables tbl, OccidentalEdu edu, NorthAmericanRace race,
            AmericanRegion region, int age, Gender gender, MaritialStatus maritialStatus)
        {
            var xmlDoc = tbl == FactorTables.CreditCardDebt || tbl == FactorTables.HomeDebt ||
                         tbl == FactorTables.VehicleDebt
                ? TreeData.UsPersonalDebt
                : TreeData.UsPersonalWealth;
            var tblName = Enum.GetName(typeof(FactorTables), tbl);
            var eduName = GetXmlEduName(edu);
            var raceName = Enum.GetName(typeof(NorthAmericanRace), race);
            var regionName = Enum.GetName(typeof(AmericanRegion), region);
            var genderName = Enum.GetName(typeof(Gender), gender);

            var tblXPath = $"//table[@name='{tblName}']";

            var sum = 0.0D;
            var hash = new Dictionary<string, string>
            {
                {"Edu", eduName},
                {"Race", raceName},
                {"Region", regionName},
            };

            foreach (var factor in hash.Keys)
            {
                var xmlElem = xmlDoc.SelectSingleNode($"{tblXPath}/factor[@name='{factor}']/add[@name='{hash[factor]}']") as XmlElement;
                var factorVal = xmlElem?.Attributes["value"]?.Value;
                if (string.IsNullOrWhiteSpace(factorVal))
                    continue;
                double dblOut;
                if (double.TryParse(factorVal, out dblOut))
                    sum += dblOut;
            }

            var ageNode = maritialStatus == MaritialStatus.Remarried || maritialStatus == MaritialStatus.Remarried
                ? xmlDoc.SelectSingleNode($"{tblXPath}/factor[@name='Age']/factor[@name='Married']")
                : xmlDoc.SelectSingleNode($"{tblXPath}/factor[@name='Age']/factor[@name='{genderName}']");
            if (ageNode == null)
                return sum;
            foreach (var anode in ageNode.ChildNodes)
            {
                var ageElem = anode as XmlElement;
                if (ageElem == null)
                    continue;
                var minAge = ageElem.Attributes["min"]?.Value;
                var maxAge = ageElem.Attributes["max"]?.Value;
                if (string.IsNullOrWhiteSpace(minAge) || string.IsNullOrWhiteSpace(maxAge))
                    continue;
                int min, max;
                if (!int.TryParse(minAge, out min) || !int.TryParse(maxAge, out max))
                    continue;
                var isInRange = age >= min && age <= max;
                if (!isInRange || string.IsNullOrWhiteSpace(ageElem.Attributes["value"]?.Value))
                    continue;
                var factorVal = ageElem.Attributes["value"].Value;
                double dblOut;
                if (double.TryParse(factorVal, out dblOut))
                    sum += dblOut;
            }
            return sum;
        }
Esempio n. 8
0
        /// <summary>
        /// Gets the mean of the factors based on the criteria.
        /// </summary>
        /// <param name="tbl"></param>
        /// <param name="edu"></param>
        /// <param name="race"></param>
        /// <param name="region"></param>
        /// <param name="age"></param>
        /// <param name="gender"></param>
        /// <param name="maritalStatus"></param>
        /// <returns>
        /// A scalar factor above or below the national average(s) based on the given criteria
        /// </returns>
        /// <remarks>
        /// src https://www2.census.gov/programs-surveys/demo/tables/wealth/2013/wealth-asset-ownership/wealth-tables-2013.xlsx
        ///     https://www2.census.gov/programs-surveys/demo/tables/wealth/2011/wealth-asset-ownership/debt-tables-2011.xlsx
        /// </remarks>
        public static double GetFactor(AmericanFactorTables tbl, OccidentalEdu edu, NorthAmericanRace race,
                                       AmericanRegion region, int age, Gender gender, MaritalStatus maritalStatus)
        {
            DebtXml = DebtXml ?? XmlDocXrefIdentifier.GetEmbeddedXmlDoc(US_PERSONAL_DEBT,
                                                                        Assembly.GetExecutingAssembly());
            WealthXml = WealthXml ??
                        XmlDocXrefIdentifier.GetEmbeddedXmlDoc(US_PERSONAL_WEALTH, Assembly.GetExecutingAssembly());
            var xmlDoc = tbl == AmericanFactorTables.CreditCardDebt || tbl == AmericanFactorTables.HomeDebt ||
                         tbl == AmericanFactorTables.VehicleDebt
                ? DebtXml
                : WealthXml;
            var tblName    = Enum.GetName(typeof(AmericanFactorTables), tbl);
            var eduName    = GetXmlEduName(edu);
            var raceName   = Enum.GetName(typeof(NorthAmericanRace), race);
            var regionName = Enum.GetName(typeof(AmericanRegion), region);
            var genderName = Enum.GetName(typeof(Gender), gender);

            var tblXPath    = $"//table[@name='{tblName}']";
            var factorCount = 0D;
            var sum         = 0.0D;
            var hash        = new Dictionary <string, string>
            {
                { "Edu", eduName },
                { "Race", raceName },
                { "Region", regionName },
            };

            foreach (var factor in hash.Keys)
            {
                var xmlElem =
                    xmlDoc.SelectSingleNode($"{tblXPath}/factor[@name='{factor}']/add[@name='{hash[factor]}']") as
                    XmlElement;
                var factorVal = xmlElem?.Attributes["value"]?.Value;
                if (string.IsNullOrWhiteSpace(factorVal))
                {
                    continue;
                }
                if (double.TryParse(factorVal, out var dblOut))
                {
                    sum         += dblOut;
                    factorCount += 1;
                }
            }

            var ageNode = maritalStatus == MaritalStatus.Married || maritalStatus == MaritalStatus.Remarried
                ? xmlDoc.SelectSingleNode($"{tblXPath}/factor[@name='Age']/factor[@name='Married']")
                : xmlDoc.SelectSingleNode($"{tblXPath}/factor[@name='Age']/factor[@name='{genderName}']");

            factorCount = factorCount <= 0 ? 1 : factorCount;
            if (ageNode == null)
            {
                return(Math.Round(sum / factorCount, 5));
            }
            foreach (var anode in ageNode.ChildNodes)
            {
                var ageElem = anode as XmlElement;
                if (ageElem == null)
                {
                    continue;
                }
                var minAge = ageElem.Attributes["min"]?.Value;
                var maxAge = ageElem.Attributes["max"]?.Value;
                if (string.IsNullOrWhiteSpace(minAge) || string.IsNullOrWhiteSpace(maxAge))
                {
                    continue;
                }
                if (!int.TryParse(minAge, out var min) || !int.TryParse(maxAge, out var max))
                {
                    continue;
                }
                var isInRange = age >= min && age <= max;
                if (!isInRange || string.IsNullOrWhiteSpace(ageElem.Attributes["value"]?.Value))
                {
                    continue;
                }
                var factorVal = ageElem.Attributes["value"].Value;
                if (double.TryParse(factorVal, out var dblOut))
                {
                    sum         += dblOut;
                    factorCount += 1;
                }
            }
            return(Math.Round(sum / factorCount, 5));
        }
Esempio n. 9
0
        /// <summary>
        /// Difference of national avg to race average added to state average.
        /// </summary>
        /// <param name="state"></param>
        /// <param name="race"></param>
        /// <param name="edu"></param>
        /// <returns></returns>
        public static double SolvePercentGradByStateAndRace(UsState state, NorthAmericanRace? race,
            OccidentalEdu edu = OccidentalEdu.HighSchool | OccidentalEdu.Grad)
        {
            AmericanRacePercents p;
            p = edu >= OccidentalEdu.Bachelor ? AmericanUniversity.NatlGradRate() : AmericanHighSchool.NatlGradRate();
            var stateAvg = p.National;
            var natlAvg = p.National;
            if (state?.GetStateData() != null)
            {
                var stateData = state.GetStateData();
                if (stateData.PercentOfGrads != null && stateData.PercentOfGrads.Count > 0)
                {
                    var f = stateData.PercentOfGrads.FirstOrDefault(x => x.Item1 == edu);
                    if (f != null)
                    {
                        stateAvg = Math.Round(f.Item2, 1);
                    }
                }
            }

            var raceNatlAvg = new Dictionary<NorthAmericanRace, double>
            {
                {NorthAmericanRace.AmericanIndian, p.AmericanIndian - natlAvg},
                {NorthAmericanRace.Asian, p.Asian - natlAvg},
                {NorthAmericanRace.Hispanic, p.Hispanic - natlAvg},
                {NorthAmericanRace.Black, p.Black - natlAvg},
                {NorthAmericanRace.White, p.White - natlAvg},
                {NorthAmericanRace.Pacific, p.Pacific - natlAvg},
                {NorthAmericanRace.Mixed, p.Mixed - natlAvg}
            };
            if (race == null || !raceNatlAvg.ContainsKey(race.Value))
                return Math.Round(stateAvg, 1);

            return Math.Round(stateAvg + raceNatlAvg[race.Value], 1);
        }
Esempio n. 10
0
        /// <summary>
        /// Produces the probability of childlessness
        /// </summary>
        /// <param name="dob"></param>
        /// <param name="educationLevel">
        /// https://en.wikipedia.org/wiki/Childfree#Education
        /// </param>
        /// <returns></returns>
        /// <remarks>
        /// Data regarded women-only and did not incorporate <see cref="NorthAmericanRace"/>
        /// </remarks>
        public static double SolveForProbabilityChildless(DateTime dob, OccidentalEdu educationLevel)
        {
            var eduAdditive = 0.0;
            if (educationLevel == (OccidentalEdu.Bachelor | OccidentalEdu.Grad))
                eduAdditive = 0.09;
            if (educationLevel == (OccidentalEdu.Bachelor | OccidentalEdu.Some))
                eduAdditive = 0.04;
            if (educationLevel == (OccidentalEdu.HighSchool | OccidentalEdu.Grad))
                eduAdditive = 0.02;

            var probChildless = Math.Round(Equations.FemaleYob2ProbChildless.SolveForY(dob.Year), 2);

            probChildless += eduAdditive;

            return probChildless;
        }