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

在Stata中使用svy前缀比较两变量均值(不使用ttest)

复刻Stata带权重的独立样本t检验结果

问题描述

我在处理调查数据时需要比较两个变量的均值,由于是调查数据必须应用权重,必须使用svy前缀,因此无法直接依赖Stata的ttest命令,需要复刻以下两个命令的结果:

ttest bcg_vaccinated == chc_bcg_vaccinated_2, unpaired
ttest bcg_vaccinated == chc_bcg_vaccinated_2

变量说明:

  • bcg_vaccinated:自我报告的BCG疫苗接种状态
  • chc_bcg_vaccinated_2:通过儿童健康卡核实的BCG接种状态(缺失值代表儿童无健康卡,0=未接种,1=已接种)

两个变量的非缺失观测数不同,配对t检验的解决方案已找到:生成差值变量后做回归,仅保留两变量均非缺失的观测,代码如下:

gen test_diff = bcg_vaccinated - chc_bcg_vaccinated_2 
regress test_diff

但无法实现第一个命令的全样本独立样本均值比较,求解决方法。

示例数据

clear
input byte bcg_vaccinated float chc_bcg_vaccinated_2
0 .
1 0
1 1
1 1
1 0
0 .
1 1
1 1
1 1
1 0
0 .
1 1
1 1
0 .
1 1
1 1
1 0
0 .
1 0
1 0
1 0
0 .
0 .
1 1
0 .

解决方案

要复刻ttest ..., unpaired的全样本均值比较(支持svy权重),可以通过以下两种方法实现:

方法1:转换为长格式后用svy: mean+检验

* 生成唯一观测标识
gen id = _n
* 转换为长格式,保留所有非缺失观测
reshape long _, i(id) j(var_type) string
rename _ bcg_status
* 给分组变量添加标签,区分两个原始变量
label define var_type 1 "bcg_vaccinated" 2 "chc_bcg_vaccinated_2"
label values var_type var_type

* 带权重计算两组均值
svy: mean bcg_status, over(var_type)
* 检验两组均值是否相等(对应unpaired ttest的核心检验)
test [bcg_status]var_type=1 = [bcg_status]var_type=2

方法2:构造虚拟变量用回归实现

无需转换数据格式,直接合并变量并构造分组标识:

* 生成合并后的接种状态变量和分组标识
gen bcg_combined = .
gen is_card_verified = 0
replace bcg_combined = bcg_vaccinated if missing(chc_bcg_vaccinated_2)
replace is_card_verified = 1 if !missing(chc_bcg_vaccinated_2)
replace bcg_combined = chc_bcg_vaccinated_2 if is_card_verified == 1

* 带权重回归,分组变量系数反映两组均值差异
svy: regress bcg_combined i.is_card_verified
* 检验两组均值是否相等(即分组变量系数是否为0)
testparm i.is_card_verified

两种方法都能保留所有非缺失观测,完美复刻ttest ..., unpaired的结果,且支持svy前缀应用调查权重。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:36:00