Stata中转换分组直方图数据为重复行数据的方法咨询
把直方图汇总数据展开为Stata行数据的方法
我明白你需要把这种汇总的直方图频次数据(比如-5--56-代表5重复56次)展开成逐行的原始观测值,这样才能顺利使用DCdensity命令——毕竟这个工具通常需要基于原始行数据来计算密度,而不是汇总的频次统计。下面是在Stata里实现这个转换的具体步骤,完全不需要修改命令源代码:
方法一:从字符串格式的直方图数据开始转换
如果你的数据是以类似-5--56-这种字符串形式存储的,先按以下步骤处理:
创建并导入原始数据
先把你的直方图数据导入Stata(这里以手动输入为例,你也可以用import命令读取外部文件):clear input str15 hist_entry "-5--56-" "-10--70-" "-15--60-" "-20--67-" "-25--62-" end拆分字符串,提取数值和频次
用字符串处理命令把每个条目拆分成对应的数值(比如5、10)和重复次数(比如56、70):* 提取核心数值(去掉前后的横杠,取--前的部分) gen value = real(substr(hist_entry, 2, strpos(hist_entry, "--") - 2)) * 提取重复频次(取--后的部分,去掉末尾的横杠) gen freq = real(substr(hist_entry, strpos(hist_entry, "--") + 2, length(hist_entry) - strpos(hist_entry, "--") - 2))这里
real()函数是把拆分出来的字符串转换成数值型变量,方便后续处理。按频次展开行数据
用Stata内置的expand命令,把每一行按对应的频次重复:expand freq * 展开后可以删除不需要的中间变量 drop hist_entry freq使用DCdensity命令
现在你的数据集已经是每行一个观测值的格式,直接运行命令即可:DCdensity value
方法二:如果数据已经是数值+频次的列格式
如果你的数据已经提前拆分好了(比如有一列是数值value,一列是频次freq),那步骤更简单,直接跳过字符串拆分环节,运行expand freq就能得到需要的行数据,之后再调用DCdensity即可。
小提示
- 展开后可以用
list命令检查数据是否正确,比如list in 1/100看看前100行的数值是否符合重复次数。 - 如果你的直方图数据里有负数(比如
-5),上述拆分命令依然有效,因为substr会正确提取--前的负号部分,real()也能识别负数值。
内容的提问来源于stack exchange,提问作者DN1995




