Stata:CLDS数据转码闪退问题解决方案

发布时间:2022-04-15 阅读 3114

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

王耀辉 (山东师范大学),wangyaohuink@126.com
初   虹 (山东财经大学),ch2099058972@163.com


目录


1. 问题描述

中国劳动力动态调查 (CLDS) 数据库的 Stata 数据编码格式相对较老。如果用 Stata14 及以上版本打开的话,会出现中文乱码的情况。但是,在使用常规的转码方法进行转码时,会出现闪退的情况。网上的解决方案,要么需要使用复杂的循环语句,要么需要使用外部命令。即使这样,这些方案也都不能很好的解决问题。

通过观察,我们发现闪退的原因是,数据中的一些数值标签有乱码。这些乱码无法通过命令解决,只能手工修改。本文的解决方案如下所示:

2. 标签概述

标签是对数据中的元素进行的文字性说明。在 Stata 中,标签有数据标签、变量标签和数值标签等三种形式。具体来看:

数据标签:对整个数据的简单说明。例如,在调用 auto 数据时,括号中内容 "1978 Automobile Data" 为该数据的标签。

. sysuse auto,clear
(1978 automobile data)

变量标签:对变量的进一步说明。例如,变量 rep78 的标签是 "Repair Record 1978",即二手车在 1978 年的维修记录。

. des

 Observations:            74                  1978 automobile data
    Variables:            12                  13 Apr 2020 17:45
                                              (_dta has notes)
--------------------------------------------------------------------
Variable      Storage   Display    Value
    name         type    format    label      Variable label
--------------------------------------------------------------------
make            str18   %-18s                 Make and model
price           int     %8.0gc                Price
mpg             int     %8.0g                 Mileage (mpg)
rep78           int     %8.0g                 Repair record 1978
headroom        float   %6.1f                 Headroom (in.)
trunk           int     %8.0g                 Trunk space (cu. ft.)
weight          int     %8.0gc                Weight (lbs.)
length          int     %8.0g                 Length (in.)
turn            int     %8.0g                 Turn circle (ft.)
displacement    int     %8.0g                 Displacement (cu. in.)
gear_ratio      float   %6.2f                 Gear ratio
foreign         byte    %8.0g      origin     Car origin
-------------------------------------------------------------------
Sorted by: foreign

数值标签:对变量数值的文字说明,一般用在分类变量上。例如,变量 foreign 有两个值 0 和 1。其中 0 的标签是 Domestic,而 1 的标签是 Foreign。数值标签都是蓝色的,双击标签才能看到被其覆盖的数值。

. label list
origin:
           0 Domestic
           1 Foreign

Stata 中对标签进行操作的命令是 label。例如:

. label data "1978年二手车数据"      // 修改数据标签
. label variable make "品牌和型号"   // 修改变量标签
. label define df 0 "国产" 1 "进口"  // 设置一个数值标签,命名为 df
. label value foreign df            // 将数值标签 df 映射给变量 foreign

3. 转码过程

以 2016 年的社区数据为例,为了找到是哪些标签出了问题,我们需要先将所有的数值标签保存下来。

use clds2016community, clear                // 导入数据
label save using community_2016.do, replace // 将数值标签保存到一个 do 文档里

将 community_2016.do 文档拖入 Stata 的 do 文档编辑器中。此时会弹出一个框提示你当前文件并不是使用 UTF-8 编码,并让你选择编码。这里选择 Chinese GB(18030) 即可。

打开该文档后可以看到,大部分标签都能正确显示。例如标签 C105 是这样设定的:

label define C105 1 `"草房"', modify
label define C105 2 `"土木房"', modify
label define C105 3 `"砖混结构"', modify
label define C105 4 `"窑洞"', modify
label define C105 5 `"蒙古包"', modify
label define C105 99 `"其他(请注明)"', modify

但是,标签 i907 和 i80 却不能正确显示,有很多乱码:

