You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过循环正确替换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 == .的缺失数据:

  1. 初始化子量表得分变量
  2. 创建is_missing_前缀变量标记缺失值
  3. 统计每个子量表的缺失条目数
  4. 删除不符合要求的观测
  5. 填补单个缺失条目(问题所在)
  6. 计算子量表总分

原代码

*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

修复说明

  1. 先用egen rowmean直接计算子量表中非缺失条目的均值(仅针对有1个缺失的观测),避免缺失值参与运算的问题;
  2. 再用该均值替换对应子量表中的缺失条目;
  3. 最后用rowtotal计算子量表总分,确保结果准确;
  4. 可选择删除临时变量,保持数据整洁。

内容的提问来源于stack exchange,提问作者Gioni_Bletsch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 12:35:03