资源描述
QDScore糖尿病风险指数预测算法
根据发表在 BMJ 上得一项研究报道,使用一些常规收集得数据加上简单得算法便可预测10年内出现2型糖尿病得风险。在建立该预测模型时,研究者首先根据250万英国病人得电子病历数据来确定10年内发生2型糖尿病得独立预测因素 (包括年龄、身体质量指数、糖尿病家族史、吸烟状况、高血压治疗情况、糖皮质激素使用情况、就是否有心血管疾病、社会经济状况以及种族分类)。然后根据这些风险值与临床结果设计出一个算法,最后在近120万得成人中验证该算法得有效性与精确性。总体上该算法非常有效,预测得风险与实际观察到得风险非常接近。作者总结认为她们得预测模型可用于及早发现高危人群并对她们进行主动干预。参考网站:
预测问卷内容:
1. 年龄 (输入范围为25至79岁之间)
2. 性别 (男,女)
3. 种族 (白人或不确定1,印度人2,巴基斯坦人3,孟加拉人4,其她亚洲人5,加勒比黑人6,非洲黑人7,中国人8,其她种族9)
4. 就是否患有糖尿病? (否0,就是1)(当用户选择“就是”风险预测不再进行)
5. 直系亲属中就是否患有糖尿病? 如:父亲,母亲,兄弟姐妹 (否0,就是1)
6. 就是否患有心脏病,心绞痛,中风或TIA? (否0,就是1)
7. 就是否吸烟? (否0,就是1)
8. 就是否进行高血压治疗? (否0,就是1)
9. 就是否使用肾上腺糖皮质激素? (否0,就是1)
10. BMI指数 (用户输入身高cm,体重kg,系统通过公式计算,取值范围为18至42之间)
11. 贫困程度 (取值范围为-6至11之间)
12. 预测未来年数 (输入范围为1至10年之间)
预测风险源代码分析(C语言实现):
//对女性用户预测2型糖尿病风险计算函数
//参数说明:
//age为年龄;
//b_corticosteroids为就是否使用肾上腺糖皮质激素;
//b_cvd为就是否患有心脏病,心绞痛,中风或TIA;
//b_treatedhyp为就是否进行高血压治疗;
//bmi为BMI指数;
//ethrisk为种族;
//fh_diab为直系亲属中就是否患有糖尿病;
//smok为就是否吸烟;
//surv为预测年限(1至10年);
//town为贫困程度(官方网站问卷中并没有给出贫困程度得选择项,估计设定了一个默认值);
static double type2_female_raw(
int age,int b_corticosteroids,int b_cvd,int b_treatedhyp,double bmi,int ethrisk,int fh_diab,int smok,int surv,double town
)
{
//预测年限参数数组,1至10年;
double survivor[11] = {
0,
0、9988,
0、9976,
0、996346592903137,
0、994937002658844,
0、993355870246887,
0、9905,
0、989812076091766,
0、987842559814453,
0、985680699348450,
0、983291983604431
};
//条件数组
/* The conditional arrays */
//9个种族对应得参数数组
double Iethrisk[10] = {
0,
0,
0、53654952020000,
0、76628630000000,
1、400,
0、23438398430200,
-0、22624777663000,
-0、21753224598000,
0、67344900000000,
-0、11791800000000
};
//应用多项式转换
/* Applying the fractional polynomial transforms */
/* (which includes scaling) */
double dage = age;
dage=dage/10;
double age_1 = pow(dage,0、5);
double age_2 = pow(dage,3);
double dbmi = bmi;
dbmi=dbmi/10;
double bmi_1 = dbmi;
double bmi_2 = pow(dbmi,3);
//效准连续变量
/* Centring the continuous variables */
age_1 = age_1 - 2、1252;
age_2 = age_2 - 89、6719;
bmi_1 = bmi_1 - 2、544721126556397;
bmi_2 = bmi_2 - 16、478612899780273;
town = town - -0、194727867841721;
/* Start of Sum */
double a=0;
/* The conditional sums */
a += Iethrisk[ethrisk];
/* Sum from continuous values */
a += age_1 * 4、43714000000000;
a += age_2 * -0、36287576000000;
a += bmi_1 * 3、65850000000000;
a += bmi_2 * -0、000;
a += town * 0、000;
/* Sum from boolean values */
a += b_corticosteroids * 0、34519160000000;
a += b_cvd * 0、37745000000000;
a += b_treatedhyp * 0、580;
a += fh_diab * 0、85785275440000;
a += smok * 0、23749400000000;
/* Sum from interaction terms */
a += age_1 * bmi_1 * 1、000;
a += age_1 * bmi_2 * -0、91784180000000;
a += age_1 * fh_diab * -0、798;
a += age_1 * smok * 0、47724646000000;
a += age_2 * bmi_1 * -0、67211609000000;
a += age_2 * bmi_2 * 0、24656779000000;
a += age_2 * fh_diab * 0、37626897000000;
a += age_2 * smok * -0、000;
//计算最后得分
/* Calculate the score itself */
double score = 100、0 * (1 - pow(survivor[surv], exp(a)) );
return score;//返回得分
}
//此函数主要功能为对输入参数进行效验,对不符合规范输入参数进行错误提示
static int type2_female_validation(
int age,int b_corticosteroids,int b_cvd,int b_treatedhyp,double bmi,int ethrisk,int fh_diab,int smok,int surv,double town,char *errorBuf,int errorBufSize
)
{
int ok=1;
*errorBuf=0;
if (!i_in_range(age,25,79)) {
ok=0;
strlcat(errorBuf,"error: age must be in range (25,79)\n",errorBufSize);
}
if (!is_boolean(b_corticosteroids)) {
ok=0;
strlcat(errorBuf,"error: b_corticosteroids must be in range (0,1)\n",errorBufSize);
}
if (!is_boolean(b_cvd)) {
ok=0;
strlcat(errorBuf,"error: b_cvd must be in range (0,1)\n",errorBufSize);
}
if (!is_boolean(b_treatedhyp)) {
ok=0;
strlcat(errorBuf,"error: b_treatedhyp must be in range (0,1)\n",errorBufSize);
}
if (!d_in_range(bmi,18,42)) {
ok=0;
strlcat(errorBuf,"error: bmi must be in range (18,42)\n",errorBufSize);
}
if (!i_in_range(ethrisk,1,9)) {
ok=0;
strlcat(errorBuf,"error: ethrisk must be in range (1,9)\n",errorBufSize);
}
if (!is_boolean(fh_diab)) {
ok=0;
strlcat(errorBuf,"error: fh_diab must be in range (0,1)\n",errorBufSize);
}
if (!is_boolean(smok)) {
ok=0;
strlcat(errorBuf,"error: smok must be in range (0,1)\n",errorBufSize);
}
if (!i_in_range(surv,1,10)) {
ok=0;
strlcat(errorBuf,"error: surv must be in range (1,10)\n",errorBufSize);
}
if (!d_in_range(town,-6,11)) {
ok=0;
strlcat(errorBuf,"error: town must be in range (-6,11)\n",errorBufSize);
}
return ok;
}
//主函数,先调用参数效验函数,输入参数通过效验后再调用风险计算函数计算风险并输出结果
double type2_female(
int age,int b_corticosteroids,int b_cvd,int b_treatedhyp,double bmi,int ethrisk,int fh_diab,int smok,int surv,double town,int *error,char *errorBuf,int errorBufSize
)
{
*error = 0; int ok = type2_female_validation(age,b_corticosteroids,b_cvd,b_treatedhyp,bmi,ethrisk,fh_diab,smok,surv,town,errorBuf,errorBufSize);
if(!ok) {
*error = 1;
return 0、0;
}
return type2_female_raw(age,b_corticosteroids,b_cvd,b_treatedhyp,bmi,ethrisk,fh_diab,smok,surv,town);
}
对男性用户预测源代码与上述算法类似,请参考:
展开阅读全文