使用Stata统计受试者两年间同一地点的留存次数
解决Stata中统计受试者两年间同一地点停留次数的问题
首先咱们先明确你的数据集(用Markdown表格展示更清晰):
| ID | S1 | S2 | S3 | year |
|---|---|---|---|---|
| 1 | 1 | 2 | 1999 | |
| 1 | 1 | 2 | 2000 | |
| 2 | 1 | 1999 | ||
| 2 | 1 | 2000 | ||
| 3 | 1 | 1999 | ||
| 3 | 2 | 2000 | ||
| 4 | 1 | 2 | 3 | 1999 |
| 4 | 3 | 1 | 2 | 2000 |
| 5 | 1 | 2 | 1999 | |
| 5 | 1 | 3 | 2000 |
要统计每个受试者在1999和2000年停留于同一地点的次数,核心是对比每个ID对应S1/S2/S3在两年的数值是否一致,且只统计两年都有有效记录的地点。下面是具体的Stata操作步骤:
步骤1:将数据转换为宽格式
首先把长格式数据转成宽格式,这样每个ID单独一行,方便直接对比两年的地点数据:
* 按ID分组,将year作为后缀生成宽格式变量 reshape wide S1 S2 S3, i(ID) j(year)
执行后,数据会新增S1_1999、S1_2000、S2_1999、S2_2000、S3_1999、S3_2000这些变量,每个ID对应一行。
步骤2:生成地点匹配标记
对每个地点(S1/S2/S3),判断两年的数值是否相同,同时排除至少一年无记录的情况:
* 标记每个地点是否两年数值一致(仅当两年都有非缺失值时判断) gen match_S1 = (S1_1999 == S1_2000) if !missing(S1_1999) & !missing(S1_2000) gen match_S2 = (S2_1999 == S2_2000) if !missing(S2_1999) & !missing(S2_2000) gen match_S3 = (S3_1999 == S3_2000) if !missing(S3_1999) & !missing(S3_2000) * 将缺失的匹配标记替换为0(代表该地点因缺失数据不计入统计) replace match_S1 = 0 if missing(match_S1) replace match_S2 = 0 if missing(match_S2) replace match_S3 = 0 if missing(match_S3)
步骤3:计算同一地点总次数
把每个ID的匹配标记求和,得到最终的统计结果:
* 求和得到每个ID的同一地点停留次数 gen same_location_count = match_S1 + match_S2 + match_S3
查看结果
执行下面的命令就能看到每个ID的统计结果:
list ID same_location_count, clean
验证结果
按照你的示例:
- ID1:S1、S2两年都相同,S3两年都缺失 → 计数为2
- ID2:只有S1两年相同,其他地点缺失 → 计数为1
- ID3:S1两年不同,其他地点缺失 → 计数为0
- ID4:三个地点两年数值都不同 → 计数为0
- ID5:S1相同,S2不同,S3缺失 → 计数为1
完全符合你的预期需求。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

