资讯动态

CSMAR资质认定数据库Stata处理全流程:清洗、变量构造与DID实证

发布时间:2026/9/19 21:31:59 来源:尧图企业网站定制
研究企业资质认定比如高新技术企业认定、ISO认证、驰名商标是公司金融和产业经济学里的热门方向。很多人从CSMAR下载了资质认定数据库QUA但打开文件那一刻就傻眼了——几十万行原始记录字段口径不统一日期格式五花八门有的公司一条资质记录都没有有的却有几十条光是把数据清洗成能用的面板就要折腾好几天。这篇博文就围绕CSMAR资质认定数据库的Stata处理讲清楚从数据导入、清洗、变量构造到亚组分析、DID回归的完整链路。不管你是写毕业论文、做学术研究还是帮券商、智库出一份资质认定影响评估报告这套流程都可以直接拿来用。1. CSMAR资质认定数据库QUA到底装了什么1.1 QUA的数据结构与字段口径CSMAR的资质认定数据库本质上是把上市公司及其子公司获得的各类官方资质认证从年报、公告、政府公示里抽出来做成了结构化表格。数据里常见字段包括公司代码、公司名称、资质类型、资质名称、发证机构、发证日期、截止日期、认定级别、证书状态等。看起来字段不多但实际下载下来数据量非常大一个公司的资质记录从几条到几十条不等全库动辄几十万行。很多人第一次使用这库习惯直接双击用Excel打开结果电脑卡死或者打开之后转圈转半天。这也是我为什么反复强调一定要用Stata来接管这堆数据而不是在Excel里手动筛选。Stata对行数、列数的处理效率远超Excel尤其到了后期要跟财务数据库merge、要做年份塌缩Excel根本扛不住。这里有一个非常容易踩的坑CSMAR提供的下载格式不只是一张主表。最典型的“资质认定信息表”之外往往还附带“资质类型代码表”和“发证机构参考表”。如果你导入Stata之后发现变量名对不上或者某个字段看着像乱码多半是忘了看旁边的参考表。处理思路是先把主表和代码表按主键关联起来再进入后续清洗环节。资质类型代码表里会把“认证类型代码”翻译成“高新技术企业”、“ISO9001”等文字说明不关联这张表你只会看到一串编号根本不知道哪条对应哪个资质。1.2 哪些研究场景会用到QUAQUA数据在实证研究中用得最多的场景是把资质认定当成一个“准自然实验”。比如高新技术企业认定政府有硬性的研发投入、科技人员占比门槛企业一旦通过认定所得税税率直接下降这种外生冲击非常适合做双重差分DID。我身边不少同行的论文都是拿这个数据库筛选高企样本然后构造政策冲击变量。除了税收优惠研究还有几个常见的应用方向资质认证如ISO9001、ISO14000对企业出口绩效和生产率的影响驰名商标、名牌产品认定对销售收入、品牌溢价的影响环保资质、安全生产资质对违规处罚风险的影响把各类资质加总构造企业“资质密度”或“资质多样性”指标作为衡量企业软实力的代理变量。如果你做劳动经济学里“机会不平等”方向QUA数据也不是用不上。可以把资质认定视作一种由地方产业政策、行业准入条件等“环境因素”决定的结果用Stata里的分解方法看它如何传导到企业绩效的地区间差距。这个角度比较进阶我在第4节专门展开。2. 准备阶段Stata安装与CSMAR数据导入2.1 Stata版本选择与安装要点先说软件环境。Stata现在主流版本是17和18如果你只是处理QUA这种中等规模的数据、跑标准回归Stata/BE就够用没必要花大价钱上MP。MP主要是超大数据集和并行计算上有优势但普通研究的样本量根本到不了那个级别属于性能过剩。当然如果你的电脑内存小于8GB我建议能升级就升级QUA全库导入后加上其他财务匹配数据内存占用非常可观卡顿会严重影响效率。安装上有几点实打实的提醒从官网或学校站点下载安装包安装完成后务必确认版本号与授权类型。教学版有行数和变量数上限拿它跑完整CSMAR数据会直接被卡死很多新手用了一年才发现自己用的版本不对。把工作目录设成一个固定文件夹不要放在桌面或者系统盘根目录。后面生成的中间数据文件会非常多散落在桌面会让你整理到头大。建议把set more off写进profile.do否则数据处理过程中每次显示满屏都要手动按空格非常崩溃。profile.do可以放在安装目录每次启动Stata会自动执行。2.2 CSMAR数据的三种导入方式从CSMAR官网下载数据时一般可以选Excel、Txt或者CSV格式。我自己的习惯是优先选Txt或CSV因为QUA原始数据经常几十万行Excel文件打开慢、导入时还容易丢精度尤其是公司代码这种长数字串用Excel读经常自动变成科学计数法后面merge的时候才发现错得离谱。如果下载的是CSV直接import delimited C:/stata_work/QUA.csv, encoding(utf8) clear如果下载的是Excel格式import excel C:/stata_work/QUA.xlsx, sheet(Sheet1) firstrow clear还有一部分老版本CSMAR数据给的是GBK编码的txt这时候需要显式指定编码不然中文乱码import delimited C:/stata_work/QUA.txt, encoding(gbk) clear导入之后第一件事不是急着清洗而是先跑一句describe把变量类型、字符串长度看清楚再跑一句count确认总记录数。然后马上检查有没有重复值这在CSMAR数据里太常见了同一个资质在不同合并报表期间被重复推送不去重的话后面统计会翻倍基准回归的结果也会被污染。3. 数据清洗与变量构造QUA数据库的核心处理环节3.1 去重、日期标准化与面板数据匹配资质认定数据的清洗有三个绕不开的动作顺序最好不要颠倒。第一是去重。我的习惯是先按公司代码、资质名称、发证日期这三个字段做去重。不过有个细节要注意有些企业同一年拿到同一资质的多个分支证书比如同一个集团下不同子公司这时候要结合公司名称和证书编号判断不能只看主代码。建议先用duplicates report看看重复情况再动手不要一上来就咔咔删删错了想恢复只能重新下载。第二是日期标准化。CSMAR的日期字段经常是“2020-06-30”这样的字符串也可能混着“2020/6/30”和“20200630”各种格式统一处理用date()函数gen date date(发证日期, YMD) replace date date(发证日期, YMD10) if date . format date %td gen year year(date) gen month month(date)注意老版本里存在少量无法自动识别的日期比如“2020-00-00”这种转出来是缺失值。处理办法是手工查几条确认占比很小的话再按年份补充或者直接剔除不要影响整体样本。第三是匹配面板。QUA是事件型数据一行是一条资质记录而研究需要的往往是一家公司一年的状态。所以要先把资质数据塌缩成公司-年度面板collapse (min) qualify_year year (count) qualify_count 资质名称, by(股票代码 year)这样得到的qualify_year表示该公司最早获得某类资质的年份qualify_count表示当年新增资质数量。这里有一个容易忽略的口径问题min取的是最早获得资质的年份如果你要研究某类特定资质比如只关注高新技术企业认定一定先keep if 资质类型 高新技术企业再collapse否则会把公司获得其他资质的时间混进来处理时点和实际时点对不上结果就是回归系数显著但解释全错。3.2 缺失值处理的正确姿势别只盯着“两端缺值法”热词里有句“除了两端缺值法stata代码”看来不少人在处理面板缺失值时被老师或者论文模板里的“两端缺值法”折磨过。所谓两端缺值法是处理平衡面板时一种比较粗暴的简化一条样本期内如果变量在样本期开头或结尾存在缺失就整条删掉只有中间年份缺失时才用插值或上一期填值。这个办法能快速得到“平衡”面板但代价是样本量迅速收缩而且会引入选择性偏差顶刊审稿人看到这种处理基本都会质疑样本是不是被“删”出来的。我在处理QUA衍生变量时一般分三步走如果缺失是因为“企业当年还没成立”或“还没有资质记录”这种不是缺失是结构性的0要显式地生成0值而不是用缺省值表示。比如一家公司2015年才上市那2013年没有资质记录并不是数据缺失而是“尚未存在”处理时应该直接删掉未成立的年份而不是补齐0。如果中间年份因合并报表调整导致个别财务变量缺失用线性插值填充比粗暴删端强得多。比如研发投入中间缺一年用相邻两年做线性插值在Stata里一行代码就能搞定。如果核心解释变量比如是否首次获得高新技术企业认定有缺失那就要回到CSMAR原始公告去人工核对千万别用插值去造一个“认定年份”。这是底线核心变量的缺失绝对不能靠机器学习或者插值脑补。插值示例sort 股票代码 year by 股票代码: ipolate 研发投入 year, gen(研发投入_ip)这里ipolate是按公司内部的时间顺序做线性插值如果某个公司只有一年的数据插值会失败记得检查生成变量的缺失情况。3.3 构造DID、事件研究等核心变量资质认定研究里最核心的变量是“是否处理”和“处理时点”。有了资质获得的最早年份就可以构造gen treat 1 if !missing(qualify_year) replace treat 0 if missing(qualify_year) gen post 1 if year qualify_year !missing(qualify_year) replace post 0 if post . gen did treat * post事件研究法里还要把相对时间event time做出来gen event_time year - qualify_year if !missing(qualify_year)这里要特别提醒一个大坑很多新手直接写gen post (yearqualify_year)那从没获得资质的公司因为qualify_year是缺失值post也会变成缺失在回归里被自动删掉等于是把对照组全部剔除了。这是灾难性的错误数据删完之后回归照样能跑但结果已经完全没有意义而且这类错误特别隐蔽不容易被发现。我在给公司做内部培训时反复强调处理缺失值之后一定要看一下各组的样本量对照组只剩零星几条的时候八成就是这里出问题了。4. 基于QUA数据的实证操作亚组分析、回归代码与场景扩展4.1 用Stata做亚组分析的一套标准流程热词里“stata如何做亚组分析”反复出现说明这是很多人的痛点。其实Stata里做好亚组分析的关键就三个字不污染。意思是分组后的样本、系数、标准误都要独立清晰不能被全局设定带跑。推荐的流程是preservekeep ifregestimates storerestore的组合。比如把样本分成国有企业组和非国有企业组preserve keep if 产权性质 国有 reg 总资产收益率 did 企业规模 资产负债率 年份效应 行业效应 estimates store group_state restore preserve keep if 产权性质 非国有 reg 总资产收益率 did 企业规模 资产负债率 年份效应 行业效应 estimates store group_private restore esttab group_state group_private, b(3) t(3) star(* 0.1 ** 0.05 *** 0.01) mtitle(国有 非国有)为什么强调preserve/restore因为如果你不preserve直接keep之后样本就永久性缩小了后面想做全样本回归还得重新导入数据。用preserve可以把当前数据状态“存档”keep只对这段代码块生效restore之后数据恢复原状。这个机制特别适合亚组分析这种需要来回切换样本的场景新手容易忽略却是一个能救命的好习惯。如果你用reghdfe做高维固定效应回归分组回归前最好把absorb变量重新设定一遍避免因子变量级别跨组不一致。另一个更重要的技巧亚组分析里系数显著性“一个显著一个不显著”并不能直接说明组间差异显著。比如国有组did系数不显著、非国有组显著你不能只说“国有组无效、非国有组有效”因为这可能是标准误差异导致的。严谨做法是做个交互项比如reg y c.did##i.产权性质 ...交互项显著才是真正的组间差异显著。4.2 从描述统计到DID回归的完整代码模板把QUA数据整理成公司-年度面板之后我习惯按下面这套模板走一遍既能自查数据质量又方便出图表。这套模板我用了很多年覆盖了从数据检查到基准回归的完整流程* 描述性统计 tabstat 总资产收益率 did 企业规模 资产负债率, by(处理组对照组) stats(n mean sd min p50 max) format(%.3f) * 组间差异检验 ttest 总资产收益率, by(处理组) ranksum 总资产收益率, by(处理组) * 基准DID reghdfe 总资产收益率 did 企业规模 资产负债率, absorb(股票代码 年份) cluster(股票代码) * 平行趋势检验事件研究 reghdfe 总资产收益率 ib(前一期).事件时间_分组 企业规模, absorb(股票代码 年份) cluster(股票代码) * 稳健性PSM-DID psmatch2 did 企业规模 资产负债率 行业, outcome(总资产收益率) neighbor(1) common这里有几处细节值得强调。reghdfe是外部命令需要先安装ssc install reghdfe, replace。这个命令在高维固定效应回归里几乎是标配用普通reg加一大堆i.年份 i.行业的写法在样本量大的时候会很慢reghdfe会快很多而且吸收固定效应之后系数估计更干净。聚类标准误建议聚类到公司层面。同一个公司不同年份的资质认定政策冲击在时间上具有相关性不聚类的话标准误会被低估t值虚高审稿人看到会直接提意见。Stata里reghdfe的cluster()选项可以指定聚类变量推荐用公司代码。平行趋势检验里有个关键设定事件时间的参照期要设为“政策前一期”也就是相对时间等于-1的那一期。用ib()设定基期可以保证估计结果可解释。比如ib(-1).event_time就是把事件时间-1作为基期这样其他各期的系数表示相对于政策前一年的事件效应。有些学生不设定基期系统就会默认用最早一期画出来的图经常是政策前就已经有趋势了然后被导师一顿批。4.3 场景扩展QUA数据如何服务“机会不平等”类研究很多人看到“机会不平等”觉得是劳动经济学专属离公司数据很远。其实不然。机会不平等研究关注的是结果差异有多少是由个体不可控的“环境”因素决定的而不是由“努力”决定的。在企业层面做这个主题可以把企业资质认定看作一种结果变量把区域产业政策、行业进入门槛、大股东背景这些企业既有的环境变量作为“环境因素”然后使用方差分解思路估计环境因素对资质认定概率的解释力。Stata里可以用ineqerr或者手工两步跑。手工两步的流程把资质认定0/1变量对全部环境变量做Probit回归得到拟合值用“均值化”方法把环境变量逐个替代为样本均值比较拟合值方差与总方差之比这个比值就是机会不平等指数。QUA数据在其中提供的是“资质认定”这个干净、可比的被解释变量。相比问卷调查里的主观变量企业资质的口径统一有官方文件背书做跨地区比较时更加稳健。如果你正做这个方向我建议重点用“首次获得高新技术企业认定”作为核心变量剔除重复认定样本并在回归里控制行业固定效应以排除行业特性的干扰。这里要特别说明环境变量的选择一定要有文献支撑不要随手抓一堆变量往模型里塞否则得到的机会不平等指数根本没有经济含义。5. 常见问题与排查技巧实录5.1 新手最容易翻车的5个报错场景第一个是“变量名中含非法字符”。CSMAR导出的变量名常有百分号%、空格、括号Stata是不认的。导入后建议用rename逐一定义标准化变量名或者用批量方法处理。推荐先把变量名统一改为小写再逐个清理特殊字符。别在一个变量名上纠结太久直接重命名是最省事的。第二个是中文乱码。用import delimited导入文本数据出现乱码时八成是编码选错了。CSMAR老数据常用GBK新数据常用UTF-8两个编码都试一下不要在一个编码上死磕。导入后如果看到一堆“涓婂競鍏徃”之类的内容就用另一个编码重新导入。第三个是“reghdfe not found”。这个问题出现频率超高因为reghdfe是外部命令需要手动安装。先ssc install reghdfe, replace再ssc install ftools, replace然后重新安装reghdfe。如果安装失败检查网络或者换个镜像源。第四个是“内存不足”。QUA全库加上匹配数据如果一次全读入可能爆内存。解决办法是只保留需要的变量keep 公司代码 年份 资质名称 发证日期 截止日期别让Stata背着几百万行没用的列跑。尤其是资质类型描述这种长文本一个变量占的内存可能比所有数值变量加起来还多。第五个是“日期转出来全是缺失值”。CSMAR日期字段里偶尔混入“0000-00-00”或“2020-00-00”直接套date()函数会失效。可以先查一下异常值再清洗tab 发证日期 if date(发证日期, YMD) .看到异常的日期值根据实际情况手动纠正或者置为缺失不要无视。5.2 数据匹配和变量可比性避坑经验在用QUA和CSMAR其他数据库匹配时要留意公司代码在不同表之间可能差了尾部后缀。比如主表用的是6位股票代码子公司表用的是带“.SZ”“.SH”后缀或者8位内部代码合并前一定要统一成同一种格式不然merge后会大量非匹配。我处理的方法是先把所有代码统一成字符串然后剔除后缀tostring 股票代码, replace replace 股票代码 substr(股票代码, 1, 6) if length(股票代码) 6 destring 股票代码, replace变量可比性方面资质认定数据典型的“事件型”特征需要特别注意直接拿原始记录做回归是不行的必须先完成从“事件”到“状态”的转换。比如“是否高新技术企业”这个变量在资质有效期之内应该一直是1不能只在发证当年是1。我处理时会用有效期截止日期然后用inrange()判断每一年是否处于资质有效期内gen 有效期年份 year(截止日期) gen 质量有效 inrange(year, 发证年份, 有效期年份) if !missing(发证年份)这样构造出来的变量才是“存量”状态而不是“流量”事件。很多实证论文的结果之所以互相矛盾十有八九是这里处理的口径不同。5.3 实操心得让QUA数据“讲人话”的小习惯最后分享几个我用了很久的小习惯虽然不算是写进论文的“硬知识”却能大幅减少返工时间。每次导入后立刻用label data给数据集命名加个日期后缀比如label data QUA_20250701。这个过程不费事但三个月后你面对一堆同名文件时会对当初这个习惯感激不尽。做数据研究的人都知道最可怕的不是代码报错而是打开一个数据集完全想不起来它是哪一版。对资质类型做编码而不是直接放中文文本。用encode 资质类型, gen(qual_type)后续作图、回归、merge都会顺滑很多也不会因为中文字符不一致造成莫名的匹配失败。中文字符串做分组变量时经常因为全角半角、空格差异导致分组混乱编码成数值类型之后这类问题基本绝迹。保存中间数据用.dta格式不要用Excel。Stata处理几千行没问题但要导出几万行Excel等待时间会让你怀疑人生。.dta文件不仅读写快还能保留变量标签、值标签这些元信息后续分析会方便很多。另外每个中间数据文件名里加上版本号比如QUA_clean_v2.dta不要一直覆盖同一个文件万一后面发现步骤有问题还可以回退到之前版本。我在实际项目中体会最深的一点是CSMAR数据库好不好用取决于你有没有把原始数据变成“能直接送进回归”的干净面板。官方提供的字段说明虽然完整但从原始表到分析表之间的那段路基本没有人替你做。你如果只是把QUA当作一个“查证工具”随便用Excel筛选一下就行可你要是打算拿它发论文、出报告那就把第3节和第4节的流程老老实实走一遍。最后再分享一个少有人提的技巧Stata处理资质认定这类多对一数据时尽量养成“先拆分、再操作、后合并”的思维。用by前缀逐公司处理再用preserve/restore保护全局数据能让代码既快又稳。资质认定数据看着乱但只要结构理顺了后面跑任何模型都省心。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价