*! 1.0.0 Ariel Linden 15Jun2024 

/* 	

Computes AHA 10-year risk for CVD, ASCVD, and HF, from:

Khan SS, Matsushita K, Sang Y, et al. Development and Validation of the American Heart Association 
Predicting Risk of Cardiovascular Disease EVENTs (PREVENT^TM) Equations. Circulation 2024;149:30–449.
	
*/

program prevent10, rclass
	version 13.0
	syntax [if] [in] ,  			///
		FEMale(varname numeric) 	/// integer 0 or 1
		AGE(varname numeric)    	/// 
		CHOL(varname numeric)   	///		
		HDL(varname numeric) 		///
		SBP(varname numeric)  		///
		BMI(varname numeric)  		///
		GFR(varname numeric)  		///
		ANTIhtn(varname numeric) 	/// integer 0 or 1
		STATin(varname numeric) 	/// integer 0 or 1
		SMoker(varname numeric) 	/// integer 0 or 1
		DIABetes(varname numeric) 	/// integer 0 or 1
		[INClude]
		
		
		marksample touse 
		markout `touse' `v' `female' `age' `chol' `hdl' `sbp' `bmi' `gfr' `antihtn' `statin' `smoker' `diabetes' 

		qui count if `touse' 
		if r(N) == 0 error 2000 

		/* check to ensure binary variables contain 0 or 1 */
		foreach v in `female' `antihtn' `statin' `smoker' `diabetes' {
			capture assert inlist(`v', 0, 1) if `touse' 
			if _rc { 
				di as err "`v' contains values other than 0 or 1" 
				exit 498 
			} 
		}
		
		/* drop variables that were generated in last run */
		local prevent10vars : char _dta[prevent10vars] 
		if "`prevent10vars'" != "" {
			foreach f of local prevent10vars { 
			capture drop `f' 
			}
		}

		quietly {
	
		
			********************
			* CVD - Female
			********************
			gen cvd10 = .															
			replace cvd10 = 														///
			(0.7939329 * (`age'- 55)/10)											/// centered age (Age-55)/10
			+ (0.0305239 * ((`chol' - `hdl') * 0.02586 - 3.5))						/// (TC – HDL-C) × 0.02586 (to convert to mmol/L) – 3.5			
			+ (-0.1606857 * ((`hdl' * 0.02586 - 1.3) / 0.3))						/// (HDL-C × 0.02586 (to convert to mmol/L)  – 1.3) /0.3 
			+ (-0.2394003 * (min(`sbp', 110) - 110)/20)								/// (min(SBP, 110) – 110) /20
			+ (0.3600781 * (max(`sbp', 110) - 130)/20)								/// (max(SBP, 110) – 130) /20
			+ (0.8667604 * `diabetes')												/// Diabetes (1=Yes, 0=No)
			+ (0.5360739 * `smoker')												/// Current Smoker (1=Yes, 0=No)
			+ (0.6045917 * (min(`gfr', 60) - 60) / - 15)							/// (min(eGFR, 60) – 60) / -15
			+ (0.0433769 * (max(`gfr', 60) - 90) / - 15)							/// (max(eGFR, 60)  – 90) / -15
			+ (0.3151672 * `antihtn')												/// Anti-hypertensive use
			+ (-0.1477655 * `statin')												/// statin use			
			+ (-0.0663612 * (max(`sbp', 110) - 130)/20) * `antihtn'					/// (max(SBP, 110) – 130) /20 × Antihtn
			+ (0.1197879 * ((`chol' - `hdl') * 0.02586 - 3.5)) * `statin'			/// ((TC – HDL-C) × 0.02586 – 3.5) × Statin
			+ (-0.0819715 * (`age'- 55)/10 * ((`chol' - `hdl') * 0.02586 - 3.5))	/// (age-55)/10 × ((TC – HDL-C) × 0.02586 – 3.5) 
			+ (0.0306769 * (`age'- 55)/10 * (`hdl' * 0.02586 - 1.3) / 0.3)			/// (age-55)/10 × (HDL-C × 0.02586 – 1.3) /0.3 			
			+ (-0.0946348 * (`age'- 55)/10 * (max(`sbp', 110) - 130)/20)			/// (age-55)/10 × (max(SBP, 110) – 130) /20			
			+ (-0.27057 * (`age'- 55)/10 * `diabetes')								/// (Age-55)/10 × Diabetes
			+ (-0.078715 * (`age'- 55)/10 * `smoker')								/// (Age-55)/10 × Cursmk
			+ (-0.1637806 * (`age'- 55)/10 * (min(`gfr', 60) - 60) / - 15)			/// (Age-55)/10 × (min(eGFR, 60) – 60) / -15
			+ (-3.307728 * 1)														/// constant
			if `female' == 1 & `touse'

			replace cvd10 = exp(cvd10) / (1 + exp(cvd10)) if `female' == 1 & `touse'
			replace cvd10 = round(cvd10 * 100, 0.01) if `female' == 1 & `touse'
			
			********************
			* CVD - Male
			********************	
			replace cvd10 = 														///
			(0.7688528 * (`age'- 55)/10)											/// centered age (Age-55)/10
			+ (0.0736174 * ((`chol' - `hdl') * 0.02586 - 3.5))						/// (TC – HDL-C) × 0.02586 (to convert to mmol/L) – 3.5			
			+ (-0.0954431 * ((`hdl' * 0.02586 - 1.3) / 0.3))						/// (HDL-C × 0.02586 (to convert to mmol/L)  – 1.3) /0.3 
			+ (-0.4347345 * (min(`sbp', 110) - 110)/20)								/// (min(SBP, 110) – 110) /20
			+ (0.3362658 * (max(`sbp', 110) - 130)/20)								/// (max(SBP, 110) – 130) /20
			+ (0.7692857 * `diabetes')												/// Diabetes (1=Yes, 0=No)
			+ (0.4386871 * `smoker')												/// Current Smoker (1=Yes, 0=No)
			+ (0.5378979 * (min(`gfr', 60) - 60) / - 15)							/// (min(eGFR, 60) – 60) / -15
			+ (0.0164827 * (max(`gfr', 60) - 90) / - 15)							/// (max(eGFR, 60)  – 90) / -15
			+ (0.288879 * `antihtn')												/// Anti-hypertensive use
			+ (-0.1337349 * `statin')												/// statin use	
			+ (-0.0475924 * (max(`sbp', 110) - 130)/20) * `antihtn'					/// (max(SBP, 110) – 130) /20 × Antihtn
			+ (0.150273 * ((`chol' - `hdl') * 0.02586 - 3.5)) * `statin'			/// ((TC – HDL-C) × 0.02586 – 3.5) × Statin
			+ (-0.0517874 * (`age'- 55)/10 * ((`chol' - `hdl') * 0.02586 - 3.5))	/// (age-55)/10 × ((TC – HDL-C) × 0.02586 – 3.5) 
			+ (0.0191169 * (`age'- 55)/10 * (`hdl' * 0.02586 - 1.3) / 0.3)			/// (age-55)/10 × (HDL-C × 0.02586 – 1.3) /0.3 			
			+ (-0.1049477 * (`age'- 55)/10 * (max(`sbp', 110) - 130)/20)			/// (age-55)/10 × (max(SBP, 110) – 130) /20			
			+ (-0.2251948 * (`age'- 55)/10 * `diabetes')							/// (Age-55)/10 × Diabetes
			+ (-0.0895067 * (`age'- 55)/10 * `smoker')								/// (Age-55)/10 × Cursmk
			+ (-0.1543702 * (`age'- 55)/10 * (min(`gfr', 60) - 60) / - 15)			/// (Age-55)/10 × (min(eGFR, 60) – 60) / -15
			+ (-3.031168 * 1)														/// constant
			if `female' == 0 & `touse'

			replace cvd10 = exp(cvd10) / (1 + exp(cvd10)) if `female' == 0 & `touse'
			replace cvd10 = round(cvd10 * 100, 0.01) if `female' == 0 & `touse'			
			
			
			********************
			* ASCVD - Female
			********************
			gen ascvd10 = .															
			replace ascvd10 = 														///
			(0.719883 * (`age'- 55)/10)												/// centered age (Age-55)/10
			+ (0.1176967 * ((`chol' - `hdl') * 0.02586 - 3.5))						/// (TC – HDL-C) × 0.02586 (to convert to mmol/L) – 3.5			
			+ (-0.151185 * ((`hdl' * 0.02586 - 1.3) / 0.3))							/// (HDL-C × 0.02586 (to convert to mmol/L)  – 1.3) /0.3 
			+ (-0.0835358 * (min(`sbp', 110) - 110)/20)								/// (min(SBP, 110) – 110) /20
			+ (0.3592852 * (max(`sbp', 110) - 130)/20)								/// (max(SBP, 110) – 130) /20
			+ (0.8348585 * `diabetes')												/// Diabetes (1=Yes, 0=No)
			+ (0.4831078 * `smoker')												/// Current Smoker (1=Yes, 0=No)
			+ (0.4864619 * (min(`gfr', 60) - 60) / - 15)							/// (min(eGFR, 60) – 60) / -15
			+ (0.0397779 * (max(`gfr', 60) - 90) / - 15)							/// (max(eGFR, 60)  – 90) / -15
			+ (0.2265309 * `antihtn')												/// Anti-hypertensive use
			+ (-0.0592374 * `statin')												/// statin use			
			+ (-0.0395762 * (max(`sbp', 110) - 130)/20) * `antihtn'					/// (max(SBP, 110) – 130) /20 × Antihtn
			+ (0.0844423 * ((`chol' - `hdl') * 0.02586 - 3.5)) * `statin'			/// ((TC – HDL-C) × 0.02586 – 3.5) × Statin
			+ (-0.0567839 * (`age'- 55)/10 * ((`chol' - `hdl') * 0.02586 - 3.5))	/// (age-55)/10 × ((TC – HDL-C) × 0.02586 – 3.5) 
			+ (0.0325692 * (`age'- 55)/10 * (`hdl' * 0.02586 - 1.3) / 0.3)			/// (age-55)/10 × (HDL-C × 0.02586 – 1.3) /0.3 	
			+ (-0.1035985 * (`age'- 55)/10 * (max(`sbp', 110) - 130)/20)			/// (age-55)/10 × (max(SBP, 110) – 130) /20			
			+ (-0.2417542 * (`age'- 55)/10 * `diabetes')								/// (Age-55)/10 × Diabetes
			+ (-0.0791142 * (`age'- 55)/10 * `smoker')								/// (Age-55)/10 × Cursmk
			+ (-0.1671492 * (`age'- 55)/10 * (min(`gfr', 60) - 60) / - 15)			/// (Age-55)/10 × (min(eGFR, 60) – 60) / -15
			+ (-3.819975 * 1)														/// constant
			if `female' == 1 & `touse'

			replace ascvd10 = exp(ascvd10) / (1 + exp(ascvd10)) if `female' == 1 & `touse'
			replace ascvd10 = round(ascvd10 * 100, 0.01) if `female' == 1 & `touse'		

			********************
			* ASCVD - Male
			********************
			replace ascvd10 = 														///
			(0.7099847 * (`age'- 55)/10)												/// centered age (Age-55)/10
			+ (0.1658663 * ((`chol' - `hdl') * 0.02586 - 3.5))						/// (TC – HDL-C) × 0.02586 (to convert to mmol/L) – 3.5			
			+ (-0.1144285 * ((`hdl' * 0.02586 - 1.3) / 0.3))							/// (HDL-C × 0.02586 (to convert to mmol/L)  – 1.3) /0.3 
			+ (-0.2837212 * (min(`sbp', 110) - 110)/20)								/// (min(SBP, 110) – 110) /20
			+ (0.3239977 * (max(`sbp', 110) - 130)/20)								/// (max(SBP, 110) – 130) /20
			+ (0.7189597 * `diabetes')												/// Diabetes (1=Yes, 0=No)
			+ (0.3956973 * `smoker')												/// Current Smoker (1=Yes, 0=No)
			+ (0.3690075 * (min(`gfr', 60) - 60) / - 15)							/// (min(eGFR, 60) – 60) / -15
			+ (0.0203619 * (max(`gfr', 60) - 90) / - 15)							/// (max(eGFR, 60)  – 90) / -15
			+ (0.2036522 * `antihtn')												/// Anti-hypertensive use
			+ (-0.0865581 * `statin')												/// statin use	
			+ (-0.0322916 * (max(`sbp', 110) - 130)/20) * `antihtn'					/// (max(SBP, 110) – 130) /20 × Antihtn
			+ (0.114563 * ((`chol' - `hdl') * 0.02586 - 3.5)) * `statin'			/// ((TC – HDL-C) × 0.02586 – 3.5) × Statin
			+ (-0.0300005 * (`age'- 55)/10 * ((`chol' - `hdl') * 0.02586 - 3.5))	/// (age-55)/10 × ((TC – HDL-C) × 0.02586 – 3.5) 
			+ (0.0232747 * (`age'- 55)/10 * (`hdl' * 0.02586 - 1.3) / 0.3)			/// (age-55)/10 × (HDL-C × 0.02586 – 1.3) /0.3 	
			+ (-0.0927024 * (`age'- 55)/10 * (max(`sbp', 110) - 130)/20)			/// (age-55)/10 × (max(SBP, 110) – 130) /20			
			+ (-0.2018525 * (`age'- 55)/10 * `diabetes')							/// (Age-55)/10 × Diabetes
			+ (-0.0970527 * (`age'- 55)/10 * `smoker')								/// (Age-55)/10 × Cursmk
			+ (-0.1217081 * (`age'- 55)/10 * (min(`gfr', 60) - 60) / - 15)			/// (Age-55)/10 × (min(eGFR, 60) – 60) / -15
			+ (-3.500655 * 1)														/// constant
			if `female' == 0 & `touse'

			replace ascvd10 = exp(ascvd10) / (1 + exp(ascvd10)) if `female' == 0 & `touse'
			replace ascvd10 = round(ascvd10 * 100, 0.01) if `female' == 0 & `touse'				
			
			
			********************
			* HF - Female
			********************
			gen hf10 = .															
			replace hf10 = 															///
			(0.8998235 * (`age'- 55)/10)											/// centered age (Age-55)/10
			+ (-0.4559771 * (min(`sbp', 110) - 110)/20)								/// (min(SBP, 110) – 110) /20
			+ (0.3576505 * (max(`sbp', 110) - 130)/20)								/// (max(SBP, 110) – 130) /20
			+ (1.038346 * `diabetes')												/// Diabetes (1=Yes, 0=No)
			+ (0.583916 * `smoker')													/// Current Smoker (1=Yes, 0=No)
			+ (-0.0072294 * (min(`bmi', 30) - 25) / 5)								/// (min(BMI, 30) – 25) /5
			+ (0.2997706 * (max(`bmi', 30) - 30)/5)									/// (max(BMI, 30) – 30) /5			
			+ (0.7451638 * (min(`gfr', 60) - 60) / - 15)							/// (min(eGFR, 60) – 60) / -15
			+ (0.0557087 * (max(`gfr', 60) - 90) / - 15)							/// (max(eGFR, 60)  – 90) / -15
			+ (0.3534442 * `antihtn')												/// Anti-hypertensive use
			+ (-0.0981511 * (max(`sbp', 110) - 130)/20) * `antihtn'					/// (max(SBP, 110) – 130) /20 × Antihtn
			+ (-0.0946663 * (`age'- 55)/10 * (max(`sbp', 110) - 130)/20)			/// (age-55)/10 × (max(SBP, 110) – 130) /20			
			+ (-0.3581041 * (`age'- 55)/10 * `diabetes')							/// (Age-55)/10 × Diabetes
			+ (-0.1159453 * (`age'- 55)/10 * `smoker')								/// (Age-55)/10 × Cursmk			
			+ (-0.003878 * (`age'- 55)/10 * (max(`bmi', 30) - 30)/5)				/// (Age-55)/10 × (max(BMI, 30) – 30) /5
			+ (-0.1884289 * (`age'- 55)/10 * (min(`gfr', 60) - 60) / - 15)			/// (Age-55)/10 × (min(eGFR, 60) – 60) / -15
			+ (-4.310409 * 1)														/// constant
			if `female' == 1 & `touse'
			
			replace hf10 = exp(hf10) / (1 + exp(hf10)) if `female' == 1 & `touse'
			replace hf10 = round(hf10 * 100, 0.01) if `female' == 1 & `touse'	
			

			********************
			* HF - Male
			********************
			replace hf10 = 															///
			(0.8972642 * (`age'- 55)/10)											/// centered age (Age-55)/10
			+ (-0.6811466 * (min(`sbp', 110) - 110)/20)								/// (min(SBP, 110) – 110) /20
			+ (0.3634461 * (max(`sbp', 110) - 130)/20)								/// (max(SBP, 110) – 130) /20
			+ (0.923776 * `diabetes')												/// Diabetes (1=Yes, 0=No)
			+ (0.5023736 * `smoker')												/// Current Smoker (1=Yes, 0=No)
			+ (-0.0485841 * (min(`bmi', 30) - 25) / 5)								/// (min(BMI, 30) – 25) /5
			+ (0.3726929 * (max(`bmi', 30) - 30)/5)									/// (max(BMI, 30) – 30) /5			
			+ (0.6926917 * (min(`gfr', 60) - 60) / - 15)							/// (min(eGFR, 60) – 60) / -15
			+ (0.0251827 * (max(`gfr', 60) - 90) / - 15)							/// (max(eGFR, 60)  – 90) / -15
			+ (0.2980922 * `antihtn')												/// Anti-hypertensive use
			+ (-0.0497731 * (max(`sbp', 110) - 130)/20) * `antihtn'					/// (max(SBP, 110) – 130) /20 × Antihtn
			+ (-0.1289201 * (`age'- 55)/10 * (max(`sbp', 110) - 130)/20)			/// (age-55)/10 × (max(SBP, 110) – 130) /20			
			+ (-0.3040924 * (`age'- 55)/10 * `diabetes')							/// (Age-55)/10 × Diabetes
			+ (-0.1401688 * (`age'- 55)/10 * `smoker')								/// (Age-55)/10 × Cursmk
			+ (0.0068126 * (`age'- 55)/10 * (max(`bmi', 30) - 30)/5)				/// (Age-55)/10 × (max(BMI, 30) – 30) /5
			+ (-0.1797778 * (`age'- 55)/10 * (min(`gfr', 60) - 60) / - 15)			/// (Age-55)/10 × (min(eGFR, 60) – 60) / -15
			+ (-3.946391 * 1)														/// constant
			if `female' == 0 & `touse'
			
			replace hf10 = exp(hf10) / (1 + exp(hf10)) if `female' == 0 & `touse'
			replace hf10 = round(hf10 * 100, 0.01) if `female' == 0 & `touse'	
			
			if "`include'" != "" {	
				gen include10 = inrange(`age',30,79) & inrange(`chol',130,320) & inrange(`hdl',20,100) & inrange(`sbp',90,200) ///
				& inrange(`bmi',18.5,39.99) & inrange(`gfr',15,150) if `touse'
				label var include10 "Patient values meet guidelines for inclusion"
				local incl include10
			}					
			
			local prevent10vars cvd10 ascvd10 hf10 `incl'
			char def _dta[prevent10vars] "`prevent10vars'" 				
			
		}	// end quietly
			
end