计算方法与透明度
每一个风险数字都应该能被解释
本页公开网站当前实际执行的公式、变量、权重、阈值、时间窗口、缺失值处理和局限。
页面数字旁的 可以先看短解释,再回到这里核对完整方法。
为什么同样 10°C 会有不同结果?
温度只是一个输入。湿度、夜间最低温、前几天温度、年龄、慢病、社区脆弱性、历史病例窗口和数据完整度都可能改变结果。
主要风险与行动结果页会同时展示本次使用的关键输入,便于逐项核对。
适用范围:所有分数用于公共健康行动提醒、家庭照护或社区资源排序。它们不提供医疗诊断、处方或治疗建议;出现明显不适时应及时寻求专业帮助。
方法 1
今日热风险与行动
公开风险页、首页和老人模式共用的即时热风险规则。
热风险综合评分(0–100)
HeatActionService 线性加权规则
衡量今天需要多积极采取防暑行动。它是行动优先级,不是疾病发生概率。
变量与权重
- HI_norm = clip((体感热−30)/12, 0, 1)
- Night_norm = clip((夜间最低温−24)/6, 0, 1)
- Streak_norm = clip((连续高温天数−1)/4, 0, 1)
分级与阈值
低风险 <35中风险 35–54.9高风险 55–74.9极高风险 ≥75
局限:用于通用行动提醒;不包含个人病史;缺失历史天气时可能低估连续高温风险
实现位置:services/heat_action_service.py
体感热(Heat Index)
气温与湿度经验公式
把气温和相对湿度合成一个体感温度。湿度越高,同一气温下通常越闷热。
分级与阈值
30°C 以下在热风险分项中记 042°C 及以上在热风险分项中记满分
局限:未单独加入风、太阳辐射、衣着或活动强度
实现位置:services/heat_action_service.py
个人阈值拨片
浏览器本地分级规则
只改变页面如何把同一个分数分级,不改变服务器计算出的原始分数。
变量与权重
- −0.1 = 更早提醒
- 0 = 默认
- +0.1 = 更晚升级
局限:不会上传服务器;不会改变模型或其他用户看到的结果
实现位置:templates/risk.html
行动确认覆盖率
行动状态计数
当天至少完成并保存一项行动的有效监测对象,占该社区全部有效监测对象的比例。
变量与权重
- ConfirmedToday = 当天 confirmed_at 已填写、actions_done_count 至少为 1 且绑定仍为 active 的对象数
- ActivePairsInCommunity = 状态为 active 的绑定数
局限:该指标衡量行动记录覆盖,不等于老人安全状态或健康改善;未确认可能代表尚未操作
实现位置:services/user/_helpers.py
升级触发率
行动升级链计数
当天已进入 backup 或更高升级阶段的对象,占社区有效监测对象的比例。
变量与权重
- EscalatedToday = 当天 relay_stage 顺序达到 backup 及以上且绑定仍为 active 的对象数
局限:受人工点击、超时规则和流程执行完整度影响
实现位置:services/user/_helpers.py
求助率
行动求助标记计数
当天 help_flag 为真的对象,占社区有效监测对象的比例。
变量与权重
- 同一 active 绑定对象当天按一条状态记录计数
- inactive 绑定的历史状态不进入分子或分母
分级与阈值
用于安排回访优先级,没有医学严重程度含义
局限:未点击求助不能证明没有困难
实现位置:services/user/_helpers.py
方法 2
7 天预测
地区级复合暴露关注分、未启用的门诊高负荷概率和可预报性。
7 天复合暴露评分(0–100)
ForecastService 复合暴露规则
地区级天气与环境暴露分数。当前计算不使用家庭成员的慢病资料。
变量与权重
- Heat = clip((校正平均温度−28)×6, 0, 100)
- PM2.5 = clip((PM2.5−35)×1.8, 0, 100)
- Humidity = clip((相对湿度−70)×2.4, 0, 100)
- HotNight = 夜间最低温分档为 8/45/72/100
- 协同加分:热+污染加8,热+高湿加6,热夜+污染加4,可叠加到18
分级与阈值
低关注 <45中关注 45–69.9高关注 ≥70;仅作沟通与行动接口
局限:地区级筛查分数;不等于个人疾病概率;当前实况复用不代表未来日空气质量预报;AQI 转 PM2.5 与默认 AQI 50 均为代理值
实现位置:services/forecast_service.py
门诊高负荷概率(未启用)
探索性门诊负担模型
当前门诊模型缺少时间切分概率校准,线上不输出超历史 P90 概率,也不触发红橙黄模型预警。
变量与权重
- 探索性点估计仍保留用于研究审计
- 固定 theta=2 的范围没有完成本地校准
- 官方天气预警使用独立链路,不受本项停用影响
局限:点估计与范围仍属探索性;不能替代医疗资源排班判断;恢复前需要时间切分回测与概率校准
实现位置:services/forecast_service.py
可预报性评分
预报分歧启发式评分
表示多模型分歧、提前天数和模型数量对天气预报可信度的影响。
变量与权重
- 只要上游提供 ExternalScore 就直接使用外部分支
- 本地分支中模型温差与提前天数降低分数,多模型最多加 8 分
分级与阈值
低 <50中 50–74.9高 ≥75
局限:衡量天气输入稳定性,不代表健康模型准确率
实现位置:services/forecast_service.py
方法 3
个人健康与慢病评估
个人风险融合、即时筛查、慢病相对风险和决策矩阵。
家庭成员档案风险(0–100)
家庭成员档案加分规则
根据档案中的年龄、慢病、风险标签、自测指标和天气敏感阈值进行规则加分。
变量与权重
- 年龄加 0/10/20/25/30 分
- 慢病每项加 8 分,最多 30 分
- 风险标签每项加 5 分,最多 20 分
- 血压偏高加 10,血糖偏高加 10,心率偏快加 8
- 高温/低温敏感阈值各可加 6 分
分级与阈值
低风险 <40中风险 40–69高风险 ≥70
局限:没有使用当天实时天气数值;只用于家庭照护排序;不提供医学诊断
实现位置:core/health_profiles.py
档案完善度
字段完整性计数
已填写的档案项目占当前参与检查项目的比例。
变量与权重
- 基础档案检查关系、年龄、性别、慢病
- 有扩展档案时再检查过敏、药物、指标、风险标签、天气阈值和联系人
分级与阈值
百分比只表示字段是否存在,不评价内容质量
局限:不同成员的分母可能为 4 或 10;不能代表健康数据准确性
实现位置:core/health_profiles.py
个人健康风险得分(0–100)
HealthRiskService 三路径融合
融合温度相对风险、空气质量、即时筛查、个人易感性、社区背景和慢病规则。
变量与权重
- TempScore = clip((温度RR−1)/1.2×100, 0, 100)
- PathA = 50%温度分 + 28%个人易感性 + 22%AQI
- PathB = 30%极端天气 + 30%AQI + 15%湿度 + 25%即时筛查
- CommunityBackground = 65%社区VI + 35%社区30日负担分
- PathC = 40%社区背景 + 35%个人易感性 + 25%温度分
分级与阈值
低风险 <40中风险 40–69.9高风险 ≥70
局限:属于行动筛查;权重为可审计规则;社区代理值会在结果页明确标记;不提供诊断或处方
实现位置:services/health_risk_service.py
即时筛查分数
五项问卷线性加权
把 5 个当日自报项目转换成一个 0–100 的规则分数。
局限:自报信息可能有偏差;严重症状应直接寻求专业帮助
实现位置:services/health_risk_service.py
慢病风险得分(0–100)
DLNM RR + 年龄/共病/生命体征规则
公开 DLNM 病种修正、慢病层唯一年龄/共病修正,以及已提交血压/血糖对分数的影响。
变量与权重
- DLNM 层不接收个体年龄,DLNMAgeModifier 固定为 1
- ChronicAgeAmplifier 是唯一进入个人 RR 的年龄规则
- 总体得分取各相关病种得分的最大值
- Relevance:general/心血管=1.0,其他病种=0.4
- 血压/血糖原始修正最多 18 分
分级与阈值
低风险 <40中风险 40–69.9高风险 ≥70
局限:年龄与共病放大规则仍需真实样本校准;用药依从和自由文本症状当前只作补充观察,不进入总分;不用于调整药物
实现位置:services/chronic_risk_service.py
个人行动筛查影响分
个人行动筛查分
保留个人健康影响强度供行动参考;个人高风险概率未校准,Likelihood 与矩阵当前停用。
变量与权重
- Impact 仍按 0–24.9/25–49.9/50–74.9/75–100 分档
- 不从规则分数反推个人结局概率
局限:用于行动沟通;不表示发病概率;风险档位尚未经过临床校准
实现位置:services/health_risk_service.py
方法 4
机器学习分类
RandomForest 疾病类别输出及特征重要性,供风险线索参考。
天气调整疾病类别关注分(0–100)
RandomForest 多分类模型 + 天气规则修正
RandomForest 原始类别概率经天气敏感规则放大后的关注分。各类别没有再次归一化,合计可能超过 100。
变量与权重
- 输入含年龄、性别、时间和天气特征
- 页面同时展示原始 RF 概率、实际天气倍率和最终关注分
- 极端温湿度可按病种敏感度放大
局限:训练准确率约 65.3%,F1 约 64.2%;天气调整后没有概率归一化;未证明为个体发病概率;不能用于诊断
实现位置:services/ml_prediction_service.py / models/feature_config.json
模型特征重要性
RandomForest impurity-based feature importance
表示某个特征在整棵随机森林中平均贡献了多少分裂信息。
分级与阈值
数值用于全局排序,没有个人正负因果含义
局限:不能说明因果;相关特征可能分摊重要性;不等于本次个人贡献
实现位置:models/feature_config.json
方法 6
1 km 热暴露 GIS
都昌县可追溯 MODIS 网格中的晴空地表温度、年龄结构人口、地表覆盖和表面高程。
原生 MODIS 网格与县域纳入规则
中心点纳入法与完整原生几何发布
以 MYD11A1 h28v06 原生正弦投影像元为分析单位,GeoJSON 保留中心点严格落入都昌县研究边界的完整网格。
变量与权重
- 原生像元边长约 926.625 m,下载 GeoJSON 保存完整原生像元多边形
- 经纬度由 MODIS 正弦投影在球半径 6,371,007.181 m 下转换为 WGS84
分级与阈值
中心点严格位于研究边界内才纳入共纳入 2,593 个县域中心网格
局限:边缘网格可跨越研究边界;开放研究边界不能替代法定行政边界;1 km 为产品名义尺度,实际原生像元边长约 926.6 m
实现位置:docs/gis/heat-exposure-gis-method.md; services/heat_exposure_gis_service.py
网格显示几何
浏览器端中心保持、经纬轴对齐的局部等边近似显示
页面默认绘制中心保持、经纬轴对齐的局部等边近似显示格,便于北向上阅读;原生 MODIS 四角仍保存在 GeoJSON,并可在地图中切回。
变量与权重
- p = 原生像元边长 926.625433 m
- R = MODIS 正弦投影球半径 6,371,007.181 m
- φc = 当前网格中心纬度,角度量先以弧度计算再转换为度;四角为中心经纬度分别加减 δlon 与 δlat
分级与阈值
默认模式为正交显示切换模式不会改变网格 ID、中心点、图层数值或当前选中网格
局限:正交近似显示格不是原生网格边界;全部 2,593 格逐角审计的最大同名角大圆表面位移为 465.805852 m;点落格、边界相交、面积计算和下载分析必须使用原生 GeoJSON 几何
实现位置:docs/gis/heat-exposure-gis-method.md; static/js/heat-exposure-gis.js; services/heat_exposure_gis_service.py
65 岁及以上人口比例
ASPECT 2020 随机森林人口空间分配结果的网格聚合
ASPECT 2020 年龄结构人口栅格聚合到原生 MODIS 网格后,65 岁及以上模型化人口占模型化总人口的比例。
变量与权重
- P65 = MODIS 网格内 ASPECT 100 m 像元的 65 岁及以上模型化人口
- Ptotal = 同一网格内 ASPECT 100 m 像元的模型化总人口
分级与阈值
仅在 ΣPtotal > 0 时显示地图六分位色阶只服务空间比较,不是医学阈值
局限:属于模型化空间分布;受人口基准年和协变量精度影响;不能定位个人、家庭或具体住址
实现位置:docs/gis/heat-exposure-gis-method.md; services/heat_exposure_gis_service.py
Aqua 白天晴空地表温度均值
NASA Aqua MYD11A1.061 原生 1 km 像元逐日质量筛选后求均值
Aqua MYD11A1.061 在 Q3 质量口径下的白天晴空地表温度多年夏季均值。
变量与权重
- Raw = MYD11A1 LST_Day_1km 有效原始编码
- n_Q3 = mandatory QA 位为 00 或 01 且原始编码有效的网格日数
分级与阈值
地图六分位色阶来自全县有效网格分布,只用于相对空间比较
局限:晴空采样存在天气选择效应;地表温度不能替代 2 米气温、室内温度或体感温度;多年均值会平滑短期极端事件
实现位置:docs/gis/heat-exposure-gis-method.md; services/heat_exposure_gis_service.py
Q3 合格观测覆盖率
逐网格质量控制计数
衡量每个网格在 448 个本地冻结场景中有多少天通过 Q3 质量筛选,用于识别云遮和数据稀疏。
变量与权重
- n_Q3 = 当前网格 Q3 合格观测天数
- 448 = 研究期本地冻结且可复核的 MYD11A1 场景数
分级与阈值
覆盖率越高代表可用于均值的天数越多该指标不衡量温度高低或健康危险程度
局限:只能描述有效观测数量;不能校正晴空采样偏差;空间差异可能由云量和质量标志共同造成
实现位置:docs/gis/heat-exposure-gis-method.md; services/heat_exposure_gis_service.py
树木覆盖比例
10 m 分类栅格按源像元覆盖权重聚合
ESA WorldCover 2020 v100 中类别 10 的源像元覆盖权重,聚合到原生 MODIS 网格。
变量与权重
- w = WorldCover 源像元与目标 MODIS 网格相交时使用的覆盖权重
- class=10 = Tree cover
局限:全球产品存在分类误差;2020 快照不能反映后续土地覆盖变化;比例不描述树冠高度或遮阴可达性
实现位置:docs/gis/heat-exposure-gis-method.md; services/heat_exposure_gis_service.py
建成区覆盖比例
10 m 分类栅格按源像元覆盖权重聚合
ESA WorldCover 2020 v100 中类别 50 的源像元覆盖权重,聚合到原生 MODIS 网格。
变量与权重
- w = WorldCover 源像元与目标 MODIS 网格相交时使用的覆盖权重
- class=50 = Built-up
局限:全球产品存在分类误差;比例不描述建筑密度、高度、材料或室内热环境;2020 快照不能反映后续建设变化
实现位置:docs/gis/heat-exposure-gis-method.md; services/heat_exposure_gis_service.py
近似永久水域比例
10 m 分类栅格按源像元覆盖权重聚合
ESA WorldCover 2020 v100 中类别 80 的源像元覆盖权重,用于描述网格内近似永久水体背景。
变量与权重
- w = WorldCover 源像元覆盖权重
- class=80 = Permanent water bodies
局限:属于近似覆盖比例;未进行严格大地测量面积计算;季节性水体和岸线分类误差会影响结果
实现位置:docs/gis/heat-exposure-gis-method.md; services/heat_exposure_gis_service.py
平均表面高程
约 30 m 数字表面模型覆盖权重平均
Copernicus DEM GLO-30 数字表面模型按有效源像元权重聚合到原生 MODIS 网格。
变量与权重
- Elevation = GLO-30 源像元表面高程
- w_valid = 有效源像元覆盖权重
局限:数字表面模型包含植被和建筑等地物高度;不能直接解释裸地地形;空间聚合会平滑局地起伏
实现位置:docs/gis/heat-exposure-gis-method.md; services/heat_exposure_gis_service.py
冻结产物独立复核门槛
独立复核程序与发布前失败关闭校验
发布器只接收通过失败关闭复核的冻结输入,并在 GeoJSON 中保留输入 SHA-256 指纹和质量摘要。
变量与权重
- 复核范围包含网格全集、日历与本地场景、资产完整性和抽样面板重算
- SHA-256 指纹用于确认发布输入与冻结证据一致
分级与阈值
任何硬失败都会停止 GeoJSON 构建当前冻结报告硬失败数为 0
局限:程序复核用于检查可重复性与内部一致性;不代表外部机构认证;上游数据集自身误差仍会传递到结果
实现位置:docs/gis/heat-exposure-gis-method.md; services/heat_exposure_gis_service.py
MAE(平均绝对误差)
离线回测指标
预测门诊量与实际门诊量之间绝对差值的平均数。越低越好。
局限:不反映误差方向;不能单独证明预警校准良好
实现位置:scripts/backtest_forecast.py
RMSE(均方根误差)
离线回测指标
对较大的预测错误惩罚更重。越低越好。
分级与阈值
与 MAE 一起看;RMSE 明显更高常表示存在少数大误差
局限:容易被少数极端日影响
实现位置:scripts/backtest_forecast.py
预测区间覆盖率
离线回测区间指标
实际门诊量落在预测下界和上界之间的天数比例。
局限:高覆盖率不一定代表区间有用
实现位置:scripts/backtest_forecast.py
数据与模型版本
输入从哪里来,在线到底算什么
天气与空气质量
- 实时天气和 7 天预报以和风天气(QWeather)为主要来源。
- 部分非核心天气读取允许 Open-Meteo 兜底;页面会标记来源、缓存和更新时间。
- 公开风险、行动、照护、社区、个人评估、慢病和 ML 等生产风险链在天气不可用时停止输出结论,不用演示天气代替。
- 和风 7 日预报逐日最高温、最低温、平均温或湿度缺失、NaN、无穷时,整组预报会被拒绝,不缓存也不计算风险。
- 7 日复合暴露的 PM2.5 代理链会逐项标记来源;个人健康评估的 AQI 缺失时保留为空,并对该路径其余可用指标重新归一权重。
DLNM 在线链路
- 离线模型属于 quasi-Poisson 广义线性回归,DLNM cross-basis 表达温度的非线性和滞后效应。
- 网站在线请求不会重新拟合回归;它读取
final_single_model_ar1_profile.json 中导出的温度–RR 曲线并插值。
- 当前 profile 版本为 2026-02-11,参考温度 MMT 为 23.8°C。该曲线按累积 RR 使用,线上不会再叠加 lag 权重。
- 当前研究证据状态为 exploratory,MMT 边界标记为 1。冷端 RR 1.45 与热夜 RR 1.34 只保留为未启用的研究元数据。
- 当前 production profile 的单日 RR 上限为 2.6,profile 未加载时文献先验单日上限为 2.2;累计上限均为 3.5。
- 模型未训练时使用 RR=1+0.015×|T−20| 的简化分支,并跳过病种与年龄修正;结果明细会标记该分支。
健康与社区数据
- 历史模型数据覆盖 2023-12-13 至 2025-01-30,共 2,258 条门诊记录;60 岁以上 1,213 条。
- 社区风险使用社区人口、老龄率、慢病率、绿地、热岛、医疗可达性和历史病例。
- Community 表为空或查询失败时,社区地图返回空结果并显示数据不可用,不加载内置 8 村演示档案。
- 已有社区缺少实测绿地、热岛和医疗可达性时,系统使用稳定的中性代理值,并在页面标明局限。
- 病例覆盖率只表示社区字段成功匹配比例,不代表诊断编码已完全验证。
RandomForest 分类器
- 模型为 13 类疾病多分类器,输入包括年龄、性别、时间和天气特征。
- 现有模型元数据记录准确率约 65.3%,F1 约 64.2%。
- 原始 RandomForest 输出是类别概率;天气规则调整后没有再次归一化,页面因此显示“关注分”,不会把它解释为未来发病概率。
- 没有真实推理结果时,页面不会再展示虚构的示例贡献条。
已知局限
当前仍需要继续验证的地方
- 当前 production RR profile 的残差仍存在自相关,应该继续做按时间切分的回测与校准。
- 仓库内可复现的 v1 DLNM 报告把 MMT 标记为搜索边界值,不应直接替换线上 profile。
- 社区原始脆弱性字段存在 0–1 与 0–100 单位混用警告,绿地、热岛、慢病率和医疗可达性仍需更可靠的实测数据。
- 个人、慢病和 7 天评分包含人工设定的可审计权重;这些权重用于行动筛查,尚未完成临床校准。个人概率、门诊高负荷概率及其模型预警与 Likelihood 矩阵因此停用;官方天气预警保持独立。
- 慢病评分只在慢病层应用一次个体年龄放大;该年龄规则仍需真实试点数据校准。
- 数据缺失、代理值、模型回退或天气 API 不可用时,页面必须显示状态,不能把默认值包装成真实观测。
隐私与使用边界
系统会保存什么
- 注册与照护功能会在账号权限范围内保存用户名、家庭成员档案、健康字段、评估记录和行动记录。
- 短码和行动令牌使用哈希与有效期保护;公开页面不应暴露原始健康档案。
- 个人阈值拨片只保存在当前浏览器,不上传服务器。
- 历史建模输出应使用去标识或聚合数据;原始病历字段不进入公开页面和公开报告。
- 微信小程序不使用第三方生成式 AI,也不会把老人档案、健康记录或自由文本发送给 AI 服务。
- Web 正式入口的 AI 问答当前关闭;如未来启用,会在发送前单独说明处理方、数据用途、保存期限并取得明确同意。
- “分享给医生/社区”的字段不等同于完整授权体系,真实医生试点前仍需补充角色、授权、审计和数据最小化。
发现公式、数值或页面解释不一致时,请附上页面、指标名、时间和截图。
反馈数据问题