【OP方法实战】从数据清洗到结果解读:手把手教你用Stata计算上市公司全要素生产率

张开发
2026/4/18 0:46:57 15 分钟阅读

分享文章

【OP方法实战】从数据清洗到结果解读:手把手教你用Stata计算上市公司全要素生产率
1. 数据准备与清洗打好TFP计算的基础计算上市公司全要素生产率TFP的第一步就是确保手头的数据干净、可靠。这就像做菜前要先把食材洗干净、切好一样数据清洗虽然枯燥但直接影响最终结果的准确性。我处理过不少上市公司财务数据发现原始数据往往存在各种问题缺失值、异常值、单位不统一等等。以2022年A股上市公司为例大约15%的企业数据存在不同程度的缺失或异常。数据清洗的核心原则是既要保证数据质量又要避免过度清洗导致样本代表性下降。具体操作上我通常用Stata做以下处理剔除特殊样本既发行A股又发行B股的公司财务结构比较特殊建议先用drop if命令剔除。比如drop if B股代码 ! 处理缺失值先用misstable summarize检查缺失情况对关键变量如营业收入、员工人数缺失超过30%的样本直接剔除drop if missing(营业收入) | missing(员工人数)单位统一财务数据有的以元为单位有的是万元。我习惯统一转为万元replace 营业收入 营业收入/10000 if 营业收入 100000000异常值处理对连续变量做1%缩尾处理winsorize避免极端值影响winsor2 营业收入 固定资产净值 员工人数, cuts(1 99) replace这里有个小技巧处理前先用summarize看原始分布处理后再次验证确保操作效果。2. 关键变量构建OP方法的基石Olley-Pakes(OP)方法对变量定义有特定要求这一步直接关系到估计结果的可靠性。根据我多次实操经验变量构建中最容易出错的是投资变量的计算。核心变量清单Y产出用营业收入替代工业增加值。注意要用平减指数调整gen lnY ln(营业收入/价格指数)L劳动员工人数取对数。有研究用支付职工现金替代但数据可得性较差gen lnL ln(员工人数)K资本固定资产净值取对数。建议先用永续盘存法计算资本存量gen K 固定资产净值 gen lnK ln(K)I投资这是OP方法的关键代理变量计算公式要特别注意gen I 购建固定资产无形资产和其他长期资产支付的现金 replace I 0 if missing(I) // 缺失值按0处理 gen lnI ln(I1) // 加1避免对0取对数其他控制变量// 企业年龄 gen age 年份 - 上市年份 1 // 出口状态 gen EX (海外收入 0 !missing(海外收入)) // 退出变量 gen exit (ST状态 ST | ST状态 *ST)实际项目中我发现很多文献对变量定义语焉不详。比如资本存量就有净值法、永续盘存法等多种计算方式建议在论文中明确说明选择依据。3. OP方法实现Stata详细操作指南终于到了核心环节——用OP方法估计TFP。这个方法通过三阶段估计解决同时性偏差和样本选择问题是当前最主流的TFP估计方法之一。3.1 模型设定OP方法的核心是区分三类变量状态变量(state)lnK和age代理变量(proxy)lnI投资控制变量(cvars)state和EX自由变量(free)lnL、year、reg、ind等在Stata中实现时我推荐使用opreg命令需先安装ssc install opreg // 安装命令3.2 分步估计完整的OP估计包含三个阶段实际操作中可以一步完成opreg lnY, free(lnL i.year i.reg i.ind) state(lnK age) proxy(lnI) cvars(state EX) exit(exit)参数解释free()放入自由变量包括劳动力和各类虚拟变量state()状态变量通常是资本和年龄proxy()代理变量必须是投资cvars()控制变量exit()企业退出变量注意行业虚拟变量建议用证监会2012版分类使用i.ind自动生成。3.3 结果保存估计完成后TFP值会自动保存在新变量_tfp中。我习惯再做标准化处理egen tfp_op std(_tfp) label var tfp_op OP方法估计的TFP(标准化)4. 结果解读与稳健性检验得到TFP估计值只是开始如何解读和验证结果同样重要。根据我的经验至少要做以下检查4.1 描述性统计先看TFP的基本分布sum tfp_op, detail hist tfp_op, normal title(TFP分布) // 检查是否符合正态分布理想情况下TFP应该近似正态分布均值接近0因为标准化过。如果出现双峰或严重偏态可能需要检查模型设定。4.2 行业对比分析不同行业的TFP差异bysort ind: egen mean_tfp mean(tfp_op) graph bar mean_tfp, over(ind) title(各行业平均TFP) // 绘制条形图我曾发现某行业TFP异常高检查后发现是该行业上市公司普遍存在研发投入资本化问题导致资本存量被高估。4.3 时间趋势观察TFP随时间的变化collapse (mean) tfp_op, by(year) line tfp_op year, title(TFP时间趋势) // 绘制趋势线如果发现某年TFP突变需要检查是否当年会计准则或统计口径有重大变化。4.4 稳健性检验我常用的三种检验方法更换变量定义比如用支付职工现金替代员工人数改变样本范围剔除ST公司或只保留制造业比较不同方法同时用LP方法估计看结果是否一致// LP方法对比 levpet lnY, free(lnL) proxy(lnI) state(lnK) gen tfp_lp _tfp corr tfp_op tfp_lp // 看两种方法结果相关性理想情况下不同方法估计的TFP应该高度相关0.7。如果差异过大可能需要重新审视模型设定。5. 常见问题与解决方案在实际操作中我遇到过各种坑这里分享几个典型案例问题1投资变量大量为零现象约30%样本的I0导致代理变量失效解决按Blundell-Bond方法用滞后变量替代或改用LP方法问题2行业虚拟变量过多现象细分行业导致虚拟变量太多模型无法收敛解决合并小行业或改用二位行业代码问题3同时性偏差严重现象核心解释变量与误差项相关解决在opreg中加入更多控制变量或改用动态面板模型问题4结果与经济直觉不符现象出口企业TFP反而更低解决检查EX变量定义是否正确或考虑出口强度而非二元变量有个实用技巧遇到问题时先用小样本如100家企业测试快速定位问题。6. 完整代码示例与注释最后分享一个经过实战检验的完整代码模板包含详细注释// 数据清洗 use 上市公司数据.dta, clear drop if B股代码 ! // 剔除AB股公司 drop if missing(营业收入) | missing(员工人数) // 剔除关键变量缺失 winsor2 营业收入 固定资产净值 员工人数, cuts(1 99) replace // 缩尾处理 // 变量构建 gen lnY ln(营业收入/价格指数) gen lnL ln(员工人数) gen K 固定资产净值 gen lnK ln(K) gen I 购建固定资产无形资产和其他长期资产支付的现金 replace I 0 if missing(I) gen lnI ln(I1) gen age 年份 - 上市年份 1 gen EX (海外收入 0 !missing(海外收入)) gen exit (ST状态 ST | ST状态 *ST) // OP方法估计 opreg lnY, free(lnL i.year i.reg i.ind) state(lnK age) proxy(lnI) cvars(state EX) exit(exit) // 结果处理 egen tfp_op std(_tfp) label var tfp_op OP方法估计的TFP(标准化) // 结果分析 sum tfp_op, detail bysort ind: egen mean_tfp mean(tfp_op) graph bar mean_tfp, over(ind) collapse (mean) tfp_op, by(year) line tfp_op year这个模板已经帮助多位同事完成了他们的研究。关键是要根据自己研究问题调整变量定义特别是行业分类和退出变量的判定标准。

更多文章