如何在Stata中对多变量跨变量生成含并列排名的秩值
Stata跨多变量生成统一秩的实现方法
Stata没有直接的rankvars这类单行命令,但可以通过几步操作或自定义程序实现需求,以下是具体方案:
一、手动分步实现
如果只需要单次使用,按以下步骤操作即可:
- 保存原始数据并生成行标识,将宽数据转长格式,把所有变量的数值合并到同一列:
tempname orig save `orig', replace gen obs_id = _n reshape long v, i(obs_id) j(varname) string
- 生成统一秩,根据并列秩的需求选择选项:
- 若要并列数值同秩,后续秩连续(如两个0.2都为秩1,下一个不同值为秩2),用
dense选项:
egen global_rank = rank(v), dense
- 若要并列数值同秩,后续秩跳过并列数量(如两个0.2都为秩1,下一个不同值为秩3),用
field选项:
egen global_rank = rank(v), field
- 默认无选项时,每个数值会被赋予唯一秩(即使并列也会区分)。
- 转回宽格式,将秩变量对应到原变量,并恢复原始数据:
reshape wide v global_rank, i(obs_id) j(varname) string rename global_rank_x rank_x rename global_rank_y rank_y rename global_rank_z rank_z merge 1:1 obs_id using `orig', nogen drop obs_id
二、自定义程序实现“单行命令”效果
如果需要重复使用,可以封装成自定义程序,之后直接用类似rankvars x y z的命令调用:
- 定义程序:
program define rankvars syntax varlist(numeric) [, Dense Field] tempname orig save `orig', replace gen obs_id = _n reshape long v, i(obs_id) j(varname) string if "`dense'" != "" { egen global_rank = rank(v), dense } else if "`field'" != "" { egen global_rank = rank(v), field } else { egen global_rank = rank(v) } reshape wide v global_rank, i(obs_id) j(varname) string foreach var of local varlist { rename global_rank_`var' rank_`var' } merge 1:1 obs_id using `orig', nogen drop obs_id v_* end
- 使用程序:
- 生成连续并列秩:
rankvars x y z, dense - 生成间隔并列秩:
rankvars x y z, field - 默认唯一秩:
rankvars x y z
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

