The Framingham risk score is an algorithm to estimate the 10-year risk of developing coronary heart disease (CHD). I want to combine the diabetes type 2 risk calculator with this algorithm because many of the input data are the same. Furthermore I want to research if total/HDL cholesterol as well as systolic blood pressure can be estimated from simple to obtain numerical data (e.g. BMI) or Boolean data (e.g. on high blood pressure medication? - yes, no) in case the user has no access to laboratory diagnosis and blood pressure monitor.
Code snippet of Framingham risk score algorithm below:
// Framingham Risk Score
void setup() {
Serial.begin(9600);
}
void loop() {
// user input data
boolean gender = true; // false: female, true: male
boolean smoker = true;
boolean medication = true; // high blood pressure medication
int age = 60;
int total_cholesterol = 200; // mg/dL
int HDL_cholesterol = 20; // mg/dL
int systolic_blood_pressure = 200; // mm Hg
int CHD_score;
// look-up tables obtained from http://en.wikipedia.org/wiki/Framingham_Risk_Score
int score_age_women_men[10][4] =
{
{20, 34, -7, -9},
{35, 39, -3, -4},
{40, 44, 0, 0},
{45, 49, 3, 3},
{50, 54, 6, 6},
{55, 59, 8, 8},
{60, 64, 10, 10},
{65, 69, 12, 11},
{70, 74, 14, 12},
{75, 79, 16, 13}
};
int tot_cholesterol_women_men[5][12] =
{
{130, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{160, 199, 4, 3, 2, 1, 1, 4, 3, 2, 1, 0},
{200, 239, 8, 6, 4, 2, 1, 7, 5, 3, 1, 0},
{240, 279, 11, 8, 5, 3, 2, 9, 6, 4, 2, 1},
{280, 320, 13, 10, 7, 4, 2, 11, 8, 5, 3, 1}
};
int smoker_women_men[5][2] =
{
{9, 8},
{7, 5},
{4, 3},
{2, 1},
{1, 1}
};
int HDL_cholesterol_women_men[4][3] =
{
{60, 100, -1},
{50, 59, 0},
{40, 49, 1},
{20, 39, 2}
};
int blood_pressure_women_men[5][6] =
{
{90, 119, 0, 0, 0, 0},
{120, 129, 1, 3, 0, 1},
{130, 139, 2, 4, 1, 2},
{140, 159, 3, 5, 1, 2},
{160, 200, 4, 6, 2, 3}
};
int CHD_risk_score[14][6] =
{
{-10, 8, -10, 0, 1, 1},
{9, 12, 1, 4, 1, 1},
{13, 14, 5, 6, 2, 2},
{15, 15, 7, 7, 3, 3},
{16, 16, 8, 8, 4, 4},
{17, 17, 9, 9, 5, 5},
{18, 18, 10, 10, 6, 6},
{19, 19, 11, 11, 8, 8},
{20, 20, 12, 12, 11, 10},
{21, 21, 13, 13, 14, 12},
{22, 22, 14, 14, 17, 16},
{23, 23, 15, 15, 22, 20},
{24, 24, 16, 16, 27, 25},
{25, 46, 17, 46, 30, 30}
};
// compute age score
for(int i = 0; i < 10; i++) {
if(gender == false && age >= score_age_women_men[i][0] && age <= score_age_women_men[i][1]) {
CHD_score = score_age_women_men[i][2];
break;
}
if(gender == true && age >= score_age_women_men[i][0] && age <= score_age_women_men[i][1]) {
CHD_score = score_age_women_men[i][3];
break;
}
}
// get age index for cholesterol and smoker score
int j;
for(j = 0; j < 9; j += 2) {
if(age >= score_age_women_men[j][0] && age <= score_age_women_men[j+1][1]) {
j = j/2;
break;
}
}
// compute cholesterol and smoker score
for(int i = 0; i < 5; i++) {
if(total_cholesterol >= tot_cholesterol_women_men[i][0] && total_cholesterol <= tot_cholesterol_women_men[i][1]) {
if(gender == false) {
CHD_score += tot_cholesterol_women_men[i][j+2];
if(smoker == true) CHD_score += smoker_women_men[j][0];
}
if(gender == true) {
CHD_score += tot_cholesterol_women_men[i][j+7];
if(smoker == true) CHD_score += smoker_women_men[j][1];
}
break;
}
}
// compute HDL cholesterol score
for(int i = 0; i < 4; i++) {
if(HDL_cholesterol >= HDL_cholesterol_women_men[i][0] && HDL_cholesterol <= HDL_cholesterol_women_men[i][1]) {
CHD_score += HDL_cholesterol_women_men[i][2];
break;
}
}
// compute blood pressure score
for(int i = 0; i < 5; i++) {
if(systolic_blood_pressure >= blood_pressure_women_men[i][0] && systolic_blood_pressure <= blood_pressure_women_men[i][1]) {
if(gender == false) {
if(medication == false) CHD_score += blood_pressure_women_men[i][2];
if(medication == true) CHD_score += blood_pressure_women_men[i][3];
}
if(gender == true) {
if(medication == false) CHD_score += blood_pressure_women_men[i][4];
if(medication == true) CHD_score += blood_pressure_women_men[i][5];
}
}
}
// compute 10 year CHD risk
for(int i = 0; i < 14; i++) {
if(gender == false) {
if(CHD_score >= CHD_risk_score[i][0] && CHD_score <= CHD_risk_score[i][1]) {
if(i == 0) Serial.print("< ");
if(i == 13) Serial.print("> ");
Serial.print(CHD_risk_score[i][4]);
break;
}
}
if(gender == true) {
if(CHD_score >= CHD_risk_score[i][2] && CHD_score <= CHD_risk_score[i][3]) {
if(i == 0) Serial.print("< ");
if(i == 13) Serial.print("> ");
Serial.print(CHD_risk_score[i][5]);
break;
}
}
}
Serial.println(" of 100 people with this level of risk will have a heart attack in the next 10 years");
while(1) {
}
}
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.