1. 核心概念与模型选型:搞懂DEA家族
1.1 DEA到底在测什么:别再只背公式不落地
先聊点实在的。大家做效率评价,手头往往是一批决策单元(DMU),比如同一家银行的不同网点、同一省份的不同医院、同一行业里的不同企业。你想知道哪个单元“表现好”、哪个“拖后腿”,光看单指标容易误判——毕竟有的单位是投入少但产出也少,有的是投入大但产出也大,怎么比才算公平?DEA干的事情就是给每个单元算一个综合效率得分,回答“在同样的产出水平下,谁用的投入最少”或者“在同样的投入水平下,谁的产出最多”。
很多人第一次接触DEA,容易被“数据包络分析”这个名字吓住。其实拆开看很直白:数据,就是你的投入产出指标;包络,就是根据所有样本的投入产出组合,画出一条“前沿面”把所有点都包在里头;分析,就是看每个单元离这条前沿面有多远。离得越近,效率越高;离得越远,说明还有改进空间。这样就能回避人为设定权重的问题,也不需要假设具体的生产函数形式,所以特别适合多投入多产出的效率评价场景。
我自己的体会是,DEA最吸引人的地方在于它是“以数据说话”:不需要预先指定权重,也不用假设投入和产出之间有某种固定的数学关系。对于很多政策评估和高管决策来说,这种“黑箱”属性反而成了优势——你只需要提供客观的投入产出数据,就能得到一个相对客观的效率排序。但反过来,DEA对数据质量极其敏感,指标选得不好、方向搞反了,结果很容易离谱,这也是为什么我后面专门花大篇幅讲数据预处理。
1.2 四大主流模型的适用场景对比
DEA发展了半个世纪,模型迭代出了好多版本,但实际做研究、写论文、做咨询,绝大多数场景跑不出这四类模型:CCR、BCC、SBM和超效率模型,外加一个常跟面板数据绑定的Malmquist指数。它们之间的关系,我建议你用一句话记住:
CCR假设所有单元都在最优规模下运营,BCC放宽了这个假设,SBM关注的是“松弛改进量”,超效率则是把那些已经得满分的单元再排个名次。
下面这个表格可以帮你快速选型:
| 模型 | 规模报酬假设 | 是否径向 | 核心产出 | 典型使用场景 |
|---|---|---|---|---|
| CCR | 规模报酬不变 | 是 | 技术效率 | 测算综合技术效率 |
| BCC | 规模报酬可变 | 是 | 纯技术效率+规模效率 | 分析规模是否最优 |
| SBM | 可变 | 否(非径向) | 考虑松弛变量的效率值 | 投入产出存在冗余 |
| 超效率 | 可变/不变 | 视设定 | 区分有效单元 | 对效率=1的样本再排序 |
| Malmquist | 面板 | 视设定 | 全要素生产率变化 | 跨期动态分析 |
选模型的时候,最常踩的坑是把CCR和BCC混为一谈。CCR算出来的效率叫综合技术效率,它包含了一部分由规模因素带来的影响;BCC剥离了规模影响,给出的是纯技术效率。后者算出来的得分一般不低于前者。两者之比,就是规模效率。如果你发现某个决策单元CCR得分低、但BCC得分接近1,那问题多半出在规模上——要么规模太大,要么太小,都可能导致规模无效率。
另一个容易忽略的点是“径向”和“非径向”的区别。传统CCR/BCC属于径向模型,意思是所有投入同比例缩减;但现实里往往只有某一种投入过剩、其他投入正好,这时候径向模型会低估无效率的程度。SBM模型把松弛变量直接放进目标函数,能抓住更细的改进空间。所以如果某个指标冗余特别突出,建议优先考虑SBM。
2. Stata环境准备与数据规范:动手前必做的三件事
2.1 安装命令:从一个坑说起
Stata官方仓库里本身不带DEA模块,需要先安装第三方命令。很多新手在这里就摔了一跤——直接在命令窗口敲ssc install dea报错,理由往往是网络问题。我的经验是,用ssc install之前,先执行一次ssc hot检查下仓库连通性,或者直接设置镜像源。
* 如果没有安装过,先装dea命令包 ssc install dea * 如果需要面板数据分析,安装malmq命令 ssc install malmq * 推荐同时安装结果导出工具,方便整理到Word/Excel ssc install estout装完之后,可以用help dea查看官方帮助文件,确认版本是否正常。版本不一致可能导致后续结果对不上,建议统一环境。
提示:Stata版本最好10.0以上,个别命令需要16.0以上才支持。写代码前先
version看一下,免得因为版本差异报莫名其妙的问题。
2.2 数据面板结构:指标方向、缺失值、量纲处理
DEA对数据格式有一些“硬性”要求。首先,所有投入产出指标必须是数值型,方向必须符合经济学直觉:投入是指成本类、消耗类指标,产出是收益类、成果类指标。方向反了,效率值出来就是错的。其次,DEA属于非参数方法,对异常值比较敏感,数据录入前务必做描述性统计,看看有没有极端值或明显错误。
量纲问题几乎是新手必踩的坑。DEA有一个很好的性质,就是结果不受投入产出指标的量纲影响——即便你的投入单位是“万元”,产出单位是“人次”,也不会改变效率值。但请注意,这不代表你可以不处理量纲差异。如果某个变量的数量级和其他变量差异过大(比如一个变量是0到1之间的小数,另一个是几千万的大数),Stata在求解线性规划时可能出现数值稳定性问题。稳妥的做法是先把所有指标归一化,或者统一压缩到相近的数量级。
再说缺失值。DEA命令要求样本记录完整,一旦某条观测有缺失,整个DMU就可能被自动剔除。千万别默认为系统会自动处理,很多时候你的样本量莫名减少,问题就出在这儿。最好在跑模型前,用misstable检查一遍数据完整性。
* 数据初步检查 misstable summarize * 如需标准化处理 foreach v of varlist x1 x2 y1 y2 { egen temp_min = min(`v') egen temp_max = max(`v') gen `v'_std = (`v' - temp_min) / (temp_max - temp_min) drop temp_min temp_max }2.3 面板数据的前置整理:产业界最高频的“合并与 reshape”
做Malmquist指数分析时,需要把数据整理成面板形式,也就是每一行要能唯一确定“决策单元+时期”的组合。很多时候原始数据是宽格式:一行是一个单元,然后按年份横着排了多期。如果不做reshape,直接丢给Stata跑面板DEA,结果会乱套。
* 示例:将宽格式数据转换成长格式 reshape long x1 x2 y1 y2, i(dmu) j(year)reshape之后,再检查一下每个单元在每个时期是否都有完整的观测,形成平衡面板。非平衡面板不是不能跑,但解释结果时要格外小心,因为跨期比较的基准有可能不一致。
3. 四大核心模型的Stata代码实现:一步步照做即可
3.1 CCR和BCC模型:dea命令实操
这里我用一个真实的模拟数据来演示。假设你有10家医院,投入指标选了2个——床位数x1、医生数x2,产出指标也是2个——门诊人次y1、住院人次y2,跑CCR和BCC。
* 导入数据(示例) input dmu x1 x2 y1 y2 1 100 50 3000 1800 2 120 60 3500 2000 3 90 45 2800 1700 4 150 70 4000 2200 5 110 55 3200 1900 6 130 65 3800 2100 7 80 40 2500 1500 8 95 48 2900 1750 9 140 68 3900 2150 10 105 52 3100 1850 end * CCR模型:投入导向,规模报酬不变 dea y1 y2 = x1 x2, rts(crs) ort(in) stage(1) * BCC模型:投入导向,规模报酬可变 dea y1 y2 = x1 x2, rts(vrs) ort(in) stage(1)dea命令的基本语法是dea 产出变量 = 投入变量,核心选项有以下三个:
rts():设定规模报酬类型。crs表示不变规模报酬,vrs表示可变规模报酬,还有drs和irs分别表示递减、递增规模报酬。ort():设定导向。in表示投入导向,out表示产出导向。投入导向的意思是在产出不变的前提下,测算投入可以压缩的比例;产出导向则是在投入不变的前提下,测算产出可以扩张的比例。stage:设定运行阶段。stage(1)是标准DEA,部分扩展命令还支持两阶段分析。
BCC模型算完后,可以用CCR效率除以BCC效率,得到规模效率。Stata不会直接帮你除,但我们可以手动算:
* 保存CCR和BCC结果 dea y1 y2 = x1 x2, rts(crs) ort(in) stage(1) matrix te_crs = e(theta) dea y1 y2 = x1 x2, rts(vrs) ort(in) stage(1) matrix te_vrs = e(theta) * 计算规模效率 svmat te_crs, names(te_crs) svmat te_vrs, names(te_vrs) gen se = te_crs1 / te_vrs1 list dmu te_crs1 te_vrs1 se3.2 投入导向 vs 产出导向:到底该选哪一个
很多人问“投入导向还是产出导向?”,这个问题没有绝对答案,完全看场景。如果决策单元对投入的控制力更强,比如医院可以根据病人量调整床位和医生排班,采投入导向更合理;如果投入相对刚性、产出弹性更大,比如你没法减少投资额,但可以通过改进流程提高产值,那产出导向更合适。
实践中还有一个经验:当效率值差异不大时,两种导向得到的排名通常比较接近;但差异显著时,结果可能完全不同。稳妥的做法是两种都跑一遍,在论文里报告敏感性分析。如果你写的是应用型报告,建议主分析选一个导向,稳健性检验里放另一个导向的结果,这样评审不容易挑刺。
3.3 超效率模型:把有效单元“分出名次”
传统DEA模型有个“毛病”:所有效率值为1的决策单元都并列第一,你没法在它们之间再排序。这时候就需要超效率模型。它的思路是:评价某个有效单元时,先把这个单元本身从参考集里剔除,再考察它“远离前沿”的程度。效率值可能大于1,这正是我们想要的排名信息。
Stata里的dea命令不支持直接做超效率,需要借助独立的第三方命令或者高度定制的写法。常用的替代方案是用teradial等命令。此外,也可以配合Data Envelopment Analysis专用软件(如MaxDEA)跑超效率,再把结果导回Stata可视化。
* 安装超效率相关命令(部分环境不可用,则建议在MaxDEA中完成) ssc install teradial teradial y1 y2 = x1 x2, rts(vrs) ort(in) super需要注意,超效率模型存在“不可行解”问题,意思是有时候某个单元会算不出效率值,这在投入导向的VRS模型里尤为常见。遇到这种情况,不要慌,也不要用0去填充,应该改为产出导向再试,或者检查是否有异常值。
3.4 Malmquist指数:面板数据下的生产率波动
如果你有多年数据,光看静态效率就有点浪费了。Malmquist指数可以测度从t期到t+1期的全要素生产率变化,并且把这种变化分解为“效率变化”和“技术变化”两部分。效率变化是说追赶前沿的能力提高了没有;技术变化是说起前沿本身往前移动了多少。
* 假设面板数据已经按dmu和year排好 * y1 y2是产出,x1 x2是投入 malmq y1 y2 = x1 x2, dmu(dmu) year(year) ort(in) scale(vrs)malmq命令输出结果包含以下几个核心变量:
tfpch:全要素生产率变化指数,大于1表示生产率提升,小于1表示下降。effch:技术效率变化,可以继续分解为纯技术效率变化和规模效率变化。techch:技术进步变化,反映生产前沿面的移动。
用Malmquist时最容易犯的错误是直接把dea的结果和malmq的结果混在一起解释。记住,malmq是跨期相对变化,dea是当期绝对水平,两者的含义完全不同。还有就是对“技术变化指数大于1”的解读:它代表的是前沿面外移,并不直接等于某一家的技术创新能力提升了,更多是行业整体技术边界的移动。
4. 结果解读与论文输出:从数字到结论的关键一跳
4.1 结果表怎么看:效率值、排名、投影值
跑完模型后,Stata会生成几个结果矩阵,常用的是效率值矩阵e(theta)。得到这个值之后,建议大家配合以下几步做结果解读:
- 先看整体分布。效率值是否集中在1附近?如果几乎全是1,说明样本之间差异不大,DEA的区分度有限,可能要考虑换指标或者换模型。
- 再看偏低单元。效率值低于0.8的单元,一般是要重点关注的“问题户”。不妨回到原始数据看看,到底是什么投入过高,或者产出过低。
- 最后看标杆样本。效率值为1的单元,尤其是多次被参考的单元,就是其他样本学习的标杆。你可以使用
dea命令的stage(2)选项,得到改进目标值和松弛量。
* 两阶段分析:获取投入产出改进目标 dea y1 y2 = x1 x2, rts(vrs) ort(in) stage(2) matrix slack = e(slack) matrix target = e(target)输出slack矩阵表示优化后仍可改进的松弛量,target表示达到前沿所需的投入目标值或产出目标值。这些都是写政策建议时的直接素材。比如:“床位松弛量为12张,表明某医院在效率前沿下可削减12张床位而不影响现有服务量。”
4.2 如何把结果导出到Word/Excel
Stata窗口里的表格不利于直接写报告,我一般用estout或putexcel导出结果。
* 生成效率得分变量 svmat te_crs, names(te_crs) svmat te_vrs, names(te_vrs) gen se = te_crs1 / te_vrs1 * 整理并导出 export excel dmu te_crs1 te_vrs1 se using "DEA_results.xlsx", firstrow(variables) replace这里有个细节需要注意:svmat命名时如果已有同名变量,会自动加数字后缀,避免覆盖,但这也容易让变量名变成te_crs1、te_crs2这种不太直观的形式。建议导出前用rename重新命名。
4.3 画图辅助解释:效率分布与散点矩阵
DEA结果用表格看总归不够直观。我通常会画三类图:效率得分的箱线图、各年效率均值的折线图、以及投入产出指标的散点矩阵。
* 效率分布箱线图 graph box te_crs1 te_vrs1 se, legend(label(1 "综合效率") label(2 "纯技术效率") label(3 "规模效率")) * 按年份画均值走势 collapse (mean) te_crs1, by(year) twoway line te_crs1 year, xtitle("年份") ytitle("平均效率") name(plot1)画图的时候注意,DEA效率值被限定在0和1之间(超效率除外),所以纵坐标可以固定下来,方便不同图之间对比。
5. 常见错误与排查实录:踩过坑才知道的那些事
5.1 命令报错“variable not found”和“no observations”
这两个报错属于高频问题,分享下我自己的排查顺序:
- “variable not found”大概率是变量名打错了,尤其注意Stata对大小写敏感。你需要
describe一下确认字段名,而不是凭记忆敲命令。 - “no observations”往往是被
if条件或者by前缀过滤得只剩0行记录了。我的建议是把条件拆开逐条验证,别一口气写很复杂的限制条件。
5.2 效率值全是1或差异极小怎么办
如果你的DEA结果跑出来效率值几乎都贴近1,先别高兴,这并不代表所有样本都优秀,很可能是指标选择出了问题。常见原因有三种:投入产出指标太少、样本量太小,或者指标之间严重相关。DEA的区分度依赖样本和指标的相对数量,经验上DMU数量至少应是指标数量的3倍,否则结果缺乏区分度。
如果确实是数据限制,可以考虑减少指标数量,或者改用SBM模型。SBM的非径向特性通常能在同样数据下给出更分散的效率值。
5.3 面板数据做Malmquist时总提示年份缺失
Malmquist对面板结构要求很严,经常出现“panel not strongly balanced”的提示。这时候先用xtset dmu year声明面板,再用xtdes检查平衡性。如果发现有些单元在个别年份缺失,可以按单元做组内插补,或者直接剔除不完整单元。千万别让缺失值一直在数据里挂着,会让结果基准不统一。
5.4 快速查错表
| 症状 | 可能原因 | 排查方法 |
|---|---|---|
| 报错 unknown function | 命令没安装或版本过旧 | 重新ssc install并help验证 |
| 效率值全部为1 | 指标过多/DMU过少 | 精简指标,或改用SBM模型 |
| 结果里有空白值 | 原始数据含缺失 | misstable summarize定位并处理 |
| Malmquist提示无法计算 | 面板不平衡 | xtset+ 检查平衡性 |
| 数值差异特别异常 | 极端值影响 | 描述性统计删异常,或做标准化 |
6. 用好DEA的几个避坑经验:给新手的干货建议
我做了几年效率评价,最大的体会是:DEA的真正难点不在软件操作,而在指标设计和结果解释。这里有几个我后来才想明白的点,分享给大家。
第一,指标不是越多越好。很多初学者恨不得把所有变量都塞进去,结果模型区分度急剧下降,因为指标一多,每个DMU都很容易找到自己在某个维度上是“有效”的证据。我一般建议投入和产出各选2-3个核心指标,宁缺毋滥。
第二,先做相关性检查。投入之间高度正相关、产出之间高度正相关,会让模型把冗余当成有效,导致效率值虚高。你可以用correlate看看变量间关系,如果某两个投入变量相关系数超过0.8,建议合并或者只保留一个。
第三,解释结果时回归业务。效率值只是一个协助做判断的参考,但最终还要落回到实际场景。某家医院效率低,是因为编制导致人力冗余,还是设备利用率不足,这需要回到现场去看数据背后的经营逻辑。DEA给你指了一个方向,但路怎么走,还得靠你对行业的理解。
第四,稳健性检验一定要做。换个导向、换套模型,看排名是否发生大的波动。只要核心结论不变,你的分析和建议才站得住脚。我在实际项目中,经常一口气跑CCR、BCC、SBM三种模型,然后对比三组效率值的一致性,最后写进报告里,评审基本不会再拿“模型设定问题”来质疑。
最后说一句关于Stata命令生态的事。DEA在Stata里的支持没有专用软件全面,但如果只是做常规的CCR/BCC/Malmquist,Stata完全够用。遇到需要网络DEA、动态DEA这类高级模型时,再考虑切到MaxDEA或者DEAP,也没必要一开始就追求复杂工具。效率分析这件事,先跑稳经典模型,把指标和数据理清楚,比会用十个高级模型都管用。