资讯动态

DEA模型全解析:从CCR到Malmquist的Stata实操指南

发布时间:2026/10/5 3:49:45 来源:尧图企业网站定制
如果你最近在写效率测算、绩效评价或全要素生产率相关的内容大概率绕不开DEA数据包络分析Data Envelopment Analysis。我被问得最多的一句话就是“DEA模型到底怎么选Stata代码又该怎么写”所以这篇就把DEA各种模型的原理和实操一次性讲透从CCR、BCC、SBM、超效率到Malmquist指数配套Stata代码和结果解读新手可以直接抄作业有基础的人也能用来查漏补缺。1. 在动手写代码之前DEA模型的整体脉络1.1 DEA到底在测什么效率从生产前沿面说起先不急着上公式用大白话理解。DEA评价的是若干个“决策单元”DMU比如银行网点、医院、学校、物流仓库在多投入多产出条件下的相对效率。它不要求你预先假设生产函数也不需要价格或者成本数据而是通过线性规划在样本内构造出一条“最佳实践前沿面”说白了就是包络面。简单理解就是你的投入产出组合能在样本里“打败”多少同类单元效率分数就从0到1之间取一个值达到1说明你站在了前沿面上。为什么不用单指标比率比如人均产出、资产收益率因为这些指标只能反映某个侧面多个指标放在一起权重怎么定就成问题。DEA的高明之处在于权重不是人为主观指定的而是线性规划自动为每个DMU找到一组对它最有利的权重。这就是DEA在效率评价里特别受青睐的核心原因。1.2 模型家族地图从CCR到Malmquist该选哪个DEA并不是一个单一模型而是一整个模型家族。最常见的几个包括CCR、BCC、SBM、超效率DEA、Malmquist指数以及三阶段DEA。我先把这几种模型放在一张表里方便你对应选择。模型提出者/年份核心用途数据要求CCR模型Charnes, Cooper Rhodes, 1978规模报酬不变下的综合技术效率截面数据BCC模型Banker, Charnes Cooper, 1984规模报酬可变下的纯技术效率与规模效率截面数据SBM模型Tone, 2001非径向、直接处理投入产出松弛变量截面数据超效率DEAAndersen Petersen, 1993区分多个效率值同为1的有效DMU截面数据Malmquist指数Fare et al., 1994全要素生产率变动分解面板数据三阶段DEAFried et al., 2002剔除环境因素与随机噪声干扰面板或截面多步选模型没有绝对标准但我建议的决策路径是如果只看当期截面表现优先CCR和BCC一起跑如果发现有效DMU数量太多、排名拉不开就用超效率补一刀如果数据里有明显的环境和随机噪声需要剔除外部干扰就考虑三阶段DEA如果是连续多年面板数据想回答“效率是否提升了、提升来源是技术进步还是效率追赶”就上Malmquist指数。2. 不能只知道命令核心模型原理拆解2.1 CCR与BCC规模报酬的关键分水岭CCR模型假设规模报酬不变CRS它的线性规划形式是这样的min θ s.t. Σλj xij ≤ θ xi0, i 1,...,m Σλj yrj ≥ yr0, r 1,...,s λj ≥ 0, j 1,...,n这里θ就是被评价DMU的技术效率值x是投入y是产出λ是参考集权重。θ等于1说明该DMU位于前沿面上θ小于1说明存在投入压缩或产出扩张的空间。CCR的一个隐含假设是所有DMU都以相同规模报酬水平运行产出翻倍投入也翻倍这在现实中常常不成立。BCC模型在CCR基础上加了一个约束Σλj 1。这个约束看起来只是一个条件但它把“规模报酬可变”引入了模型。加了这个约束比较对象被限制在和被评价DMU规模相近的参考单元上。通常CCR算出来的效率叫综合技术效率TEBCC算出来的叫纯技术效率PTE二者的比值就是规模效率SE TE / PTE表示当前规模离最优生产规模的距离。我在实际项目里最常用的做法是CCR和BCC一起跑然后用SE判断每个DMU是纯技术问题还是规模问题。比如某银行网点TE是0.83PTE是0.96那SE就是0.86左右说明这个网点更大问题是规模没吃满不是内部运营效率太差。2.2 投入导向还是产出导向选错方向结论会完全不同DEA模型里有个很关键的选项投入导向Input-Oriented和产出导向Output-Oriented。投入导向回答的问题是“在产出不变的前提下投入还能压缩多少”产出导向回答的问题是“在投入不变的前提下产出还能扩张多少”。方向怎么选主要看决策单元对哪个变量更有控制权。比如制造型企业订单量是外部决定的短期内很难左右但材料、工时、成本是内部可以压缩的这种情况更适合投入导向。再比如医院门诊政府划拨的人员编制和床位相对刚性但可以想办法提升诊疗量、手术量这就是产出导向更合适。有个新手特别容易踩的坑是以为CRS下投入导向和产出导向结果一样就随便选一个方向。在CRS情况下投入导向效率值和产出导向效率值确实存在对应关系但如果你用的是VRS即BCC模型两种导向下的效率值是不一样的因为参考前沿随着方向不同而不同。论文写完后一定要在方法学部分明确写清楚用的是哪种导向否则审稿人看到结果会要求重跑。2.3 SBM与超效率径向模型的“近视”问题怎么破CCR和BCC都属于“径向”模型所谓径向就是假设所有投入或所有产出按同一比例缩减或扩张。这个假设在很多场景下太强了因为现实中未必所有指标都存在相同比例的冗余。SBM模型Slacks-Based Measure直接针对这个问题做了改进不需要等比例变动的假设目标函数直接包含松弛变量min ρ [1 - (1/m)Σsi-/xi0] / [1 (1/s)Σsr/yr0]这个式子直观来看分子衡量的是各项投入的平均冗余比例分母衡量的是各项产出的平均不足比例。SBM的效率值ρ同时惩罚投入冗余和产出不足因此比径向模型更容易发现“某个指标特别差但整体分数还说得过去”的问题。超效率DEA的出发点不太一样。径向模型下有效DMU的效率值都是1一大堆DMU都站在前沿面上没法继续排序。超效率的思想是把被评价DMU自己从前沿面里剔除再重新构造前沿然后看它的效率能超过1多少。效率值大于1说明即使把投入按比例再增加一部分这个DMU依然能维持相对有效因此超效率值可以理解为“有效程度的稳健性”。实际操作中我通常会在CCR结果后补一套超效率结果用来给那些效率值等于1的DMU排序。2.4 Malmquist与三阶段DEA面板数据和时间维度的进阶玩法前面几个模型都只适合截面数据如果手头有多期面板数据想回答“效率是否逐年提升”就需要Malmquist指数。它的核心思想是计算全要素生产率TFP的变动而这个变动可以拆成两个部分技术效率变化EC和技术进步变化TC。Malmquist指数的公式如下M [ (D^t(x^{t1}, y^{t1}) / D^t(x^t, y^t)) × (D^{t1}(x^{t1}, y^{t1}) / D^{t1}(x^t, y^t)) ]^(1/2)M大于1表示生产率在上升小于1表示下滑。EC大于1说明追赶效应明显即相比前沿面的相对距离在缩短TC大于1说明生产前沿面整体在向外移动。对很多管理学、经济学论文来说光看当期效率不够趋势更重要这就是Malmquist的价值所在。三阶段DEA稍微复杂一些它先把传统DEA得到的松弛变量拿出来用SFA随机前沿分析回归把外部环境变量和随机误差的影响剔除掉得到“净化后的投入或产出”然后再一次用DEA计算效率。这样得到的效率值就是剔除了环境噪声后的结果。Stata里做三阶段DEA没有一键命令通常需要结合dea命令和sfac命令逻辑并不难但步骤较繁琐适合需要控制外部环境差异的实证研究。3. Stata代码实现流水线式实操3.1 数据准备变量、样本量与数据清洗跑DEA之前数据整理往往比模型本身更容易让人卡住。数据结构必须是一行一个DMU各列分别放投入和产出变量。比如一项研究里有20家医院每家医院有2个投入指标员工数、床位数2个产出指标门诊量、住院量数据应该长这样医院编号员工数床位数门诊量住院量135012012000480022809598003900变量名不建议用中文不要以数字开头不要带空格。导入数据时常见的问题是Excel第一行的表头带空格Stata会自动把它改成_1之类的变量名变量名就会非常难用。建议一进Stata就先跑一下describe看看变量名。样本量方面经验法则是DMU数量至少不少于投入产出指标总数的3倍行业内也有人建议要用到max{3*(ms), m*s}其中m是投入数s是产出数。为什么强调这个因为DMU太少DEA有足够“自由度”让每个单元都显得有效结果就会失去区分度。如果你的样本只有15家银行但放了6个投入、4个产出我基本能猜到效率值九成以上都是0.9附近徘徊。数据清洗我一般这么处理* 查看变量结构 describe * 检查投入产出的描述性统计重点关注最大最小值、是否异常 summarize x1 x2 y1 y2, detail * 检查缺失值 misstable summarize如果有缺失值最简单的做法是drop if missing(x1)但前提是缺失比例很低。如果缺失比例较高直接删样本损失太大可以用replace x1 r(mean)填入均值但副作用是人为压低了该样本的变异建议结合领域知识判断实在不行就做敏感性分析分别报告删缺失和填补后的结果。3.2 安装Stata的DEA外部命令Stata自带的命令是没有DEA模型的需要从SSCStatistical Software Components安装社区命令。最常用的几个命令如下ssc install dea ssc install teradial ssc install sbmeff ssc install malmqdea是基础款径向DEA就够用了teradial功能更丰富支持Bootstrap纠偏sbmeff用来跑SBM模型malmq用来算Malmquist指数。安装完成后用which dea验证一下能显示文件路径就说明装好了。如果ssc install一直提示网络错误十有八九是Stata访问SSC服务器不稳定这也是很多人卡住的点。备选方案是浏览器直接打开SSC主页搜索命令包手动下载dea.ado和dea.sthlp文件放进个人ado目录。用sysdir查看Stata的ado路径一般把文件放到PERSONAL目录对应的文件夹下然后重启Stata就能识别。3.3 CCR/BCC模型代码一行命令跑出技术效率和规模效率数据准备好后以产出变量为y1、y2投入变量为x1、x2为例基础代码非常简单* 使用dea命令跑CCR模型投入导向规模报酬不变 dea y1 y2 x1 x2, rts(crs) ort(in) * 保存CCR效率值 generate te_crs te要注意这个语法是“产出列表在左边投入列表在右边”其中列表变量之间用空格隔开。运行完之后Stata会在数据里生成一个效率变量有的命令版本生成的是efficiency有的生成te建议直接跑完describe看新生成的变量名别想当然。BCC模型只需要把rts(crs)改成rts(vrs)* BCC模型规模报酬可变 dea y1 y2 x1 x2, rts(vrs) ort(in) * 保存纯技术效率并计算规模效率 generate te_vrs te generate se te_crs / te_vrs注意只有先跑完CRS和VRS两个模型才能计算规模效率SE。SE等于1说明规模最优小于1说明要么规模不足、要么规模过大。这个分解逻辑在很多论文里判定“效率损失主要来自纯技术还是规模”时非常实用。teradial命令的语法更接近现代写法teradial y1 y2 x1 x2, rts(vrs) ort(in)如果你想给效率值做一个Bootstrap纠偏teradial是更好的选择它对小样本效果不错。具体偏误校正的选项在不同版本里略有差异建议装好后先运行help teradial找到与Bootstrap重复次数相关的参数再根据自己的模拟次数调整。3.4 SBM模型和超效率模型的代码实现SBM模型需要使用sbmeff命令基本语法和dea类似但不需要指定投入导向或产出导向因为SBM本身已经直接处理投入和产出的松弛变量了。sbmeff y1 y2 x1 x2, rts(vrs)运行完会生成SBM效率值变量。实际项目中我会把CCR、BCC、SBM的结果放在一起比较如果某个DMU的径向效率值很高但SBM值明显偏低说明它的投入产出结构存在不均衡某个指标的松弛问题被径向模型掩盖了。超效率模型在Stata里的实现依赖于命令版本。部分版本的dea命令提供了超效率选项你可以先help dea查找“super”或“super-efficiency”关键字确认。如果当前版本不支持超效率我有两个替代做法一个是用teradial做Bootstrap后的效率排名替代部分超效率功能另一个是借用MaxDEA软件单独算超效率结果再回到Stata做后续回归只要在论文里说明软件来源即可。3.5 Malmquist指数的代码实现Malmquist指数要求面板数据结构先设定面板格式* id是决策单元编号year是年份 tsset id year * 计算Malmquist指数 malmq y1 y2 x1 x2, rts(crs)运行成功后结果里会产生一组新变量通常包括*_ec技术效率变化、*_tc技术进步、*_tfp全要素生产率变化。这三个值都是围绕1波动的指数大于1表示改善小于1表示退步。我在解读Malmquist结果时有个习惯会把结果导出到Excel再用透视表汇总成“各DMU各年份的TFP变化表”方便横向对比。一位审稿人曾问我为什么某银行TFP上升但TC却下降后来拆开数据才发现是那年金融环境整体下行技术前沿退步但个别银行效率追赶掩盖了这一点。这就是EC和TC分开解读的价值只看总和会丢掉很多信息。3.6 效率结果的导出与可视化DEA结果跑出来后建议立刻保存并导出避免Stata一关数据就丢失。导出的标准做法是export excel using dea_results.xlsx, firstrow(variables) replace可视化方面我最常用的三张图是效率分布直方图、按年份变化的折线图、以及效率值排名条形图。* 效率分布直方图 histogram te_crs, frequency title(综合技术效率分布) * 单个DMU效率随年份变化趋势先按id排序 twoway (connected te_crs year) if id 1, title(DMU1效率变化趋势)这三张图基本能支撑一篇论文的结果展示。效率分布直方图可以看出样本整体状态趋势图能展示动态变化排名条形图只需要sort te_crs加list就能实现。不建议把DEA前沿面的二维图硬画出来因为多投入多产出下前沿面是高维的容易画错反而误导读者。4. 常见问题与排查技巧实录4.1 效率值全是1或全是接近1结果还能用吗这个问题几乎每个第一次跑DEA的人都遇到过。效率值全部接近1原因不外乎三个样本量太小、指标数量太多、指标之间高度相关。DEA允许每个DMU找对自己最有利的权重如果指标很多但样本很少每个DMU都能找到一套权重让自己显得很优秀效率值自然就高。我的建议是先检查DMU数量是否达到指标总数的3倍以上不满足就先合并或删减指标。其次是观察指标相关性投入和投入之间如果是完全共线关系比如“员工数”和“管理者人数”高度相关保留一个即可。最后如果样本确实有限又必须用DEA可以同时报告SBM或超效率结果用非径向和可排序的模型增加区分度。4.2 命令报错module not found 或 变量未找到一些刚装完命令的用户跑dea时会直接提示module dea not found但which dea却又能显示路径。这通常是因为Stata在启动时没有重新加载ado文件最简单的方法是彻底重启Stata再试。另一种很常见的报错是variable __000001 not found这类以双下划线开头的报错通常来自命令内部运行产生的临时变量名冲突多半是数据里也有类似命名的变量或者某个变量名过长触发了Stata的底层限制。先describe检查原数据给所有变量重命名为短英文名比如x1、y1一般就能解决。4.3 面板数据的时间变量报错反复出现repeated time values做Malmquist指数时经常报错repeated time values within panel翻译过来就是“同一家单位在同一年出现了多行数据”。这很可能是因为Excel里数据格式不规范同一DMU同一年存在多条重复记录。排查和解决思路是* 查看重复情况 duplicates report id year * 如果有重复先判断保留规则再强制删除 duplicates drop id year, force * 重新设定面板 tsset id year顺带提醒一句Malmquist指数要求的是平衡面板也就是每个DMU每年都必须存在数据。如果某一年缺失效率变化值就难以计算需要提前用xtbalance搜索不平衡样本或者把缺失年份的样本整体剔除别硬着头皮算结果会非常诡异。4.4 DMU样本量不够会产生哪些“看起来没问题”的隐性错误样本量不足带来的问题未必会在报错中体现有时候结果看起来很正常但实际模型已经失真了。最典型的情况是每个DMU都等于1那是因为DEA参考集过小每个DMU都成了“孤岛”。更隐蔽的问题是某些DMU“恰好”位于两个以上前沿面的交叉区域导致效率值排序极不稳定稍微增删一个样本排名就天翻地覆。对这种隐性错误我的自检方法是做稳健性测试随机剔除一个DMU再重新跑看剩余样本的效率排名是否发生剧烈变化或者把某组指标换掉后重新估计看关键结论是否仍然稳定。如果排名波动很大说明数据或模型欠稳健这时候与其继续加指标不如精简模型让DEA有足够的信息去鉴别有效和无效单元。另外把投入和产出放反也会得到看似正常但毫无意义的结果因为DEA会自我调整权重让每个DMU尽量好看。建议跑完后做一次“指标互换”测试把投入和产出位置对调如果效率值仍然很高说明模型里可能存在变量方向设定错误或者该样本本身投入产出结构就是不合理的。我自己的习惯是任何一批DEA结果跑出来先不看数字先画一张效率分布直方图再看有没有单位落在“看起来不合理”的位置。效率测算只是第一步更重要是对低效率单元做投入冗余分析、对高绩效单元做经验提炼这样才能让模型结果真正落地。跑DEA这份活最怕的不是代码报错而是出了结果就停手不去追问结果背后的经济含义。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