尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

哮喘控制测试评分表数字化:ACT/C-ACT计分规则与工程化实现

哮喘控制测试评分表数字化:ACT/C-ACT计分规则与工程化实现 简介这是一份专为4-12岁儿童设计的哮喘控制测试评分表ACT C-ACT用于评估哮喘症状控制水平及当前治疗方案的成效。量表包含五个核心问题依次覆盖日常胸闷或呼吸困难天数、急救药物使用频率、夜间憋醒次数、日常活动受限程度以及对整体控制情况的主观评价每题0-5分总分25分。评分结果按三档划分25分为控制良好20-24分为基本控制低于20分为未有效控制并附有明确的结果解读医生可据此判断是否需要调整用药方案家长也能直观掌握孩子的病情变化。这份评分表既适合儿科、呼吸科门诊随访也适用于家庭定期自测长期使用可构建动态监控体系及时发现症状波动并降低急性发作风险。资源为单份PDF文档约1.09MB下载后即可打印使用目前已有183人学习下载是哮喘儿童长期健康管理的实用工具。1. 哮喘控制测试评分表(ACT C-ACT)先分清两份表再谈打分一份跟踪哮喘控制水平的评分表数字化时工程师常被“ACT 和 C-ACT 是不是同一份表”绊住。ACT 面向 12 岁以上5 题总分 5 到 25C-ACT 面向 4 到 11 岁7 题总分 0 到 27。两者都是分值越高越好但题量、量尺、年龄分界完全不同。做电子病历、随访 App、临床数据采集时这份 PDF 就是需求文档。常见做法是先翻译成数据字典和计分函数再接进随访流程。后文按“规则—建模—对接—验证”推进重点放在没写进 PDF、但必踩的坑。适合读的人给呼吸科做随访系统的工程师、CDMS 里做量表采集的数据工程师、审校计分逻辑的临床 IT 支持。2. ACT与C-ACT的计分规则题项权重、回顾窗口与判定阈值2.1 ACT的5题等权设计症状频率与急救药使用各占一问ACT 一共 5 道题全部采用 1 到 5 分等距刻度5 分代表“完全没有/控制很好”1 分代表“几乎一直有/控制很差”。这里选等权加总不是统计建模的结果而是刻意保持临床可用性医生不需要查权重表把 5 个数字相加即可。5 道题共享同一个回顾窗口“过去 4 周”前两题问活动受限工作、学习、家务和气短频率第三题问夜间憋醒第四题问急救药使用频率第五题让患者对整体控制水平做一次自评。需要特别注意的是第四题的分值方向。急救药如沙丁胺醇用得越多控制越差所以这道题的选项顺序与前三题相反选“完全没有”拿 5 分选“每天 3 次以上”拿 1 分。实现时最容易犯的错不是求和而是把第四题的选项文本复用成“从不/偶尔/经常”这类与症状题相同的文案导致分值方向反了。我的建议是每一题都单独配选项标签数组不共用一份文案从源头防止方向错位。提示中文版 ACT 的选项措辞各题并不完全一致第四题和第五题的刻度方向也与其他题不同建模阶段逐题登记最稳妥。2.2 C-ACT的两段式量尺儿童自评0-3分与家长填报0-5分C-ACT 为 4 到 11 岁儿童设计7 道题分成两段。前 4 题由儿童自己回答配合脸谱图每题 0 到 3 分后 3 题由家长或主要照护者回答每题 0 到 5 分总量程 0 到 27。它并不是把 ACT 改个年龄就完事而是两套不同量尺拼出来的复合问卷。儿童段的回顾窗口刻意缩短为“今天”“运动时”这些具体场景因为 4 到 11 岁孩子很难稳定回答“过去四周有多频繁”这类抽象问题家长段则保留四周回顾用天数档位来量化症状暴露。工程上这两段必须分开建模儿童题用四个大按钮配表情图家长题用六档频次单选不要合并成一张 7 题全用同一量尺的表单。年龄越界是另一个常见问题C-ACT 不覆盖 4 岁以下儿童接口层遇到 age 4 或 age 12 都应直接返回“请使用对应年龄段量表”。2.3 判读阈值与最小临床重要差异切点写进常量而不是if分支两份表的判读阈值经常被记混。标准判定ACT 总分 20 到 25 为控制良好16 到 19 为控制不佳5 到 15 为控制很差成年人 ACT 的最小临床重要差异MCID约为 3 分即两次随访相差 3 分以上才谈得上控制水平真的发生变化。C-ACT 以 20 分及以上为控制良好19 分及以下为控制不佳其 MCID 的共识度不如 ACT 高临床上更常看连续多次的轨迹。实现时不要把 20、16 这些数字散落在 if 分支里建议收敛成一张只读常量表export const ACT_SCORING { min: 5, max: 25, wellControlledFrom: 20, // 20-25 控制良好 notWellControlledFrom: 16, // 16-19 控制不佳15 及以下控制很差 } as const; export const CACT_SCORING { min: 0, max: 27, wellControlledFrom: 20, // 20-27 控制良好19 及以下控制不佳 } as const;常量化有两个直接好处一是院内临床路径如果采用“二分判读”即只区分控制与未控制改动只落在一处二是研究项目试用新切点时不会因为魔法数字散落而漏改。需要提醒的是任何切点调整都必须由临床确认工程角色不要自行“优化”阈值。两份表的完整差异可以收敛成一张表放进设计文档项目ACTC-ACT适用年龄12 岁及以上4-11 岁题数57儿童 4 家长 3每题量尺1-5儿童 0-3家长 0-5总分范围5-250-27判读切点≥20 控制良好16-19 控制不佳≤15 控制很差≥20 控制良好≤19 控制不佳表里最容易被记错的是 C-ACT 的判定方向它和 ACT 一样是分数越高越好如果哪套系统的文案写成“分数越低控制越好”那就是把量表语义整个搞反了。3. 把PDF评分表落成可计算的数据抽题、建模与计分函数3.1 先用pdfplumber把PDF抽成文本锁定题序与选项值我一般把这份 PDF 当“标准答案”而不是宣传页处理先抽取文本确认题号、选项顺序和分值说明再动手建模。抽取用 Python 的 pdfplumber 最直接几行就能看到整份表单的文本结构import pdfplumber with pdfplumber.open(哮喘控制测试评分表(ACT C-ACT).pdf) as pdf: for page in pdf.pages: text page.extract_text() if text: print(page.page_number, text)说明extract_text() 按视觉顺序输出纯文本能直接看到“第1题…第5题”的题序和“由孩子回答/由家长回答”这类标注。如果这份 PDF 是扫描图而非文本层extract_text() 会返回空串这时先确认有没有带文本层的电子版再决定是否走 OCR不要一开始就往 OCR 方向投入。抽完文本我一般再核对三件事每题的回顾窗口是“今天”还是“过去四周”、选项个数是不是 5 或 6 档、题目是否标注了作答人身份。3.2 数据字典先行题号、归属、量尺与控件类型一一对应建模阶段先建数据字典把题号、归属、量尺、控件类型对齐而不是直接开数据库表。常见做法的字典表长这样item_id归属量尺选项数回顾窗口说明act_1患者1-55过去4周活动受限频率act_2患者1-55过去4周气短频率act_3患者1-55过去4周夜间憋醒频率act_4患者1-55过去4周急救药频率方向相反act_5患者1-55过去4周整体控制自评cact_1-cact_4儿童0-34今天/平时表情图自评cact_5-cact_7家长0-56过去4周白天症状/喘息/夜醒天数字段命名用 act_ 和 cact_ 前缀不要用 q_1 到 q_7 这种顺序编号否则后续分析时两份表会混进同一个字段集合。控件类型上儿童题建议用四个大按钮配表情图渲染家长题用单选列表或下拉即可两份表都禁止提交空值这一点要落到前端的提交拦截和后端的校验两层。3.3 计分函数保持单一入口范围校验优先于求和计分逻辑必须只有一个入口不要让前端算完把总分传过来。常见做法是在共享模块放纯函数传答案对象返回总分和判定级别后端再做一次幂等校验type Answers Recordstring, number; export function scoreACT(a: Answers) { const vals [act_1,act_2,act_3,act_4,act_5] .map(id a[id]); if (vals.some(v !Number.isInteger(v) || v 1 || v 5)) { throw new Error(ACT 答案越界分值必须在 1-5); } const total vals.reduce((s, v) s v, 0); const level total ACT_SCORING.wellControlledFrom ? well : total ACT_SCORING.notWellControlledFrom ? notWell : veryPoor; return { total, level }; }参数说明a 是形如 { act_1: 5, act_2: 4 } 的答案映射函数先做类型和范围校验再求和非法输入直接抛异常而不是悄悄转成默认值。缺失值策略上量表类工具一般直接判“本次作答无效”而不是均值插补临床判定依赖总分缺一项总分就失去判读意义。如果研究项目确实要处理缺失也必须单独记录 missing_reason绝不能返回一个看似完整的总分。C-ACT 的计分函数把两段分开校验再相加避免一段合法掩盖另一段越界export function scoreCACT(child: Answers, parent: Answers) { const childVals [cact_1,cact_2,cact_3,cact_4] .map(id child[id]); const parentVals [cact_5,cact_6,cact_7] .map(id parent[id]); if (childVals.some(v !Number.isInteger(v) || v 0 || v 3) || parentVals.some(v !Number.isInteger(v) || v 0 || v 5)) { throw new Error(C-ACT 答案越界儿童题 0-3家长题 0-5); } const total [...childVals, ...parentVals] .reduce((s, v) s v, 0); return { total, level: total CACT_SCORING.wellControlledFrom ? well : notWell, }; }说明儿童段 0 到 3、家长段 0 到 5 是两个独立校验域分开做才能准确定位是哪一段出错。年龄分支放在调用方处理小于 12 岁走 C-ACT12 岁及以上走 ACT4 岁以下直接拒绝这份表不能覆盖学龄前低龄儿童。4. 让评分表跑进随访流程接口契约、SQL趋势与数据质量4.1 接口契约带上版本号与填表人身份避免跨版混算评分表落库时要区分问卷版本和作答记录PDF 表单会发生修订同一个 item_id 在不同版本里可能对应不同选项文本不记版本就会把新旧两版的分数加在一起。一个比较完整的作答请求长这样{ form_version: act-cact-cn-2024, patient_id: P10086, age: 9, filled_by: caregiver, answered_at: 2025-06-01T09:30:0008:00, answers: { cact_1: 3, cact_2: 2, cact_3: 3, cact_4: 3, cact_5: 4, cact_6: 3, cact_7: 4 } }字段说明age 不能省服务端要用它选择量表并做年龄校验filled_by 记录是孩子、家长还是医护代填因为 C-ACT 后 3 题必须由家长作答医护代填会引入偏差answered_at 用带时区的 ISO8601避免随访时间跨时区被算错。服务端拿到请求后先做一次年龄分支判断age 小于 12 强制要求走 C-ACT 字段集age 不在 4 到 99 直接拒绝。4.2 用窗口函数SQL跟踪连续随访找出评分恶化记录随访产品最常见的需求是判断患者到底在变好还是变坏。多次作答不是等间隔的我一般不在应用层逐条比较而是在 SQL 里用 LAG 把上一次总分并排取出一次查出变化量WITH scored AS ( SELECT patient_id, answered_at, total_score, LAG(total_score) OVER ( PARTITION BY patient_id ORDER BY answered_at ) AS prev_score FROM asthma_scores WHERE form_version act-cact-cn-2024 ) SELECT patient_id, answered_at, total_score, prev_score, total_score - prev_score AS delta FROM scored WHERE total_score - prev_score -3 AND answered_at NOW() - INTERVAL 6 months ORDER BY answered_at DESC;说明LAG 取同患者上一次的总分delta 为负且绝对值大于等于 3 时按成人 ACT 的 MCID 约定视为有临床意义的恶化这类记录应主动推送而不是等医生自己翻历史首次作答的 prev_score 为 NULL会自然被过滤不会误判为恶化。form_version 条件保留的原因在于换版后新旧分数不一定可比过滤版本能避免把不同版本的总分放进同一个对比窗口等未来真换版时这条条件会自动切断新旧数据的可比性。4.3 三条数据质量红线重复提交、年龄跳变与版本漂移评分表类功能的数据质量问题通常集中在重复提交、年龄跳变和版本漂移三处处理方式可以直接落地成规则风险表现处理方式重复提交同一天同一患者多条总分记录用 patient_id answered_at form_version 做业务唯一约束保留最新一条并写 dedup 标记年龄跳变同一患者上次走 C-ACT这次走 ACT不自动改判记录 age_at_submit由临床决定切换时机版本漂移换版后总分整体抬高或降低换版前做对拍测试新旧分数差在耐受范围内再开放入口第一条最容易被忽视患者或家长在 App 里连点两次提交就会生成两条看似正常的记录。去重不能只靠数据库自增主键因为两次请求的时间戳会有毫秒级差异必须靠业务键做唯一约束。年龄跳变的处理原则是“记录而不猜测”系统可以提示“该患者已满 12 岁下次随访建议改用 ACT”但不要自动把历史 C-ACT 分数折算成 ACT两份表结构不同折算没有临床依据。版本漂移则必须在换版前完成对拍而不是上线后靠用户反馈被动发现。5. 上线前的验证技巧用对拍样本和边界用例锁死计分评分表功能最怕的不是逻辑复杂而是“看起来对了”。我建议在进 CI 之前准备两类样本临床对拍样本直接照抄典型病历的作答与总分边界用例把所有选项压到最小和最大值验证总分落在量程端点。临床对拍至少要覆盖三档全选最优ACT 应为 25 分C-ACT 应为 27 分全选最差ACT 为 5 分C-ACT 为 0 分再补一组中间值比如 ACT 前三题 4 分、后两题 3 分总分 18 分。用代码写死期望值让每次改动都跑一遍const cases [ { answers: { act_1:5, act_2:5, act_3:5, act_4:5, act_5:5 }, expect: 25 }, { answers: { act_1:1, act_2:1, act_3:1, act_4:1, act_5:1 }, expect: 5 }, { answers: { act_1:4, act_2:4, act_3:4, act_4:3, act_5:3 }, expect: 18 }, ]; cases.forEach((c, i) { const r scoreACT(c.answers); if (r.total ! c.expect) { throw new Error(ACT 用例 ${i 1} 失败期望 ${c.expect}实际 ${r.total}); } });这组用例进 CI 后任何一次表单改版、选项重排、或者有人把量尺从 1-5 改成 0-4都会在 PR 阶段直接报错。C-ACT 还需要单独补一组跨段用例儿童段合法但家长段越界时scoreCACT 必须抛异常而不是返回 27 以内的某个数字反向同理。除了固定用例还可以加一条性质测试随机生成合法答案断言总分永远是整数且落在量程内这能兜住手工样本覆盖不到的排列组合。最后把用例数量和覆盖的阈值档位写进 README临床同事复核时直接看那一节就能确认计分没有被悄悄改过。本文还有配套的精品资源点击获取
返回列表