ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

SBM-DEA面板数据效率测算:绿色创新与投资效率Stata实战指南

SBM-DEA面板数据效率测算:绿色创新与投资效率Stata实战指南

1. 这套SBM-DEA面板测算方案到底在解决什么问题

第一次接触“绿色创新效率”和“绿色投资效率”这两个词的人,很容易把它们当成两个抽象概念一带而过。但只要你在做区域经济、产业政策或者企业可持续发展方向的实证研究,就会很快发现:这两个指标本质上是把“投入多少资源”和“产出多少绿色成果”放在同一把尺子上量,看谁用更少的资源换来了更多的绿色产出。而SBM-DEA(Slack-Based Measure Data Envelopment Analysis,基于松弛变量的数据包络分析)就是目前学界公认比较靠谱的一把尺子。

我先把这套东西的定位说清楚。它是一套面向面板数据的效率测算方案,包含两部分交付物:一份整理好的面板数据集,以及一套可直接运行的Stata代码。核心功能是把多个决策单元(比如不同地区、不同行业、不同企业)在多年份上的绿色创新活动和绿色投资活动,分别折算成效率值,并且允许你在同一套框架下做横向对比和纵向趋势分析。它解决的问题很具体:传统DEA模型(CCR、BCC)在处理非期望产出(比如污染排放)和松弛变量时会出现偏差,算出来的效率值容易虚高,而SBM-DEA把松弛变量直接纳入目标函数,能更真实地反映“有多少投入被浪费了”。

适合谁来参考?三类人最对口。第一类是写毕业论文的硕博生,尤其是做绿色经济、区域协调发展、环境规制效果评估方向的,手里有面板数据但不知道怎么把效率算出来;第二类是政策研究机构的分析人员,需要拿效率值做区域对标;第三类是企业可持续发展部门的从业者,想用定量方法评估绿色投入的产出效果。哪怕你之前没碰过DEA,只要会用Stata做基本的回归,这套流程你就能跑通。

我见过太多人卡在第一步:数据格式不对、投入产出指标选错、模型设定跑偏,最后算出来的效率值全是1或者全是0.3,根本没法用。所以这篇内容我不打算只讲“怎么点按钮”,而是把每个环节背后的逻辑、参数选择的理由、以及我实际踩过的坑都摊开讲。你照着做,至少能少走两三个月的弯路。

2. 核心思路拆解:为什么是SBM-DEA而不是别的模型

2.1 从“效率”这个词的两种理解说起

效率这个词在实证研究里有两个常见口径。一个是比值口径,比如“绿色产出除以绿色投入”,简单直观,但只能处理单一投入单一产出,多投入多产出就抓瞎了。另一个是前沿面口径,也就是DEA的思路:把所有决策单元放在一起,找出一个“最优前沿面”,谁离前沿面近谁效率高。SBM-DEA属于后者,而且它比传统DEA多解决了一个关键问题——松弛变量。

我用一个生活化的类比来解释松弛变量。假设有两个学生考试,A同学数学考90分、语文考90分,B同学数学考100分、语文考80分。如果只看总分,两人都是180分,传统DEA可能认为他们效率一样。但实际上A同学语文还有10分的提升空间,B同学数学已经满分但语文有20分的提升空间,这个“提升空间”就是松弛变量。SBM-DEA会把这种可改进的余地直接算进效率值里,所以A和B的效率值会被区分开。放到绿色创新场景里,这意味着:一个地区可能绿色专利产出很高,但研发人员投入冗余严重,SBM-DEA会把这种“高产出伴随高浪费”的情况如实反映出来,而不是简单给个高分。

2.2 为什么绿色创新和绿色投资要分开测算

标题里把“绿色创新效率”和“绿色投资效率”并列,这不是凑字数,而是两个投入产出逻辑完全不同的过程。绿色创新效率关注的是“研发资源投入转化为绿色技术产出”的过程,典型投入是R&D人员、R&D经费、能源消耗,典型产出是绿色专利数量、新产品销售收入,非期望产出可能是污染物排放。绿色投资效率关注的是“资金投入转化为绿色经济产出”的过程,典型投入是环保投资额、绿色信贷余额、固定资产投资,典型产出是单位GDP能耗下降率、绿色产业产值。

这两个过程如果混在一个模型里,投入产出对应关系会乱掉,算出来的效率值没有解释力。所以标准做法是建两个独立的SBM-DEA模型,分别测算,最后把两组效率值作为两个变量放进后续的面板回归里。这一点在代码实现上体现为两套投入产出矩阵,我在第三节会给出具体的指标清单和矩阵组织方式。

2.3 面板数据下SBM-DEA的两种处理路线

面板数据做DEA有一个绕不开的选择:是把所有年份的数据混在一起算一个全局前沿面,还是每年单独算一个当期前沿面。两种路线各有适用场景,我做一个对照表方便你判断。

路线做法优势劣势适用场景
全局前沿面所有年份所有DMU放在一个参考集里效率值跨年可比,能反映长期趋势早期年份可能被后期技术进步“压低”效率值关注效率随时间演变规律
当期前沿面每年单独构建前沿面反映当年相对效率,不受其他年份干扰跨年不可比,只能做组内比较关注某一年内的区域对标

我的建议是:如果你的研究问题是“绿色创新效率在过去十年是升是降”,用全局前沿面;如果是“某一年各省份谁排前面”,用当期前沿面。代码里我把两种路线都封装成了可切换的参数,你改一个开关就能跑。实测下来,全局前沿面在Stata里跑收敛更稳,当期前沿面在DMU数量较少(少于投入产出指标数之和的三倍)时容易出现大量效率值为1的情况,这一点后面排查章节会细说。

3. 指标选取与数据组织:决定成败的隐形环节

3.1 投入产出指标怎么选才站得住脚

指标选取是整套流程里最容易被审稿人挑刺的地方,也是最考验领域理解的地方。我按绿色创新和绿色投资两条线分别列一份经过实践检验的指标清单,你可以根据数据可得性做替换,但替换时要想清楚逻辑对应关系。

绿色创新效率的指标体系:

  • 投入端:R&D人员全时当量(人年)、R&D经费内部支出(万元)、能源消费总量(万吨标准煤)。前两个是创新活动的标准投入,第三个是绿色创新区别于一般创新的关键——绿色创新要受能源约束。
  • 期望产出:绿色专利申请量(件)、绿色专利授权量(件)、新产品销售收入中绿色产品占比折算额(万元)。专利数量反映技术产出,销售收入反映市场化产出。
  • 非期望产出:工业废水排放量(万吨)、工业二氧化硫排放量(吨)。这两个是绿色创新场景下最常用的环境负外部性指标。

绿色投资效率的指标体系:

  • 投入端:环境污染治理投资额(亿元)、绿色信贷余额(亿元)、城市维护建设资金中绿化投入(亿元)。三个指标分别对应企业端、金融端、政府端的绿色资金投入。
  • 期望产出:单位GDP能耗下降率(%)、绿色产业增加值(亿元)、建成区绿化覆盖率(%)。分别对应节能效果、产业效果、生态效果。
  • 非期望产出:一般工业固体废物产生量(万吨)。投资活动如果只带来产值增长却伴随固废增加,效率要打折。

注意:投入产出指标的数量有一个经验约束——DMU数量应不少于投入指标数加产出指标数之和的三倍。如果你只有20个地区,投入3个加产出3个共6个指标,20除以6约等于3.3,刚好卡在临界线上,这时候跑出来的效率值区分度会比较差。解决办法要么减少指标(用主成分或熵值法合成),要么扩大DMU范围(比如细化到地级市)。

3.2 面板数据的格式要求与清洗要点

Stata跑SBM-DEA对数据格式有硬性要求:必须是平衡面板,每个DMU在每个年份都有完整记录,缺失值会导致前沿面构建失败。我整理了一份数据清洗检查清单,按顺序执行:

  1. 确认DMU编码唯一且连续,比如用省份代码1到30,不要出现跳号。
  2. 确认年份连续,中间不能断年,如果有断年要么插值补齐要么剔除该DMU。
  3. 检查负值和零值。DEA模型要求投入产出数据非负,如果某个指标出现零值,常规做法是加一个极小值(如0.0001)平移,但要在论文里说明处理方式。
  4. 检查量纲差异。R&D经费是万元级别,专利是件级别,量纲差距过大会影响数值稳定性。我的做法是对所有指标做极差标准化到[0,1]区间,但注意标准化后零值问题会更突出,所以标准化后统一加0.0001。
  5. 非期望产出的处理。SBM-DEA处理非期望产出有两种方式:一是把它当投入处理(因为越少越好),二是用方向距离函数。代码里我默认用“当投入处理”的简化方式,因为实现简单且结果稳健,如果你要发高水平期刊,可以切换到方向距离函数版本。

数据清洗这一步我踩过最深的坑是:某年份某个地区的绿色信贷余额缺失,我直接用线性插值补了,结果那一年该地区的效率值异常高,排查了半天才发现是插值把投入端压低了,导致效率虚高。后来我改成用前后两年均值填补,并在稳健性检验里剔除该地区重跑,结论才稳下来。所以缺失值处理方式一定要在论文里交代清楚,并且做敏感性分析。

3.3 数据来源的合规表述

数据来源这块我只说方法不说具体出处,你按自己研究场景对应即可。绿色专利数据一般来自专利数据库的IPC绿色清单筛选,R&D数据来自科技统计年鉴类资料,环境排放数据来自环境统计类资料,绿色信贷数据来自金融统计类资料。所有数据在论文里要注明来源和口径,尤其是专利的“申请量”和“授权量”不要混用,申请量反映创新活跃度,授权量反映创新质量,选哪个取决于你的研究假设。

4. Stata代码实现:从数据导入到效率值输出

4.1 环境准备与命令安装

Stata做SBM-DEA不是内置命令,需要安装外部包。我实测下来最稳定的是sbmeff和dea两个命令的组合使用,前者算SBM效率,后者做辅助的前沿面构建。安装方式如下:

ssc install sbmeff, replace ssc install dea, replace ssc install winsor2, replace

winsor2是用来做缩尾处理的,效率值算出来之后如果有极端值(比如接近0或接近1的异常点),缩尾能提升后续回归的稳健性。安装完建议先跑一个help sbmeff看看语法,不同版本的参数名可能有细微差异。

4.2 数据导入与预处理代码

假设你的原始数据是Excel格式,变量命名规范为:dmucode(DMU编码)、year(年份)、rd_person(R&D人员)、rd_fund(R&D经费)、energy(能源消费)、green_patent(绿色专利)、green_income(绿色收入)、waste_water(废水排放)、so2(二氧化硫排放)。导入和预处理代码如下:

import excel "green_efficiency_data.xlsx", firstrow clear xtset dmucode year * 检查平衡面板 xtdescribe * 负值检查与零值平移 foreach v of varlist rd_person energy green_patent waste_water so2 { summarize `v' replace `v' = `v' + 0.0001 if `v' <= 0 } * 极差标准化(按年份分组标准化,保留面板结构) foreach v of varlist rd_person rd_fund energy green_patent green_income waste_water so2 { bysort year: egen min_`v' = min(`v') bysort year: egen max_`v' = max(`v') gen std_`v' = (`v' - min_`v') / (max_`v' - min_`v') + 0.0001 drop min_`v' max_`v' }

这里解释两个关键操作。第一,零值平移加0.0001而不是加1,是因为标准化后数据在[0,1]区间,加1会严重扭曲相对关系。第二,按年份分组标准化而不是全样本标准化,是为了保留年份间的可比性,如果你用全局前沿面路线,可以改成全样本标准化,但要在论文里说明。

4.3 绿色创新效率的SBM测算

绿色创新效率的投入变量是std_rd_person、std_rd_fund、std_energy,期望产出是std_green_patent、std_green_income,非期望产出是std_waste_water、std_so2。代码实现:

* 绿色创新效率 - 全局前沿面版本 sbmeff std_green_patent std_green_income = std_rd_person std_rd_fund std_energy, /// undesirable(std_waste_water std_so2) rts(vrs) /// saving(green_innov_eff) /// global * 绿色创新效率 - 当期前沿面版本(逐年循环) gen green_innov_eff_yr = . levelsof year, local(years) foreach y of local years { preserve keep if year == `y' sbmeff std_green_patent std_green_income = std_rd_person std_rd_fund std_energy, /// undesirable(std_waste_water std_so2) rts(vrs) saving(temp_eff) restore replace green_innov_eff_yr = temp_eff if year == `y' capture drop temp_eff }

参数选择说明:rts(vrs)表示规模报酬可变,这是效率测算的常规选择,因为现实中DMU很难都在最优规模上运行;如果你要算纯技术效率剔除规模因素,用vrs,如果要算综合技术效率,改成rts(crs)。undesirable()里放非期望产出,顺序要和产出变量对应。saving()指定效率值的保存变量名。

4.4 绿色投资效率的SBM测算

绿色投资效率的投入是std_env_invest(环保投资)、std_green_credit(绿色信贷)、std_green_gov(政府绿化投入),期望产出是std_energy_intensity(能耗下降率)、std_green_industry(绿色产业增加值)、std_green_cover(绿化覆盖率),非期望产出是std_solid_waste(固废产生量)。代码结构与上面完全一致,只改变量名:

sbmeff std_energy_intensity std_green_industry std_green_cover = /// std_env_invest std_green_credit std_green_gov, /// undesirable(std_solid_waste) rts(vrs) /// saving(green_invest_eff) global

跑完之后用summarize green_innov_eff green_invest_eff, detail看分布。正常情况下效率值应该在0.3到0.95之间分布,如果出现大量1.000,说明DMU数量相对指标数太少,或者指标间相关性过高导致前沿面退化,排查方法见下一节。

4.5 效率值的后续处理与导出

效率值算出来不能直接扔进回归,要做三件事。第一,缩尾处理极端值:

winsor2 green_innov_eff green_invest_eff, cuts(1 99) replace

第二,生成效率值的滞后项和变化率,用于动态分析:

xtset dmucode year gen L_green_innov_eff = L.green_innov_eff gen d_green_innov_eff = D.green_innov_eff

第三,导出成Excel供论文附表使用:

export excel dmucode year green_innov_eff green_invest_eff /// using "efficiency_results.xlsx", firstrow(variables) replace

5. 常见问题与排查技巧实录

5.1 效率值全是1或者大量为1怎么办

这是最高频的问题,我至少被问过几十次。原因通常有三个:DMU数量太少、指标数量太多、指标间高度共线。排查顺序如下。先数一下DMU数量和指标数量,如果DMU数小于指标数乘3,优先减少指标,用熵值法把多个投入合成一个综合投入。如果数量够但还是一堆1,跑一下指标间的相关系数矩阵,相关系数超过0.9的指标保留一个即可。最后检查是不是用了当期前沿面且某年DMU特别少,换成全局前沿面通常能缓解。

5.2 效率值异常低(低于0.1)是什么信号

效率值普遍偏低不一定是模型错了,可能是你的DMU里存在“超级低效”的个体拉低了前沿面。先看是少数几个DMU特别低还是整体都低。如果是少数几个,检查这几个DMU的数据是不是有录入错误或者量纲不一致。如果是整体都低,说明你的投入产出结构里存在系统性冗余,这本身可能就是一个有价值的研究发现,不要急着删数据。

5.3 非期望产出的方向设反了会怎样

非期望产出如果误设为期望产出(即认为越多越好),算出来的效率值会完全失去经济含义,而且往往会出现效率值与污染排放正相关的荒谬结果。检验方法很简单:算完之后跑一个效率值和非期望产出的相关系数,如果显著正相关,大概率是方向设反了。代码里undesirable()选项一定要确认非期望产出变量都放进去了。

5.4 面板不平衡导致命令报错

sbmeff命令对缺失值非常敏感,不平衡面板会直接报错或者静默丢弃观测。排查方法:跑xtdescribe看面板结构,用misstable summarize看缺失分布。如果缺失比例低于5%,可以用均值填补;如果高于20%,建议剔除该DMU或者缩短时间窗口。我个人的经验是宁可缩短年份范围也不要大量插值,插值引入的人为信息会污染效率值。

5.5 常见问题速查表

现象最可能原因排查动作解决方式
效率值大量为1DMU数不足或指标共线数DMU数、算相关系数减指标或扩DMU
效率值普遍低于0.1存在极端低效个体看效率值分布检查数据录入
命令报错“not sorted”面板未设定或排序错乱跑xtset检查重新xtset并sort
效率值与预期相反非期望产出方向设反算相关系数检查undesirable选项
结果每次跑不一样未设定随机种子或版本差异记录Stata版本固定版本重跑

提示:每次跑完模型,把Stata的log文件保存下来,命令用log using "run_log.smcl", replace开启。效率测算涉及大量参数,回头复现时log文件能帮你省下大量时间。

6. 我在这套流程里踩过的坑与实操心得

第一个坑是关于标准化的时机。我一开始是先标准化再算效率,后来发现标准化会把不同年份的量纲差异抹平,导致全局前沿面下早期年份的效率值被高估。后来改成先算效率再对效率值做缩尾,指标层面只做零值平移不做标准化,结果反而更符合经济直觉。这个取舍没有绝对对错,取决于你的研究问题,但一定要在论文里交代清楚。

第二个坑是关于规模报酬的设定。默认用vrs看起来稳妥,但如果你的研究对象是政策冲击下的效率变化,crs可能更合适,因为政策往往同时改变规模和技术。我的做法是两个都跑,把crs结果放正文、vrs结果放稳健性检验,审稿人一般不会有意见。

第三个心得是关于代码的可复现性。效率测算的参数很多,我建议你把所有参数写成一个do文件开头的local宏,比如local rts_option "vrs",后面统一引用,这样换参数只改一处,不会漏改。另外,每次跑之前用set seed 12345固定随机种子(虽然SBM-DEA本身是确定性的,但如果你后续做bootstrap推断就需要)。

最后一个实用技巧:效率值算出来之后,先画一张核密度图看分布形态。如果分布是双峰的,说明你的DMU可能存在明显的分组特征(比如东部和中西部),这时候直接做全样本回归可能掩盖异质性,考虑分样本或者加分组虚拟变量。这个动作花不了五分钟,但能帮你提前发现很多问题。

返回列表