GHD预测计算
This commit is contained in:
243
pages/ghdCalculator/ghdCalculator.js
Normal file
243
pages/ghdCalculator/ghdCalculator.js
Normal file
@@ -0,0 +1,243 @@
|
||||
const app = getApp();
|
||||
|
||||
Page({
|
||||
data: {
|
||||
// 基础数据
|
||||
ba: '', // 骨龄
|
||||
ca: '', // 实际年龄
|
||||
igf1: '', // IGF-1值
|
||||
igfbp3: '', // IGFBP-3值
|
||||
// 计算结果
|
||||
showResult: false,
|
||||
probability: null,
|
||||
calculationDetails: null,
|
||||
// 参考范围
|
||||
referenceRanges: {
|
||||
igf1: {
|
||||
male: [
|
||||
{ ageRange: '0-1', min: 55, max: 327 },
|
||||
{ ageRange: '1-3', min: 51, max: 303 },
|
||||
{ ageRange: '3-5', min: 49, max: 289 },
|
||||
{ ageRange: '5-7', min: 52, max: 297 },
|
||||
{ ageRange: '7-9', min: 57, max: 316 },
|
||||
{ ageRange: '9-11', min: 88, max: 474 },
|
||||
{ ageRange: '11-13', min: 110, max: 565 },
|
||||
{ ageRange: '13-15', min: 202, max: 957 },
|
||||
{ ageRange: '15-17', min: 193, max: 731 }
|
||||
],
|
||||
female: [
|
||||
{ ageRange: '0-1', min: 55, max: 327 },
|
||||
{ ageRange: '1-3', min: 51, max: 303 },
|
||||
{ ageRange: '3-5', min: 49, max: 289 },
|
||||
{ ageRange: '5-7', min: 52, max: 297 },
|
||||
{ ageRange: '7-9', min: 57, max: 316 },
|
||||
{ ageRange: '9-11', min: 88, max: 474 },
|
||||
{ ageRange: '11-13', min: 183, max: 850 },
|
||||
{ ageRange: '13-15', min: 261, max: 1096 },
|
||||
{ ageRange: '15-17', min: 238, max: 996 }
|
||||
]
|
||||
},
|
||||
igfbp3: {
|
||||
male: [
|
||||
{ ageRange: '0-1', min: 0.7, max: 3.6 },
|
||||
{ ageRange: '1-3', min: 0.8, max: 3.9 },
|
||||
{ ageRange: '3-5', min: 0.9, max: 4.3 },
|
||||
{ ageRange: '5-7', min: 1.0, max: 4.7 },
|
||||
{ ageRange: '7-9', min: 1.1, max: 5.2 },
|
||||
{ ageRange: '9-11', min: 1.3, max: 5.6 },
|
||||
{ ageRange: '11-13', min: 1.4, max: 6.1 },
|
||||
{ ageRange: '13-15', min: 1.6, max: 6.8 },
|
||||
{ ageRange: '15-17', min: 1.8, max: 7.1 }
|
||||
],
|
||||
female: [
|
||||
{ ageRange: '0-1', min: 0.7, max: 3.6 },
|
||||
{ ageRange: '1-3', min: 0.8, max: 3.9 },
|
||||
{ ageRange: '3-5', min: 0.9, max: 4.3 },
|
||||
{ ageRange: '5-7', min: 1.0, max: 4.7 },
|
||||
{ ageRange: '7-9', min: 1.1, max: 5.2 },
|
||||
{ ageRange: '9-11', min: 1.3, max: 5.6 },
|
||||
{ ageRange: '11-13', min: 1.5, max: 6.3 },
|
||||
{ ageRange: '13-15', min: 1.7, max: 7.3 },
|
||||
{ ageRange: '15-17', min: 1.9, max: 7.9 }
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// 输入处理
|
||||
inputBA(e) {
|
||||
// 只允许输入数字和小数点
|
||||
const value = e.detail.value.replace(/[^\d.]/g, '');
|
||||
// 确保只有一个小数点
|
||||
const formattedValue = value.replace(/\.+/g, '.');
|
||||
this.setData({ ba: formattedValue });
|
||||
},
|
||||
|
||||
inputCA(e) {
|
||||
const value = e.detail.value.replace(/[^\d.]/g, '');
|
||||
const formattedValue = value.replace(/\.+/g, '.');
|
||||
this.setData({ ca: formattedValue });
|
||||
},
|
||||
|
||||
inputIGF1(e) {
|
||||
const value = e.detail.value.replace(/[^\d.]/g, '');
|
||||
const formattedValue = value.replace(/\.+/g, '.');
|
||||
this.setData({ igf1: formattedValue });
|
||||
},
|
||||
|
||||
inputIGFBP3(e) {
|
||||
const value = e.detail.value.replace(/[^\d.]/g, '');
|
||||
const formattedValue = value.replace(/\.+/g, '.');
|
||||
this.setData({ igfbp3: formattedValue });
|
||||
},
|
||||
|
||||
// 计算GHD概率
|
||||
calculate() {
|
||||
const { ba, ca, igf1, igfbp3 } = this.data;
|
||||
|
||||
// 输入验证
|
||||
if (!this.validateInput()) return;
|
||||
|
||||
try {
|
||||
// 将字符串转换为数字
|
||||
const baNum = parseFloat(ba);
|
||||
const caNum = parseFloat(ca);
|
||||
const igf1Num = parseFloat(igf1);
|
||||
const igfbp3Num = parseFloat(igfbp3);
|
||||
|
||||
// 计算 BA-CA
|
||||
const baCaDiff = baNum - caNum;
|
||||
|
||||
// 计算 Y = LN(P/1-P)
|
||||
const y = this.calculateY(baCaDiff, igf1Num, igfbp3Num);
|
||||
|
||||
// 计算概率 P
|
||||
const p = this.calculateProbability(y);
|
||||
|
||||
// 计算各因素的贡献
|
||||
const contributions = this.calculateContributions(baCaDiff, igf1Num, igfbp3Num);
|
||||
|
||||
// 显示结果
|
||||
this.setData({
|
||||
showResult: true,
|
||||
probability: p,
|
||||
calculationDetails: {
|
||||
steps: [
|
||||
`步骤1:设置方程右边为 Y`,
|
||||
`Y = 3.726 - 0.876×(BA-CA) - 0.058×(IGF-1) + 0.229×(IGFBP-3)`,
|
||||
`Y = 3.726 - 0.876×(${baNum.toFixed(2)} - ${caNum.toFixed(2)}) - 0.058×${igf1Num.toFixed(2)} + 0.229×${igfbp3Num.toFixed(2)}`,
|
||||
`Y = 3.726 - 0.876×(${baCaDiff.toFixed(2)}) - 0.058×${igf1Num.toFixed(2)} + 0.229×${igfbp3Num.toFixed(2)}`,
|
||||
`Y = 3.726 - ${(0.876 * baCaDiff).toFixed(4)} - ${(0.058 * igf1Num).toFixed(4)} + ${(0.229 * igfbp3Num).toFixed(4)}`,
|
||||
`Y = ${y.toFixed(4)}`,
|
||||
``,
|
||||
`步骤2:解指数方程`,
|
||||
`P/(1-P) = e^Y`,
|
||||
`P/(1-P) = e^${y.toFixed(4)}`,
|
||||
`P/(1-P) = ${Math.exp(y).toFixed(4)}`,
|
||||
``,
|
||||
`步骤3:求概率 P`,
|
||||
`P = e^Y / (1 + e^Y)`,
|
||||
`P = ${p.toFixed(4)}`,
|
||||
``,
|
||||
`GHD预测概率:${(p * 100).toFixed(2)}%`
|
||||
].join('\n'),
|
||||
interpretation: this.getInterpretation(p)
|
||||
}
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
wx.showToast({
|
||||
title: error.message || '计算失败',
|
||||
icon: 'none'
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
// 输入验证
|
||||
validateInput() {
|
||||
const { ba, ca, igf1, igfbp3 } = this.data;
|
||||
|
||||
if (!ba || !ca || !igf1 || !igfbp3) {
|
||||
wx.showToast({
|
||||
title: '请填写完整信息',
|
||||
icon: 'none'
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
// 验证输入是否为有效数字
|
||||
const baNum = parseFloat(ba);
|
||||
const caNum = parseFloat(ca);
|
||||
const igf1Num = parseFloat(igf1);
|
||||
const igfbp3Num = parseFloat(igfbp3);
|
||||
|
||||
if (isNaN(baNum) || isNaN(caNum) || isNaN(igf1Num) || isNaN(igfbp3Num)) {
|
||||
wx.showToast({
|
||||
title: '请输入有效数字',
|
||||
icon: 'none'
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
// 验证数值范围
|
||||
if (baNum <= 0 || caNum <= 0) {
|
||||
wx.showToast({
|
||||
title: '年龄必须大于0',
|
||||
icon: 'none'
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
// 计算Y值
|
||||
calculateY(baCaDiff, igf1, igfbp3) {
|
||||
return 3.726 - 0.876 * baCaDiff - 0.058 * igf1 + 0.229 * igfbp3;
|
||||
},
|
||||
|
||||
// 计算概率
|
||||
calculateProbability(y) {
|
||||
const expY = Math.exp(y);
|
||||
return expY / (1 + expY);
|
||||
},
|
||||
|
||||
// 计算各因素的贡献
|
||||
calculateContributions(baCaDiff, igf1, igfbp3) {
|
||||
// Implementation of calculateContributions method
|
||||
},
|
||||
|
||||
// 获取解释文本
|
||||
getInterpretation(p) {
|
||||
const percentage = (p * 100).toFixed(2);
|
||||
let interpretation = `预测结果显示该患者患有GHD的概率为${percentage}%\n\n`;
|
||||
|
||||
if (p >= 0.8) {
|
||||
interpretation += '预测结果提示GHD可能性较大,建议进一步进行相关检查。';
|
||||
} else if (p >= 0.5) {
|
||||
interpretation += '预测结果提示存在GHD可能,建议进行相关检查。';
|
||||
} else {
|
||||
interpretation += '预测结果提示GHD可能性较小,但仍需结合临床表现进行综合判断。';
|
||||
}
|
||||
|
||||
return interpretation;
|
||||
},
|
||||
|
||||
// 重置表单
|
||||
reset() {
|
||||
this.setData({
|
||||
ba: '',
|
||||
ca: '',
|
||||
igf1: '',
|
||||
igfbp3: '',
|
||||
showResult: false,
|
||||
probability: null,
|
||||
calculationDetails: null
|
||||
});
|
||||
},
|
||||
|
||||
// 返回上一页
|
||||
onClickLeft() {
|
||||
wx.navigateBack();
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user