label define i907 1 `"1 土葬%XB92 火葬直接安3 火葬将骨灰盒%XD74 其他请注明%XA3"', modify
label define i907 2 `"2 火葬直接安3 火葬将骨灰盒%XD74 其他请注明%XA3"', modify
label define i907 3 `"3 火葬将骨灰盒%XD74 其他请注明%XA3"', modify
label define i907 4 `"4 其他请注明%XA3"', modify

label define i80 1 `"1 汉%XD72 壮%XD73 满%XD74 回%XD75 苗%XD76 维吾%XB67 土家8 彝%XD79 
蒙古10 藏%XD711 布依12 侗%XD713 瑶%XD714 朝鲜15 白%XD716 哈尼17 哈萨%XBF18 黎%XD719 傣%XD720 
畲%XD721 僳僳22 仡佬23 东乡24 拉祜25 水%XD726 佤%XD727 纳西28 羌%XD729 土%XD730 仫佬31 锡伯32 
柯尔克33 达斡%XB634 景颇35 毛南36 撒拉37 布朗38 塔吉%XBF39 阿昌40 普米41 鄂温%XBF42 怒%XD743 
京%XD744 基诺45 德昂46 保安47 俄罗%XCB48 裕固49 乌孜别50 门巴51 鄂伦%XB452 独龙53 塔塔%XB654 
赫哲55 高山56 珞巴99 其%XCB"', modify

label define i80 2 `"2 壮%XD73 满%XD74 回%XD75 苗%XD76 维吾%XB67 土家8 彝%XD79 蒙古10 
藏%XD711 布依12 侗%XD713 瑶%XD714 朝鲜15 白%XD716 哈尼17 哈萨%XBF18 黎%XD719 傣%XD720 
畲%XD721 僳僳22 仡佬23 东乡24 拉祜25 水%XD726 佤%XD727 纳西28 羌%XD729 土%XD730 仫佬31 
锡伯32 柯尔克33 达斡%XB634 景颇35 毛南36 撒拉37 布朗38 塔吉%XBF39 阿昌40 普米41 鄂温%XBF42 
怒%XD743 京%XD744 基诺45 德昂46 保安47 俄罗%XCB48 裕固49 乌孜别50 门巴51 鄂伦%XB452 独龙53 
塔塔%XB654 赫哲55 高山56 珞巴99 其%XCB"', modify
......
label define i80 56 `"56 珞巴99 其%XCB"', modify
label define i80 99 `"99 其%XCB"', modify

这些乱码不太容易通过命令解决,只能先删掉这些有乱码的标签:

label drop  i80 i907 // 删去有乱码的数值标签
save clds2016community_transcode,replace  // 将删去问题标签的数据保存

然后再进行转码就不会发生闪退 (如果还闪退,一定是没把乱码标签删干净):

clear
unicode encoding set gb18030
unicode translate clds2016community_transcode.dta, transutf8 

手动调整乱码:

use clds2016community_transcode,clear
label define i907 1 `"土葬(棺材)"', modify
label define i907 2 `"火葬(直接安葬骨灰盒)"', modify
label define i907 3 `"火葬(将骨灰盒装入棺材安葬)"', modify
label define i907 4 `"其他"', modify
label define i80 1 `"汉族"', modify
label define i80 2 `"壮族"', modify
......
label define i80 56 `"珞巴族"', modify
label define i80 99 `"其他"', modify

将调整好的标签映射给相关变量:

label value C7_2 i80
label value C105_2_w16 i907
save, replace

由于CLDS中的变量和标签非常多,查找具体哪些变量使用了这两个标签可能比较困难。此时可以进行如下操作:

use clds2016community, clear  // 导入原始数据
describe, replace              // 生成一个数据描述文件

打开 Data Editor 后会发现,新生成的文件中包含了所有变量的相关信息。其中 name 是变量的名字,vallab 是数值标签。我们可以很方便的查找变量对应的标签名字。

4. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 乱码 编码, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,700+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxhsongbl 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh