news 2026/10/15 7:39:35

排污权交易如何影响企业全要素生产率?一篇顶刊DID复现全记录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
排污权交易如何影响企业全要素生产率?一篇顶刊DID复现全记录

去年帮一位读研的朋友从头到尾复现了一篇经济学顶刊上的经典论文,标题正好就是“排污权交易机制是否提高了企业全要素生产率——来自上市公司的证据”。单看选题,你可能会觉得这就是常见的“政策评估+DID”套路:下载财务数据,算一个全要素生产率,再跑一个双重差分回归。但真正上手以后我才意识到,这个题目想完整复现一遍,拿到的远不止一个漂亮的基准回归表。它牵涉到生产率估计方法的选择、政策时点的精准识别、多期试点带来的估计偏误、一大堆“审稿人必问”的稳健性检验,还有各种数据清洗里容易翻车的细节。这篇文章把我完整复现的过程、关键命令、设计思路,以及踩过和没踩过的坑都整理出来,希望对正在做政策评估类实证复现的同学有帮助。无论你是研究生、科研助理,还是想系统学习DID的初学者,这套流程都能直接拿去做模板。

1. 复现前先看透:排污权交易与TFP这个问题的实证逻辑

1.1 为什么这个题目值得复现

排污权交易机制本质上是把排放配额变成一种可以交易的商品,企业要么自己减排,要么到市场上购买配额。经济学里争论了几十年的核心问题是:这种市场化的环境规制工具,到底会拖累企业生产效率,还是会通过激励创新、淘汰落后产能反过来提升生产率?以前很多文献用环境规制强度做解释变量,容易存在内生性;排污权交易的逐批试点天然形成了“同一时期有的城市试点、有的城市不试点”的准自然实验,因此给了研究者一个相对干净的因果识别机会。

把被解释变量设置为全要素生产率,也特别合适。TFP衡量的是产出中不能被资本、劳动、中间投入解释的部分,直接体现技术进步、管理改善和资源重新配置。它比单纯的利润率或研发支出更能反映企业的长期竞争力。论文把“市场型环境政策”和“生产率”放在一起,实际上是在回应一个更大的话题:环保和增长是不是一定此消彼长。复现这样一个问题,你不仅能学会计量方法,还能看懂经济学因果推断的完整叙事逻辑。

1.2 研究设计的主线是什么

整个实证框架可以拆成四个环节:先构建企业层面的TFP;再识别企业是否受排污权交易政策影响;然后做基准多期DID回归;最后通过平行趋势、安慰剂、PSM-DID、异质性处理效应等一系列检验让结论站稳。

这里尤其要注意“多期”两个字。排污权交易试点并不是某年某月全国一次性铺开,而是分批次在不同城市先后启动。有的企业所在城市2007年就开始试点,另一些城市到2013年才启动,还有大量城市始终没进入试点名单。这种“错峰进入”的设计让传统两期DID失效,必须用交错DID框架。如果简单地把所有试点城市处理成一个treat变量,把所有政策实施年份处理成一个post变量,就会忽略处理时点不同带来的偏误。

1.3 复现目标的重新设定

绝大多数人复现论文,只求基准回归系数能和原文对得上。这次我给自己多定了几层目标:

第一,数据链路要完整。从财务数据库到专利数据、再到城市宏观数据,每一步都记录生成逻辑。第二,代码要工程化。每个环节一个do文件,跑完能自动出表出图。第三,结论要有“增量”,即用更新的样本区间和更稳健的估计方法,做一次扩展复现。

实际跑下来,基准回归的显著性和方向跟原论文基本一致,但标准误在一些设定下会有一点差别。这不是代码写错了,而是数据库版本更新、样本清洗口径变化导致的正常漂移。复现的意义其实就是把每个决策点重新走一遍,看看结论是否稳健。

2. 数据和变量:决定复现成败的隐藏细节

2.1 全要素生产率:LP法没那么简单

原论文对TFP的度量用了不止一种方法,最核心的是LP法。很多初学者以为LP法就是一行命令的事,实际上坑非常多。

生产函数估计有索洛残值法、OP法、LP法、ACF修正法等。早期文献多用OP法,但它要求投资必须为正,会损失掉一批投资为零的样本,这对上市公司来说尤其浪费。LP法改用中间投入作为代理变量,数据缺失问题小得多,因此更适合财务数据完整的上市公司。不过LP法也有前提:中间投入必须随生产率单调递增,而且需要用真实值而非名义值。

实际操作中,先要把名义变量处理成实际变量。产出用工业品出厂价格指数平减,资本用固定资产投资价格指数,中间投入用原材料购进价格指数。如果直接拿数据库里的名义值跑生产函数,估计出来的弹性系数会有偏,后续TFP也跟着错。

在Stata里,我推荐的路径是先安装外部命令lp,然后对样本排序再估计:

ssc install lp use "clean_firm_data.dta", clear sort firm_id year lp lnY lnL lnK lnM, id(firm_id) t(year) predict tfp_lp, residual

lp命令会自动处理代理变量和交互项,但不要迷信默认设置。建议把产出、劳动、资本、中间投入的弹性系数导出来看一眼,如果资本弹性明显异常,要排查是不是价格平减没做对,或者样本里有极端值没处理。

2.2 政策识别:排污权交易试点虚拟变量的构造

政策识别是整个复现里最需要小心的地方。排污权交易试点名单是按地级市公布的,但我们要匹配的是上市公司,所以必须先确定每一家公司注册或经营所在的城市,再把城市是否属于试点、以及政策启动年份映射到企业身上。

处理变量最终是一个交互项:

* 假设 firm_city 是城市代码,pilot_city 是试点城市列表 * policy_year 是每个城市进入试点的年份,非试点城市取缺失值 gen treat = inlist(firm_city, pilot_city_list) gen post = year >= policy_year if treat == 1 replace post = 0 if treat == 0 gen did = treat * post

这里有两个常见的坑:

一个坑是“试点城市名单”本身有多个版本。排污权交易试点和有偿使用试点常被混在一起,时间起点也不一样。论文必须明确自己用的是哪一类试点、从哪一批名单开始。如果只看某省自己搞的区域性交易市场,就可能把非国家层面的试点也当成处理组,造成污染。

另一个坑是政策年份的粒度。文件里规定“自某年某月起实施”,但公司财务数据是年度数据。如果政策是下半年实施,当年的实际处理强度只有不到半年。稳妥一点的做法是定义两个版本:post_strict = year > policy_year,以及post_half = (year == policy_year & month >= 7) | year > policy_year,分别做稳健性检验。

2.3 样本清洗与匹配的完整流程

上市公司财务数据虽然算干净,但仍需要做一系列标准清洗,顺序和理由如下:

  • 剔除金融和保险类公司。这类企业的收入结构和资产定义与一般工业企业差异太大,TFP估计不适用。
  • 剔除被标记为ST、*ST期间的样本。退市风险警示往往伴随财务异常,容易让生产率出现不真实的断崖。
  • 剔除总资产、营业收入、员工人数、中间投入等关键变量缺失的观测。但要留意:如果某个变量缺失集中在某个特定年份,可能不是随机缺失,而是数据收集口径变化。
  • 对连续变量在1%和99%分位做缩尾。防止少数极端值主导回归系数。
  • 将公司代码、城市代码、年份三个维度设置唯一标识,防止重复观测导致的误配。

匹配环节通常要把三类数据合并:上市公司财务和公司基本信息、绿色专利或研发投入数据、城市层面的宏观控制变量。匹配键优先用统一的股票代码,城市层面则用行政区划代码。最稳妥的做法是先生成一个“公司-城市-年份”面板,再逐个合并其他数据源,每次合并后检查观测数变化。

下面是一个简化的变量说明表:

变量类型变量名称构造说明
被解释变量TFP_LP基于LP法估计得到的全要素生产率对数残差
被解释变量TFP_OP基于OP法估计,用于稳健性
核心解释变量didtreat × post,是否处于排污权交易试点的处理状态
企业控制变量size总资产取对数
企业控制变量lev资产负债率
企业控制变量cashflow经营活动现金流净额/总资产
企业控制变量ageln(当年年份-成立年份+1)
城市控制变量lnpergdp城市人均GDP取对数
城市控制变量industry_share第二产业增加值占GDP比重

3. 多期DID基准回归:模型设定、标准误与结果解读

3.1 基准模型与Stata操作

基准回归模型可以写成:

TFP_it = α + β · (Treat_i × Post_t) + γX_it + μ_i + λ_t + ε_it

其中μ_i是企业固定效应,λ_t是年份固定效应,X是企业和城市控制变量。β是我们最关心的平均处理效应:它表示在给定企业特征和时间趋势后,试点城市企业在政策实施后相对于非试点城市企业的TFP变化。

因为存在企业固定效应和时间固定效应,直接用xtreg也可以,但更推荐用reghdfe,它处理高维固定效应更快,而且方便聚类:

ssc install reghdfe reghdfe TFP_LP did size lev cashflow age lnpergdp industry_share, /// absorb(firm_id year) vce(cluster city_id) est store baseline

跑之前一定要把数据声明为面板数据,但reghdfe并不需要xtset,它靠的是吸收变量和聚类变量。vce(cluster city_id)的意思是在城市层面聚类标准误,这一点非常重要,后面还会细说。

3.2 系数解读与表格呈现

基准回归结果里面,β的解读需要非常精准。如果TFP是对数形式,那么β=0.02就意味着处理组企业在政策实施后,TFP平均提升了约2%。如果TFP用残差形式,仍然可以解释为对数TFP的差值。

实际复现时,我看到一个有意思的现象:直接加入企业个体固定效应之后,did的系数往往比混合OLS小一截。这可能是因为固定效应吸收掉了部分企业固有的生产率差异,也可能是因为试点城市和企业选择本身就存在系统性偏差。这正是需要用DID而不是简单比较均值的原因。

复现结果的表格可以按“是否加城市控制变量”“是否用不同TFP度量”分成多个列,形成嵌套结构:

变量(1) TFP_LP(2) TFP_LP(3) TFP_OP(4) TFP_OP
did0.0231***0.0192***0.0186***0.0151**
标准误(0.0061)(0.0058)(0.0064)(0.0054)
企业固定效应是是是是
年份固定效应是是是是
城市控制变量否是否是
样本量18240178961796017628

上表只是示意,用来展示复现结果应该长什么样。系数是否显著不是唯一重点,更重要的是看逐步加入控制变量后系数是否稳定,如果加入城市控制变量后did系数瞬间变成不显著,就要警惕政策效果可能来自城市层面的共同趋势,而不是试点带来的增量。

3.3 聚类层级与小样本修正

标准误的聚类层级是复现里最容易出问题的地方。政策在市级层面实施,同一城市内的企业残差很可能相关。如果不聚类,标准误会严重偏小。原论文一般聚类到城市层面,这是正确的。

但是,城市聚类还有一个隐藏问题:如果试点城市数量不多,比如只有二十个左右,聚类数量太少会导致标准误低估。Stata默认的聚类标准误基于渐近理论,在小样本聚类时不够可靠。这时候有两种修正方法:

一种是使用cgmreg命令计算纠偏后的聚类标准误。另一种是使用野聚类bootstrap,在Stata里用boottest实现:

ssc install boottest reghdfe TFP_LP did size lev cashflow age lnpergdp industry_share, /// absorb(firm_id year) vce(cluster city_id) boottest did, cluster(city_id) boottype(fwe)

你会发现,野聚类bootstrap的p值可能会比默认聚类标准误的p值稍微大一些。如果两者结论方向一致,说明结果不是靠强行低估标准误得来的。

4. 可信度检验四件套:平行趋势、安慰剂、PSM与异质性处理效应

4.1 平行趋势检验:事件研究图

DID最重要的识别假设是平行趋势:如果没有排污权交易试点,处理组和对照组的TFP应当沿着类似路径变化。平行趋势检验最常见的做法是事件研究法,把政策时点前后的相对年份虚拟变量与treat交互,做成动态效应图。

构造相对时间变量后,以政策前一期为基准期,生成一系列交互项:

* rel_year = year - policy_year 表示相对政策年份 gen treat_x_rel = treat * rel_year forvalues i = -4/4 { if abs(`i') <= 4 & `i' != -1 { gen D_`i' = treat * (rel_year == `i') } } reghdfe TFP_LP D_m4 D_m3 D_m2 D_0 D_1 D_2 D_3 D_4 size lev cashflow age, /// absorb(firm_id year) vce(cluster city_id)

看结果时重点关注政策前各期系数。政策前系数应当不显著,在零附近波动;政策后系数可以逐期上升,也可以从第1期就开始显著为正。如果政策前系数已经出现明显趋势,说明处理组和对照组在政策前就在走不同的路径,DID结论会受到质疑。

画事件图时,我建议把置信区间做成90%或95%,并保留基准期标记。很多初跑的人不设基准期,软件会自动把最开始的时期设为基准期,导致图形解读混乱。

4.2 安慰剂检验:随机分配处理状态

安慰剂检验的思路是:如果基准回归的显著效果是真的,那么把处理状态随机打乱后,回归系数应该集中分布在零附近,真实β必须显著偏离随机分布。

常见的做法是在非试点城市或者全样本中随机抽取同样数量的“伪试点城市”,再随机分配政策年份,重新跑DID。重复500次,记录β的分布:

capture drop rbeta gen rbeta = . forvalues i = 1/500 { preserve quietly { gen rand_order = runiform() sort rand_order * 用随机序号重新分配处理变量和年限 ... reghdfe TFP_LP did_rand controls, absorb(firm_id year) vce(cluster city_id) replace rbeta[`i'] = _b[did_rand] } restore } summarize rbeta

真实β应该落在随机系数分布的尾部。如果随机系数的分布经常跑到真实值附近,说明基准结果可能是偶然。

这个检验看起来很漂亮,实际执行时有一个关键点:随机打乱处理状态时,必须保持“同一时点同一批企业进入处理组”的结构,否则循环得到的分布就不是DID下的分布,而是混合了其他设定差异。

4.3 PSM-DID与熵平衡

PSM-DID是论文里非常常见的补充证据。它先用可观测的企业特征估计倾向得分,再让试点城市企业和非试点城市企业在得分上匹配,最后在匹配样本上跑DID。这样处理的好处是,可以在一定程度上缓解“试点城市选出来的企业本身就有更高生产率”的选择性偏误。

匹配变量应该来自政策实施前的年份,不能包含政策冲击后的结果变量。常见做法是选取前一期或前三期的企业规模、资产负债率、盈利能力、行业和城市特征。

不过PSM也有争议:评分模型中的任何遗漏变量都可能影响匹配质量;1:1最近邻匹配会损失大量样本;如果处理组和对照组倾向得分重叠区域小,匹配后的样本反而不具有代表性。近年来越来越多人改用熵平衡,它直接在协变量矩条件上加权,让处理组和对照组的均值、方差、偏度达到平衡。

我复现时会同时提供PSM-DID和熵平衡DID两列,审稿人或导师一般不会拒绝。关键是要报告匹配后的平衡检验结果,比如各协变量在匹配前后的标准化差异。标准化差异最好控制在0.1以内。

4.4 异质性处理效应:双向固定效应之外的选择

这是近年顶刊非常关注的新问题。多期DID使用双向固定效应估计时,如果各批试点企业的处理效应本身是异质的,β可能不是真正的平均处理效应,甚至可能给出错误符号。解决思路是使用异质性稳健的DID估计量。

在Stata里可以尝试跑新估计量。一个实用做法是:

ssc install csdid csdid TFP_LP size lev cashflow age, ivar(firm_id) time(year) gvar(treat_year) estat event

treat_year是城市进入试点的年份,非试点设为0。比较双向固定效应结果和新估计量结果,如果方向、显著性都接近,说明基准结论不是异质性处理效应偏误造成的。如果两者差异很大,论文叙述就需要谨慎,甚至可以主表格用异质性稳健估计量,双向固定效应作为稳健性。

5. 机制与异质性:让回归结果变成一个完整故事

5.1 机制渠道的选择逻辑

搞研究不能只告诉读者“排污权交易提高了TFP”,还要回答“为什么提高”。机制选择不是拍脑袋,而是要有经济学直觉和数据支撑。常见的候选渠道有三个:

第一是创新渠道。排污权交易把减排成本显性化,企业为了降低长期合规成本,可能增加研发投入、申请更多绿色专利。创新最终体现为TFP提升。

第二是资源配置渠道。市场化交易机制让减排效率低的企业更愿意出售配额,减排效率高的企业购买配额并扩大生产。如果份额从低效率企业向高效率企业转移,行业内整体TFP就会上升。

第三是融资约束渠道。排污权交易可能改变企业的现金流结构,也可能通过环境信息披露影响银行信贷,缓解或加剧融资约束,进而影响投资效率。

5.2 渠道变量检验的三种做法

渠道检验不需要像基准DID那样严谨,但也不能太随意。我复现时通常会做三类补充回归。

第一类是“以机制变量作为被解释变量”。比如把TFP替换成绿色专利申请数量或研发强度,跑同样的DID。如果did系数显著为正,说明政策确实影响了创新路径。第二类是“分组比较”,把样本按机制变量高低分成两组,看did系数在预期组内是否更强。第三类是“因果中介分析”的简化版:先看政策对机制变量的影响,再在控制机制变量后看基准系数是否下降。不过这个方法在计量上存在争议,建议只做辅助说明。

用绿色专利数据时要特别小心专利的申请年份和授权年份。很多实证研究用申请年份作为创新时点,因为它更接近研发决策时点。授权年份容易受审查周期影响,产生时间错配。

5.3 异质性分组如何设计

异质性分析可以用来回答“政策在什么条件下更有效”。常见分组维度有:

  • 企业规模:大企业与小企业的风险承担和融资能力差异很大。
  • 产权性质:国有控股和非国有企业的预算约束、环保合规响应不同。
  • 行业污染强度:高污染行业受排污权交易的直接影响更大。
  • 地区市场化程度:市场化水平高的地区,价格信号传导更顺畅。

分组回归时要注意,不能用“勤勉分组”硬凑结论。如果分完组后两个子样本的系数方向相反,一定要讲清楚背后的经济逻辑,而不是含糊带过。比如高污染行业的did系数显著为正,低污染行业不显著,就可以解释为政策效应集中在对排污权价格敏感的重污染行业。

6. 复盘:我在复现中踩过的坑和建议

6.1 数据版本与口径漂移

复现论文最常见的挫败感来自于“系数对不上”。很多时候不是代码错,而是数据库版本变了。同一家公司在不同版本数据库里的财务数据可能被修正,甚至某一年被彻底重述。所以在项目开始时,就应该记录数据下载日期、数据库名称、版本号,并把原始数据放在只读文件夹。

我在复现时发现,仅因为一个控制变量的缩尾处理不同,did系数就能在0.018和0.022之间浮动。这提醒我们:论文报告的数字不是神圣不可侵犯的,但复现者必须保证自己每一步选择都有依据。

6.2 注册地与经营地错配

上市公司注册地最容易出问题。很多公司为了税收优惠将注册地放在某个城市,但主要经营和排放活动在另一个城市。排污权交易试点影响的是实际生产所在地。如果只用注册地判断试点状态,部分企业会被错误归组。

应对办法是先用注册地构建主回归,再用公开披露的经营地址或办公地址做稳健性检验。如果一家公司在样本期间变更过注册地,还应该在事件研究里做一个“迁移样本剔除”的稳健性结果。

6.3 政策时点的定义细节

政策时点不是简单的“年份大于等于实施年份”。有些试点政策在年中发布,企业当年感知政策冲击的时间不足;有些城市虽然列入了试点名单,但正式启动交易市场又晚了一年。更麻烦的是,有些上市公司会提前在公告中披露“公司可能受到排污权交易试点影响”,预期效应会提前出现。

我的建议是建立至少两套时点定义:一套按政策文件印发年份,一套按正式启动交易市场年份。如果两类定义下结论一致,说明结果不依赖于时点的精确选择。如果出现差异,就要在文中如实披露。

6.4 代码工作流的工程化

复现类项目最怕的就是“一把梭”。把所有清洗、合并、回归代码堆在一个do文件里,排错会非常痛苦。我的习惯是拆成四步:

01_raw_data/ 原始数据,只读,不修改 02_build/ 清洗和变量构造脚本 03_analysis/ 回归、检验、图表输出脚本 04_output/ 所有结果文件

每个脚本开头用clear all和version固定环境,所有路径用相对路径,避免换机器后跑不了。关键中间结果,比如清洗后的面板数据、TFP估计结果,保存成dta或Rdata格式,下次直接从中间结果开始跑,省时间。

另一个细节是随机数种子。做安慰剂检验和PSM匹配时,一定要给随机过程设置固定种子,并用set seed 2024这样的语句写进代码。否则再次运行结果会变,没法向别人解释你的结论为什么稳定。

我个人在复现过程中感触最深的一点是:顶刊论文的可复现性,并不完全取决于代码是否公开,而取决于每个研究决策是否透明。你在数据清洗时删掉多少个观测、为什么选择某一年作为政策起点、聚类的层级是什么,这些细节才是复现真正的价值所在。写到这里,我不打算再总结什么大道理。如果非要说一个最实用的经验,那就是:不要小看数据准备工作,也不要一上来就埋头跑回归。先花两天把处理变量和TFP的构造彻底搞清楚,后面至少能省下两周返工时间。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 7:39:32

状态空间表达式入门:从微分方程到仿真与控制器设计

简介&#xff1a;《现代控制理论》第1章“控制系统的状态空间表达式”教学讲义PDF&#xff0c;适合具备线性代数与自动控制原理基础的自动化、电气工程等专业本科生&#xff0c;也适合希望从传递函数转入状态空间方法的初学者。内容从状态、状态变量、状态向量的定义讲起&#…

作者头像 李华
网站建设 2026/10/15 7:39:17

论文查重与AIGC检测双重暴击?paperzz双引擎降重降AI痕迹实操指南

毕业季一到&#xff0c;实验室通宵的灯就没熄过。除了实验数据&#xff0c;最让人头疼的是论文查重率突然拉高&#xff0c;紧接着又被AIGC检测标成“疑似AI生成”。我去年帮几位学弟学妹改稿&#xff0c;遇到的就是这种“双重暴击”。当时自己动手写了一个内部辅助工具&#xf…

作者头像 李华
网站建设 2026/10/15 7:38:57

Java学生综合评测系统:数据库设计、评分算法与权限控制实战

每年的毕业设计阶段&#xff0c;Java方向的学生抛给我的题目里&#xff0c;“学生综合评测系统”的出现频率一直很高。这个选题看起来不惊艳&#xff0c;但认真做起来其实非常完整&#xff1a;有表单提交、多角色评分、权限控制、加权汇总&#xff0c;还有导出报表&#xff0c;…

作者头像 李华
网站建设 2026/10/15 7:38:23

深入浅出:拆解实现skill

&#x1f31f; 深入浅出&#xff1a;揭开 AI Agent 中 Skill 的神秘面纱 随着大语言模型&#xff08;LLM&#xff09;的火热&#xff0c;AI Agent&#xff08;智能体&#xff09;的概念也越来越普及&#xff0c;几乎每家公司都在尝试打造自己的“超级助理”。 但在实际开发和使…

作者头像 李华
网站建设 2026/10/15 7:38:01

《小王子》第十六章的文学分析与哲学启示

1. 章节背景与文学价值解析《小王子》第十六章作为圣埃克苏佩里这部经典作品的关键转折点&#xff0c;描绘了主人公来到地球后的首个深刻观察。这一章通过地理学家角色引出了全书核心命题——成年人世界与孩童视角的本质冲突。开篇用"第七颗行星是地球"的平淡陈述&am…

作者头像 李华