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