如何在Stata中基于另一DataFrame生成贫困识别虚拟变量?
在Stata中根据家庭规模和收入创建贫困虚拟变量
问题背景
我当前项目中有两个数据集:一个包含家庭规模(18岁以上成年人数量)和收入的调查数据,另一个是2018年按家庭规模划分的联邦贫困标准(FPG)。例如,FPG规定,1个成年人的家庭年收入≤12140美元即被认定为贫困。
我希望在第一个数据集中创建一个虚拟变量,用于根据家庭规模和收入判断该家庭是否属于贫困。我知道如何在R中实现此操作(df1指上述第一个DataFrame,df2为第二个):
for row in c(1:nrow(df1)) { if (household size[row] == 1) { ifelse (df1$income[row] <= df2[1,2], 1,0) } }
其中df2[1,2]指代家庭规模为1的贫困阈值单元格,其他家庭规模依此类推。但我不清楚如何在Stata中完成该操作,我刚接触该语言,感觉在同一环境中处理多个数据集难度更大。
解决方案
Stata的核心操作逻辑是基于内存中的单个数据集,以下是两种高效实现的方法:
方法1:合并数据集(推荐)
将贫困标准数据集合并到调查数据集中,后续直接通过匹配的阈值创建变量:
准备匹配变量
确保两个数据集都有统一的家庭规模变量(例如均命名为hh_size),且贫困标准数据集(如fpg2018.dta)包含对应家庭规模的贫困阈值变量(如poverty_threshold)。加载并合并数据
// 加载调查数据集到内存 use "survey.dta", clear // 多对一合并:多个调查家庭对应同一家庭规模的贫困标准 merge m:1 hh_size using "fpg2018.dta"
合并后可通过tab _merge检查匹配情况,确保大部分观测为_merge==3(即两边都匹配成功)。
- 生成贫困虚拟变量
Stata支持直接用逻辑表达式生成0/1变量:
gen poor = (income <= poverty_threshold)
如果需要处理缺失值(避免缺失值被误判),可以细化为:
gen poor = . replace poor = 1 if income <= poverty_threshold & !missing(income, poverty_threshold) replace poor = 0 if income > poverty_threshold & !missing(income, poverty_threshold)
方法2:直接条件赋值(无需合并)
若家庭规模类别较少,可直接手动指定各规模的阈值,无需合并数据集:
use "survey.dta", clear // 先初始化虚拟变量为0 gen poor = 0 // 按家庭规模逐一替换为1(替换为实际的FPG阈值) replace poor = 1 if hh_size == 1 & income <= 12140 replace poor = 1 if hh_size == 2 & income <= 16460 replace poor = 1 if hh_size == 3 & income <= 20780 replace poor = 1 if hh_size == 4 & income <= 25100 // 依此类推添加所有家庭规模的条件
内容的提问来源于stack exchange,提问作者MarkWeiss
相关产品推荐
相关产品推荐

