diff --git a/src/main/java/simpaths/data/startingpop/DataParser.java b/src/main/java/simpaths/data/startingpop/DataParser.java index af0a16ba6..eeb3b306c 100644 --- a/src/main/java/simpaths/data/startingpop/DataParser.java +++ b/src/main/java/simpaths/data/startingpop/DataParser.java @@ -224,11 +224,6 @@ private static void parse(String inputFileLocation, String inputFileName, Connec + "ALTER TABLE " + personTable + " DROP COLUMN yFinDstrssFlag;" + "ALTER TABLE " + personTable + " ALTER COLUMN financial_distress_add RENAME TO yFinDstrssFlag;" - //Social care - + "ALTER TABLE " + personTable + " ADD careProvidedFlag VARCHAR_IGNORECASE;" - + "UPDATE " + personTable + " SET careProvidedFlag = 'None' WHERE careHrsProvidedWeek <= 0 OR careHrsProvidedWeek IS NULL;" - + "UPDATE " + personTable + " SET careProvidedFlag = 'OnlyOther' WHERE careHrsProvidedWeek > 0;" - //SYSTEM : Year + "ALTER TABLE " + personTable + " ALTER COLUMN statInterviewYear RENAME TO system_year;" diff --git a/src/main/java/simpaths/model/BenefitUnit.java b/src/main/java/simpaths/model/BenefitUnit.java index daaa5e612..057e82ec5 100644 --- a/src/main/java/simpaths/model/BenefitUnit.java +++ b/src/main/java/simpaths/model/BenefitUnit.java @@ -4684,7 +4684,7 @@ private void updateSocialCareProvision() { careProvidedFlag = 0; for (Person person : getMembers()) { - if (!SocialCareProvision.None.equals(person.getSocialCareProvision())) + if (!Indicator.False.equals(person.getSocialCareProvision())) careProvidedFlag = 1; } } diff --git a/src/main/java/simpaths/model/Person.java b/src/main/java/simpaths/model/Person.java index 0c6f07429..c839a951f 100644 --- a/src/main/java/simpaths/model/Person.java +++ b/src/main/java/simpaths/model/Person.java @@ -98,8 +98,8 @@ public class Person implements EventListener, IDoubleSource, IIntSource, Weight, @NullInitialised @Transient private Boolean careFormalFlag; @NullInitialised @Transient private Boolean careFromInformalFlag; @Column(name="careHrsProvidedWeek") private Double careHrsProvidedWeek; - @Enumerated(EnumType.STRING) @Column(name="careProvidedFlag") private SocialCareProvision careProvidedFlag; - @Lag(field="careProvidedFlag") @Transient private SocialCareProvision careProvidedFlagL1; + @Transient private Indicator careProvidedFlag; + @Lag(field="careProvidedFlag") @Transient private Indicator careProvidedFlagL1; @Lag(field="careNeedFlag") @Transient private Indicator careNeedFlagL1; @Lag(field="careHrsFormalWeek") @Transient private Double careHrsFormalWeekL1; @Lag(field="careHrsProvidedWeek") @Transient private Double careHrsProvidedWeekL1; @@ -446,7 +446,7 @@ else if (demAge > Parameters.MAX_AGE_TO_STAY_IN_CONTINUOUS_EDUCATION) careHrsProvidedWeek = Objects.requireNonNullElse(originalPerson.careHrsProvidedWeek, 0.0); careProvidedFlag = Objects.requireNonNullElseGet(originalPerson.careProvidedFlag, () -> - (careHrsProvidedWeek > 0.01) ? SocialCareProvision.OnlyOther : SocialCareProvision.None); + (careHrsProvidedWeek > 0.01) ? Indicator.True : Indicator.False); careNeedFlagL1 = Objects.requireNonNullElse(originalPerson.careNeedFlagL1, careNeedFlag); careHrsFormalWeekL1 = Objects.requireNonNullElse(originalPerson.careHrsFormalWeekL1, careHrsFormalWeek); @@ -559,7 +559,7 @@ public Person(Long id, long statSeed) { // initialise random draws this.statSeed = statSeed; - statInnovations = new Innovations(37, 1, 1, statSeed); + statInnovations = new Innovations(38, 1, 1, statSeed); //Draw desired age and wage differential for parametric partnership formation for people above age to get married: double[] sampleDifferentials = setMarriageTargets(); @@ -601,12 +601,12 @@ private void setAllSocialCareVariablesToFalse() { careReceivedFlag = SocialCareReceipt.None; careFormalFlag = false; careFromInformalFlag = false; - careProvidedFlag = SocialCareProvision.None; + careProvidedFlag = Indicator.False; careNeedFlagL1 = Indicator.False; careHrsFormalWeekL1 = -9.0; careHrsInformalWeekL1 = -9.0; careHrsProvidedWeekL1 = -9.0; - careProvidedFlagL1 = SocialCareProvision.None; + careProvidedFlagL1 = Indicator.False; } public void setAdditionalFieldsInInitialPopulation() { @@ -639,6 +639,11 @@ public void setAdditionalFieldsInInitialPopulation() { if (!Parameters.checkFinite(careHrsInformalWeek)) careHrsInformalWeek = 0.0; + if (careHrsProvidedWeek < 0.01) { + careProvidedFlag = Indicator.False; + } else { + careProvidedFlag = Indicator.True; + } if (demAge = Parameters.MIN_AGE_TO_PROVIDE_CARE) { @@ -1606,7 +1611,7 @@ public void evaluateSocialCareProvision(double probitAdjustment) { double score = Parameters.getRegNoCarePartnerProvCareToOtherS3b().getScore(this, Person.DoublesVariables.class); probProvideAny = Parameters.getRegNoCarePartnerProvCareToOtherS3b().getProbability(score + probitAdjustment); } - boolean provideCare = (statInnovations.getDoubleDraw(13) < probProvideAny); + boolean provideCare = (statInnovations.getDoubleDraw(37) < probProvideAny); if (!Parameters.flagSuppressSocialCareCosts && provideCare) { double score; @@ -1623,20 +1628,8 @@ public void evaluateSocialCareProvision(double probitAdjustment) { rmse = Parameters.getRMSEForRegression("S3d"); } double gauss = Parameters.getStandardNormalDistribution().inverseCumulativeProbability(statInnovations.getDoubleDraw(14)); - careHrsProvidedWeek = Math.min(Parameters.MAX_HOURS_WEEKLY_INFORMAL_CARE, Math.exp(score + rmse * gauss)); - if (careToPartner) { - - if (careHrsProvidedWeek > careHoursToPartner) { - - careProvidedFlag = SocialCareProvision.PartnerAndOther; - } else { - - careProvidedFlag = SocialCareProvision.OnlyPartner; - } - } else { - - careProvidedFlag = SocialCareProvision.OnlyOther; - } + careHrsProvidedWeek = Math.min(Parameters.MAX_HOURS_WEEKLY_INFORMAL_CARE, Math.sinh(score + rmse * gauss)); + careProvidedFlag = Indicator.True; } } } @@ -3250,25 +3243,7 @@ public double getDoubleValue(Enum variableID) { return (partner != null && Indicator.True.equals(partner.getNeedSocialCare())) ? 1. : 0.; } case ProvideCare_L1 -> { - return (careProvidedFlagL1 != null && !SocialCareProvision.None.equals(careProvidedFlagL1)) ? 1. : 0.; - } - case CareToPartnerOnly -> { - return (SocialCareProvision.OnlyPartner.equals(careProvidedFlag)) ? 1. : 0.; - } - case CareToPartnerAndOther -> { - return (SocialCareProvision.PartnerAndOther.equals(careProvidedFlag)) ? 1. : 0.; - } - case CareToOtherOnly -> { - return (SocialCareProvision.OnlyOther.equals(careProvidedFlag)) ? 1. : 0.; - } - case CareToPartnerOnly_L1 -> { - return (SocialCareProvision.OnlyPartner.equals(careProvidedFlagL1)) ? 1. : 0.; - } - case CareToPartnerAndOther_L1 -> { - return (SocialCareProvision.PartnerAndOther.equals(careProvidedFlagL1)) ? 1. : 0.; - } - case CareToOtherOnly_L1 -> { - return (SocialCareProvision.OnlyOther.equals(careProvidedFlagL1)) ? 1. : 0.; + return (Indicator.True.equals(careProvidedFlagL1)) ? 1. : 0.; } case ReceiveCare_L1 -> { return (getTotalHoursSocialCare_L1() > 0.01) ? 1. : 0.; @@ -5146,15 +5121,6 @@ public Long getPartnerID() { } else return null; } - private void nullPartnerVariables() { - - demPartnerNYear = 0; - if (SocialCareProvision.OnlyPartner.equals(careProvidedFlag)) - careProvidedFlag = SocialCareProvision.None; - else if (SocialCareProvision.PartnerAndOther.equals(careProvidedFlag)) - careProvidedFlag = SocialCareProvision.OnlyOther; - } - public Labour getLabourSupplyWeekly() { if (labHrsWorkEnumWeek ==null) throw new RuntimeException("request for labourSupplyWeekly before it has been initialised"); @@ -5324,7 +5290,7 @@ public void setCareHoursFromOtherWeekly_lag1(double val) { public void setCareHoursFromFormalWeekly_lag1(double val) { careHrsFormalWeekL1 = val; } - public void setSocialCareProvision_lag1(SocialCareProvision careProvision) { + public void setSocialCareProvision_lag1(Indicator careProvision) { careProvidedFlagL1 = careProvision; } @@ -5426,8 +5392,8 @@ public void setSocialCareReceipt(SocialCareReceipt who) { careReceivedFlag = who; } - public void setSocialCareProvision(SocialCareProvision who) { - careProvidedFlag = who; + public void setSocialCareProvision(Indicator provide) { + careProvidedFlag = provide; } public Indicator getDlltsd_lag1() { @@ -5803,11 +5769,8 @@ public double getSocialCareProvisionState() { return (double)getSocialCareProvision().getValue(); } - public SocialCareProvision getSocialCareProvision() { - if (careProvidedFlag ==null) - return SocialCareProvision.None; - else - return careProvidedFlag; + public Indicator getSocialCareProvision() { + return Objects.requireNonNullElse(careProvidedFlag, Indicator.False); } public double getRetired() { diff --git a/src/main/java/simpaths/model/SimPathsModel.java b/src/main/java/simpaths/model/SimPathsModel.java index 5554683b0..30faf4924 100644 --- a/src/main/java/simpaths/model/SimPathsModel.java +++ b/src/main/java/simpaths/model/SimPathsModel.java @@ -802,7 +802,6 @@ public enum Processes { EndYear, UnionMatching, LabourMarketAndIncomeUpdate, - SocialCareMarketClearing, //Alignment Processes FertilityAlignment, @@ -882,9 +881,6 @@ public void onEvent(Enum type) { } if (commentsOn) log.info("Union matching complete."); } - case SocialCareMarketClearing -> { - socialCareMarketClearing(); - } case FertilityAlignment -> { if (alignFertility) { @@ -1911,21 +1907,6 @@ private void evalMatches(Pair, Set> unmatched, boolean align } } - private void socialCareMarketClearing() { - - // adjust provision so that aggregate provision broadly matches aggregate receipt - double careProvisionAdjustment = Parameters.getTimeSeriesValue(getYear(),TimeSeriesVariable.CareProvisionAdjustment); - SocialCareAlignment socialCareAlignment = new SocialCareAlignment(persons, careProvisionAdjustment); - double[] startVal = new double[] {careProvisionAdjustment}; - double[] lowerBound = new double[] {careProvisionAdjustment - 1.5}; - double[] upperBound = new double[] {careProvisionAdjustment + 1.5}; - RootSearch search = new RootSearch(lowerBound, upperBound, startVal, socialCareAlignment, 1.0E-2, 0.001); - search.evaluate(); - if (search.isTargetAltered()) { - Parameters.putTimeSeriesValue(getYear(), search.getTarget()[0], TimeSeriesVariable.CareProvisionAdjustment); - } - } - /* Private helper method used to set up alignment for different occupancy types diff --git a/src/main/java/simpaths/model/decisions/Expectations.java b/src/main/java/simpaths/model/decisions/Expectations.java index e0c3429ec..40c342ff3 100644 --- a/src/main/java/simpaths/model/decisions/Expectations.java +++ b/src/main/java/simpaths/model/decisions/Expectations.java @@ -175,7 +175,7 @@ public Expectations(Expectations invariantExpectations) { personProxyThisPeriod.setDhe(currentStates.getHealthCode()); personProxyThisPeriod.setDeh_c4(currentStates.getEducationCode()); personProxyThisPeriod.setDcpstLocal(currentStates.getDcpst()); - personProxyThisPeriod.setSocialCareProvision(currentStates.getSocialCareProvisionCode()); + personProxyThisPeriod.setSocialCareProvision(currentStates.getSocialCareProvisionState()); personProxyThisPeriod.populateSocialCareReceipt(currentStates.getSocialCareReceiptStateCode()); // add person proxy for next period expectations @@ -194,7 +194,7 @@ public Expectations(Expectations invariantExpectations) { personProxyNextPeriod.setDhe(currentStates.getHealthCode()); personProxyNextPeriod.setDhe_lag1(currentStates.getHealthCode()); personProxyNextPeriod.populateSocialCareReceipt_lag1(currentStates.getSocialCareReceiptStateCode()); - personProxyNextPeriod.setSocialCareProvision_lag1(currentStates.getSocialCareProvisionCode()); + personProxyNextPeriod.setSocialCareProvision_lag1(currentStates.getSocialCareProvisionState()); personProxyNextPeriod.setDed(currentStates.getStudentIndicator()); personProxyNextPeriod.setDeh_c4(currentStates.getEducationCode()); personProxyNextPeriod.setDeh_c4_lag1(currentStates.getEducationCode()); @@ -499,15 +499,18 @@ private double evalSocialCareHoursProvidedWeekly() { double socialCareHoursProvidedWeekly = 0.0; if (Parameters.flagSocialCare && !Parameters.flagSuppressSocialCareCosts) { - SocialCareProvision status = currentStates.getSocialCareProvisionCode(); - if (!SocialCareProvision.None.equals(status)) { - // With S3e retired, no separate regression is used for hours provided in expectations. - socialCareHoursProvidedWeekly = 0.0; - - // Retired process (kept for future reuse): S3e provided care hours. - // double score = Parameters.getRegCareHoursProvS3e().getScore(personProxyThisPeriod,Person.DoublesVariables.class); - // double rmse = Parameters.getRMSEForRegression("S3e"); - // socialCareHoursProvidedWeekly = Math.min(80.0, Math.exp(score + rmse*rmse/2.0)); + Indicator status = currentStates.getSocialCareProvisionState(); + if (!Indicator.False.equals(status)) { + + double score, rmse; + if (cohabitation) { + score = Parameters.getRegCareHoursProvS3d().getScore(personProxyThisPeriod,Person.DoublesVariables.class); + rmse = Parameters.getRMSEForRegression("S3d"); + } else { + score = Parameters.getRegCareHoursProvS3c().getScore(personProxyThisPeriod,Person.DoublesVariables.class); + rmse = Parameters.getRMSEForRegression("S3c"); + } + socialCareHoursProvidedWeekly = Math.min(80.0, Math.exp(score + rmse*rmse/2.0)); } } return socialCareHoursProvidedWeekly; diff --git a/src/main/java/simpaths/model/decisions/ExpectationsFactory.java b/src/main/java/simpaths/model/decisions/ExpectationsFactory.java index 8601348b7..18811a9a5 100644 --- a/src/main/java/simpaths/model/decisions/ExpectationsFactory.java +++ b/src/main/java/simpaths/model/decisions/ExpectationsFactory.java @@ -311,7 +311,7 @@ private LocalExpectations lexpectEval(Axis axis) { if (Dcpst.Partnered.equals(personProxyNextPeriod.getDcpst())) lexpectations.evaluateDiscrete(personProxyNextPeriod, personProxyNextPeriod.getRegressionName(axis)); else - lexpectations.evaluateLabelledIndicator(personProxyNextPeriod, personProxyNextPeriod.getRegressionName(axis), 3.0); + lexpectations.evaluateDiscrete(personProxyNextPeriod, personProxyNextPeriod.getRegressionName(axis)); } else if (Axis.WagePotential.equals(axis)) { lexpectations.evaluateGaussian(personProxyNextPeriod, personProxyNextPeriod.getRegressionName(axis), @@ -445,7 +445,7 @@ private boolean updatePersonNextPeriod(States states, Axis axis) { val1 = states.getSocialCareReceiptCode(); } else if (Axis.SocialCareProvision.equals(axis)) { val0 = personProxyNextPeriod.getSocialCareProvision(); - val1 = states.getSocialCareProvisionCode(); + val1 = states.getSocialCareProvisionState(); } else if (Axis.Cohabitation.equals(axis)) { val0 = personProxyNextPeriod.getDcpst(); val1 = states.getDcpst(); @@ -478,7 +478,7 @@ private boolean updatePersonNextPeriod(States states, Axis axis) { } else if (Axis.SocialCareReceipt.equals(axis)) { personProxyNextPeriod.setSocialCareReceipt(states.getSocialCareReceiptCode()); } else if (Axis.SocialCareProvision.equals(axis)) { - personProxyNextPeriod.setSocialCareProvision(states.getSocialCareProvisionCode()); + personProxyNextPeriod.setSocialCareProvision(states.getSocialCareProvisionState()); } else if (Axis.Cohabitation.equals(axis)) { personProxyNextPeriod.setDcpstLocal(states.getDcpst()); } else if (Axis.Child.equals(axis)) { diff --git a/src/main/java/simpaths/model/decisions/GridScale.java b/src/main/java/simpaths/model/decisions/GridScale.java index 69a18fd41..7e7de5389 100644 --- a/src/main/java/simpaths/model/decisions/GridScale.java +++ b/src/main/java/simpaths/model/decisions/GridScale.java @@ -214,11 +214,11 @@ public GridScale() { dimIndex++; } - // social care provision + // social care provision (indicator variable) if (Parameters.flagSocialCare) { - axes[aa][dimIndex][0] = 4; // none, partner only, partner and non-partner, non-partner only (see Enum SocialCareProvision) + axes[aa][dimIndex][0] = 2; axes[aa][dimIndex][1] = 0; - axes[aa][dimIndex][2] = 3; + axes[aa][dimIndex][2] = 1; axes[aa][dimIndex][3] = 0; axes[aa][dimIndex][4] = 0; dimIndex++; diff --git a/src/main/java/simpaths/model/decisions/States.java b/src/main/java/simpaths/model/decisions/States.java index f41050236..c29360a2a 100644 --- a/src/main/java/simpaths/model/decisions/States.java +++ b/src/main/java/simpaths/model/decisions/States.java @@ -332,12 +332,6 @@ boolean checkOuterStateCombination() { loopConsider = false; } - // check care provision - if (!getCohabitation() && - ( SocialCareProvision.OnlyPartner.equals(getSocialCareProvisionCode()) || - SocialCareProvision.PartnerAndOther.equals(getSocialCareProvisionCode()) )) - loopConsider = false; - // return result return loopConsider; } @@ -651,7 +645,7 @@ public boolean getPrincipalEligibleForWork() { /** * METHOD TO RETURN SOCIAL CARE PROVISION - * @return integer (0 no care, 1 only to partner, 2 to partner and other, 3 only to other + * @return integer (0 no care, 1 care) */ int getSocialCareProvision() { if (Parameters.flagSocialCare) { @@ -914,12 +908,16 @@ SocialCareReceipt getSocialCareReceiptCode() { /** * METHOD TO IDENTIFY SOCIAL CARE PROVISION CODE IMPLIED BY STATE COMBINATION */ - SocialCareProvision getSocialCareProvisionCode() { - SocialCareProvision code; + Indicator getSocialCareProvisionState() { + Indicator code; if (Parameters.flagSocialCare) - code = SocialCareProvision.getCode(getVal(Axis.SocialCareProvision)); + if (getSocialCareProvision()==0) { + code = Indicator.False; + } else { + code = Indicator.True; + } else - code = SocialCareProvision.None; + code = Indicator.False; return code; } diff --git a/src/main/java/simpaths/model/enums/SocialCareProvision.java b/src/main/java/simpaths/model/enums/SocialCareProvision.java deleted file mode 100644 index 7e66e07f4..000000000 --- a/src/main/java/simpaths/model/enums/SocialCareProvision.java +++ /dev/null @@ -1,26 +0,0 @@ -package simpaths.model.enums; - -import microsim.statistics.regression.IntegerValuedEnum; - -public enum SocialCareProvision implements IntegerValuedEnum { - - None(0), - OnlyPartner(1), - PartnerAndOther(2), - OnlyOther(3); - - private final int value; - SocialCareProvision(int val) {value = val;} - - @Override - public int getValue() {return value;} - public static SocialCareProvision getCode(double val) { - if (val<0.5) - return SocialCareProvision.None; - if (val<1.5) - return SocialCareProvision.OnlyPartner; - else if (val<2.5) - return SocialCareProvision.PartnerAndOther; - else return SocialCareProvision.OnlyOther; - } -}