如何通过循环正确替换HADS量表的缺失值?
HADS量表缺失值处理的Stata代码问题修复
背景与需求
我正在撰写医学科研论文,使用HADS量表评估患者的焦虑与抑郁情况。该量表包含14个条目,分为HADS-D(抑郁子量表)和HADS-A(焦虑子量表)两个子量表,各含7个条目,每个条目分值为0-3分。缺失数据需按量表手册规则处理:
- 若单个子量表缺失条目超过1个,则删除该观测;
- 若单个子量表仅缺失1个条目,则用该子量表其余6个条目的均值填补缺失值。
变量对应关系
- HADS-D子量表(总分对应
hads_anx_score):hads_tense_rec、hads_glad_rec、hads_omen_rec、hads_laugh_rec、hads_trouble_rec、hads_happy_rec、hads_relax_rec - HADS-A子量表(总分对应
hads_depr_score):hads_limited_rec、hads_scary_rec、hads_looks_rec、hads_restless_rec、hads_future_rec、hads_panic_rec、hads_enjoy_rec
处理步骤与问题
我将处理流程拆解为6步,但第5步的填补循环未能成功替换缺失值,仍存在如hads_limited_rec == .的缺失数据:
- 初始化子量表得分变量
- 创建
is_missing_前缀变量标记缺失值 - 统计每个子量表的缺失条目数
- 删除不符合要求的观测
- 填补单个缺失条目(问题所在)
- 计算子量表总分
原代码
*STEP 1: Initialize the HADS-A and HADS-D subscales gen hads_anx_score = . gen hads_depr_score = . * STEP 2:Loop over each observation foreach var in hads_tense_rec hads_glad_rec hads_omen_rec hads_laugh_rec hads_trouble_rec hads_happy_rec hads_relax_rec hads_limited_rec hads_scary_rec hads_looks_rec hads_restless_rec hads_future_rec hads_panic_rec hads_enjoy_rec { gen is_missing_`var' = missing(`var') } * STEP 3: Calculate the number of missing items per subscale egen missing_hads_anx = rowtotal(is_missing_hads_tense_rec is_missing_hads_glad_rec is_missing_hads_omen_rec is_missing_hads_laugh_rec is_missing_hads_trouble_rec is_missing_hads_happy_rec is_missing_hads_relax_rec) egen missing_hads_depr = rowtotal(is_missing_hads_limited_rec is_missing_hads_scary_rec is_missing_hads_looks_rec is_missing_hads_restless_rec is_missing_hads_future_rec is_missing_hads_panic_rec is_missing_hads_enjoy_rec) * STEP 4. Drop observations with more than one missing item in any subscale drop if missing_hads_anx > 1 | missing_hads_depr > 1 **STEP 5.** Replace single missing items with the mean of the present six items foreach var in hads_tense_rec hads_glad_rec hads_omen_rec hads_laugh_rec hads_trouble_rec hads_happy_rec hads_relax_rec { qui replace `var' = (hads_tense_rec + hads_glad_rec + hads_omen_rec + hads_laugh_rec + hads_trouble_rec + hads_happy_rec + hads_relax_rec - `var') / 6 if is_missing_`var' == 1 & missing_hads_anx == 1 } foreach var in hads_limited_rec hads_scary_rec hads_looks_rec hads_restless_rec hads_future_rec hads_panic_rec hads_enjoy_rec { qui replace `var' = (hads_limited_rec + hads_scary_rec + hads_looks_rec + hads_restless_rec + hads_future_rec + hads_panic_rec + hads_enjoy_rec - `var') / 6 if is_missing_`var' == 1 & missing_hads_depr == 1 }
问题原因
原代码中,当目标变量var为缺失值时,(所有条目总和 - var)的运算结果仍为缺失值(Stata中缺失值参与任何算术运算都会返回缺失),导致无法完成填补。例如hads_limited_rec缺失时,hads_limited_rec + ... - hads_limited_rec等价于. + ... - .,结果还是缺失。
修复后的代码
*STEP 1: Initialize the HADS-A and HADS-D subscales gen hads_anx_score = . gen hads_depr_score = . * STEP 2: Create missing value indicators foreach var in hads_tense_rec hads_glad_rec hads_omen_rec hads_laugh_rec hads_trouble_rec hads_happy_rec hads_relax_rec /// hads_limited_rec hads_scary_rec hads_looks_rec hads_restless_rec hads_future_rec hads_panic_rec hads_enjoy_rec { gen is_missing_`var' = missing(`var') } * STEP 3: Calculate the number of missing items per subscale egen missing_hads_anx = rowtotal(is_missing_hads_tense_rec is_missing_hads_glad_rec is_missing_hads_omen_rec /// is_missing_hads_laugh_rec is_missing_hads_trouble_rec is_missing_hads_happy_rec /// is_missing_hads_relax_rec) egen missing_hads_depr = rowtotal(is_missing_hads_limited_rec is_missing_hads_scary_rec is_missing_hads_looks_rec /// is_missing_hads_restless_rec is_missing_hads_future_rec is_missing_hads_panic_rec /// is_missing_hads_enjoy_rec) * STEP 4. Drop observations with more than one missing item in any subscale drop if missing_hads_anx > 1 | missing_hads_depr > 1 * STEP 5. Calculate mean of non-missing items for each subscale (for observations with exactly 1 missing) egen hads_anx_mean = rowmean(hads_tense_rec hads_glad_rec hads_omen_rec hads_laugh_rec hads_trouble_rec hads_happy_rec hads_relax_rec) if missing_hads_anx == 1 egen hads_depr_mean = rowmean(hads_limited_rec hads_scary_rec hads_looks_rec hads_restless_rec hads_future_rec hads_panic_rec hads_enjoy_rec) if missing_hads_depr == 1 * Replace missing items with the subscale mean foreach var in hads_tense_rec hads_glad_rec hads_omen_rec hads_laugh_rec hads_trouble_rec hads_happy_rec hads_relax_rec { qui replace `var' = hads_anx_mean if is_missing_`var' == 1 & missing_hads_anx == 1 } foreach var in hads_limited_rec hads_scary_rec hads_looks_rec hads_restless_rec hads_future_rec hads_panic_rec hads_enjoy_rec { qui replace `var' = hads_depr_mean if is_missing_`var' == 1 & missing_hads_depr == 1 } * STEP 6. Calculate subscale totals egen hads_anx_score = rowtotal(hads_tense_rec hads_glad_rec hads_omen_rec hads_laugh_rec hads_trouble_rec hads_happy_rec hads_relax_rec) egen hads_depr_score = rowtotal(hads_limited_rec hads_scary_rec hads_looks_rec hads_restless_rec hads_future_rec hads_panic_rec hads_enjoy_rec) * Optional: Drop temporary variables drop is_missing_* missing_hads_anx missing_hads_depr hads_anx_mean hads_depr_mean
修复说明
- 先用
egen rowmean直接计算子量表中非缺失条目的均值(仅针对有1个缺失的观测),避免缺失值参与运算的问题; - 再用该均值替换对应子量表中的缺失条目;
- 最后用
rowtotal计算子量表总分,确保结果准确; - 可选择删除临时变量,保持数据整洁。
内容的提问来源于stack exchange,提问作者Gioni_Bletsch
相关产品推荐
相关产品推荐

