导语
Excel导入Stata后,数据编辑器里几乎所有值都显示为红色,最容易引发两种误判:一是以为文件损坏,二是直接对所有变量执行destring, replace force。前者浪费时间,后者可能把公司代码、日期、文本类别和异常字符一起“清洗”成缺失值。红色通常只是Stata数据编辑器对字符串值的显示方式;真正的问题不是颜色,而是这些字段为什么被识别成字符串、哪些本来就应该保留为字符串,以及转换后是否仍能复现原始数据。
这是一篇现实实践型文章。场景是研究者从数据库、同事或爬虫处拿到一个Excel:第一行可能是中文变量名,若干列混有“—”“不适用”“1,230万元”“12.6%”,公司代码存在前导零,日期又同时出现Excel序列值和“2025/12/31”。目标不是把红色全部变黑,而是建立一条有审计记录的数据入口:原始文件只读、字段逐类判断、转换可回滚、异常值可定位、最终数据可回归。
第一部分:问题不是“红色”,而是变量类型与研究含义错位
Stata中的数值型变量可以直接用于均值、回归和算术运算;字符串变量承载文本。Excel却允许同一列混合数字、文本、空格、公式结果和特殊符号。只要一列中出现足以破坏纯数值识别的内容,导入时就可能成为字符串。Stata官方关于Excel转换的说明强调,一个工作表最好是一张规则数据表,顶部最多保留一行字段说明;现实文件中的多层表头、合并单元格、脚注和合计行,都会干扰类型判断。
必须先区分三类字段。第一类是“数值含义”,如营业收入、资产负债率、员工人数,需要转换为数值。第二类是“标识符”,如股票代码、公司统一代码、地区代码,即使只含数字也不应自动当作数量;000001转成1会丢失前导零。第三类是“分类文本”,如产权性质、行业名称、评级,通常应保留原字符串,并在建模时使用encode或明确生成哑变量。把三类字段一起批量force,相当于在还没理解数据前就改写了数据生成过程。
合格标准不是界面不再出现红色,而是:所有进入运算的字段为正确数值类型;标识符保持唯一性与格式;日期能正确排序和计算;分类变量的值标签与原文一一对应;转换前后观测数不变;新增缺失值都有原因清单;随机抽查记录与Excel原单元格一致。
第二部分:规则背景——Stata到底如何处理字符串、数值和分类变量
根据Stata的数据管理手册,destring用于把含数字字符的字符串转为数值,可通过ignore()处理逗号、货币符号或百分号,但官方示例同时提醒,日期应使用日期函数转换,而不是把分隔符删掉后当作普通整数。 encode则用于把类别字符串映射为带值标签的数值编码;如果字符串本质上是数字字符,官方建议使用real()或destring,而不是encode。
因此,“全部变量都需要处理”不等于“全部变量使用同一个命令”。destring回答的是字符能否解释为数量,encode回答的是类别如何映射为代码,date()或daily()回答的是文本日期如何变成Stata内部日期,tostring回答的是数值标识符是否需要重新表达为固定宽度文本。四者服务于不同构念,不能互换。
判断:数据清洗最重要的控制点不是转换命令,而是字段字典。没有字段含义、原始单位、允许范围、缺失值编码和主键规则,任何自动化清洗都可能“运行成功但研究失败”。AI可以帮助发现模式、生成检查代码,却不能自行决定000001究竟是公司代码还是数量1。
第三部分:机制与方法——为什么Excel会把一列“污染”成字符串
最常见的污染源有八类:表头被当作观测;数字中含千位逗号;百分比带%;金额带货币或“万元”;空单元格被“—”“NA”“不适用”替代;不可见空格或全角字符;日期格式混合;公式错误或脚注进入数据区域。还有一种更隐蔽的情况:同一变量在不同批次Excel中类型不一致,第一次导入为数值,追加第二批时因字符串被迫转换或无法append。
诊断顺序应当是“结构—类型—字符—语义—范围”,而不是先转换。先用describe确认存储类型,用ds, has(type string)列出字符串字段,用codebook和tab观察取值,再对疑似数值字符串使用count if missing(real(var)) & !missing(var)定位不能直接解释为数值的记录。对字符污染,先复制原变量,再逐项处理;只有明确知道被忽略字符的含义时,才使用ignore()。
如果政策年份policy_year含“2018年”,删除“年”后转数值通常合理;如果企业年龄age含“10+”,直接忽略+会把开放区间误写为10。前者是格式清洗,后者涉及测量规则,必须回到数据说明。清洗命令相同,研究含义完全不同。
第四部分:模拟案例——从“全红”到可审计面板
以下为教学模拟,不代表任何真实公司数据。Excel含字段:firmcode、year、revenue、leverage、industry、reportdate。其中公司代码有前导零;收入含逗号和“万元”;杠杆率带百分号;行业为中文文本;日期为字符串。若直接destring, replace force,公司代码前导零消失,行业全部变成缺失,日期可能被错误压缩为数字,研究者只看到“红色没了”,却没有看到信息已经丢失。
正确处理是:firmcode保持字符串并检查公司—年份唯一性;year转整数并限定合理区间;revenue先统一单位再转数值;leverage去%后除以100;industry用encode生成带值标签代码,同时保留原文;reportdate用daily()按明确掩码转换并设置%td格式。随后对转换前后的非缺失数、极值和抽样记录进行比对。
验收阈值可以设为:主键重复数为0;数值转换新增缺失率原则上为0,若大于0必须逐条列出;比例变量在理论范围外的记录全部解释;日期解析成功率达到100%;任一字段的单位变化均写入日志;原始列不覆盖,至少在清洗阶段保留*_raw。
第五部分:对科研工作流的影响
在选题阶段,字段可用性会决定研究问题是否可检验;在数据阶段,类型错位会制造伪缺失、伪异常和错误合并;在实证阶段,字符串不能进入回归,错误编码又可能改变样本;在写作阶段,单位与构造不清会使描述性统计和系数解释矛盾;在投稿阶段,审稿人一旦发现公司代码、年份或比例处理不一致,就会质疑整个可重复性链条。
因此,数据入口应保留三份资产:不可改写的原始Excel;可重复执行的清洗do-file;字段字典与异常记录。人工核验节点至少放在导入后、类型转换后、合并后和最终回归样本形成后。AI只能读取字段样例与数据字典提出候选规则;未公开数据上传前还应按机构规定脱敏,并确认工具的数据使用与保留政策。
第六部分:实操方法
1. 可复制的Stata救援框架
* 代码框架:需结合文件路径、sheet和字段名调整clearallsetmoreoffimport excel using"raw_data.xlsx", sheet("Sheet1") firstrow clear* 结构审计describeds, has(typestring)duplicatesreport firmcode year* 原始值备份clonevar revenue_raw = revenueclonevar leverage_raw = leverageclonevar reportdate_raw = reportdate* 数值字符串:先定位异常,再转换countifmissing(real(subinstr(revenue, ",", "", .))) & !missing(revenue)list firmcode year revenue ifmissing(real(subinstr(revenue, ",", "", .))) & !missing(revenue)destring revenue, replace ignore(",万元")* 百分比:明确转换为0—1口径destringleverage, generate(leverage_pct) ignore("%")replace leverage_pct = leverage_pct/100assertinrange(leverage_pct, 0, 1) if !missing(leverage_pct)* 分类变量:保留原文,另生数值编码encode industry, gen(industry_id)* 日期:按原始格式选择掩码gen reportdate_d = daily(reportdate, "YMD")format reportdate_d %tdassert !missing(reportdate_d) if !missing(reportdate)* 主键与范围验收isid firmcode yearassertinrange(year, 1990, 2035) if !missing(year)compresssave"analysis_ready.dta", replace
2. AI辅助诊断Prompt
适用场景:字段较多、需要生成“候选清洗规则”,不适合让模型直接改写唯一数据文件。输入材料应包括字段字典、每列20—50条脱敏样例、期望类型、单位、允许范围和缺失编码;不得上传可识别个人信息或受保密约束的未脱敏数据。
你是经管实证数据审计助手。请根据我提供的字段字典和脱敏样例,为每个字段输出:当前疑似类型、研究语义、目标Stata类型、污染字符、建议命令、可能的信息损失、转换前后验收语句。请把“标识符、数值、比例、日期、分类文本、自由文本”分开处理。不得使用force掩盖无法解析值,不得删除观测,不得推断缺失值,不得把代码字段当连续变量。输出为字段级表格,最后列出必须由人工决定的问题。
使用步骤是先让模型只做诊断,再由研究者批准规则,随后生成do-file,最后在副本上运行。期望输出必须包含异常定位命令与assert验收语句。人工复核重点是单位、前导零、日期掩码、类别顺序和新增缺失。若模型给出笼统的destring, replace force,应退回并要求逐字段说明信息损失;仍无法解释的字段保持原样并向数据提供方确认。
3. 人工核验清单
•原始文件是否只读并计算版本日期;表头是否唯一;是否删除了合计行、脚注行和空白分隔行。
•主键是否唯一;公司代码长度是否稳定;年份是否为整数;比例是0—1还是0—100。
•转换前后非缺失数是否一致;新增缺失是否有逐条清单;类别数是否异常减少。
•随机抽取至少20条记录与Excel逐格核对;极小值、极大值和零值单独核验。
•do-file是否从原始文件可一键重跑;日志是否记录软件版本、路径、单位和异常处理。
常见失败—原因—修正:全部force导致信息静默丢失,应先列异常;用encode处理收入会得到无经济含义的序号,应改用destring;把日期删除分隔符后当整数会失去日期运算能力,应使用日期函数;覆盖原变量无法回滚,应保留raw列;只看变量颜色不做范围验证,应以断言、抽样和缺失变化为准。
还可以增加一份“转换差异报告”:逐字段记录原类型、目标类型、原非缺失数、转换后非缺失数、异常记录数、单位变化和批准人。若数据每月更新,这份报告应自动与上期比较;一旦某列由数值突然变成字符串、类别数突增或主键重复,流程立即停止,不把异常继续传递到合并与回归。这样,数据清洗就从一次性的手工修补,升级为可以持续运行的质量控制。对于多人协作项目,字段规则、异常决定和代码评审还应进入版本记录,避免不同研究助理用不同口径处理同一变量。

第七部分:核心判断
字符串不是错误,错误的是变量类型与研究含义不一致。高质量数据清洗的标志不是“命令运行无报错”,而是每一次转换都有语义依据、每一条异常都可追踪、每一个结果都能从原始文件重现。对刚进入Stata的研究者,最值得养成的习惯不是记更多命令,而是永远先问:这个字段是什么、允许什么值、转换会丢掉什么,以及我用什么证据证明转换正确。
夜雨聆风