
前阵子帮一个课题组做区域制造业的效率评价甲方给的原始需求只有一句话我们想知道这几年企业到底有没有变好。这句话翻译成实际分析任务其实很难DEA数据包络分析能算出每家企业每年在行业内的相对效率但效率从0.72变成0.78可能是这家企业自己管理进步了也可能是行业里最强的企业退步了、整个技术前沿被拉低了。要真正回答有没有变好、好在哪里就得请出DEA-Malmquist指数模型。这篇文章我就把这个模型从理论到应用完整拆一遍包括它到底在算什么、动手前怎么准备数据和指标、用DEAP 2.1跑全流程的具体操作、结果怎么解读以及一堆只有实际跑过几轮数据才会踩到的坑。正在做效率评价课题的学生、给企业做绩效诊断的分析师或者单纯想搞清楚生产率变化怎么量化的人都可以直接对照这篇操作。1. 为什么截面DEA满足不了变化问题1.1 效率值只是某个年份的快照传统DEA解决的是同一时间里一群决策单元谁更有效的问题。拿最常见的投入导向CRS模型来说它做的事本质上是在一堆样本里找出一条生产前沿然后衡量每个决策单元距离这条前沿有多远。这个效率值是一个相对值最大值是1其他样本分布在0到1之间。问题在于这个值只属于某一年。你把2021年的数据放进去得到的是2021年这组样本的相对效率把2022年的数据放进去得到的是2022年的相对效率。两个年份的效率值没法直接相减因为计算它们时用的参照系不一样。2021年的前沿是2021年最好的企业定义的2022年的前沿是2022年最好的企业定义的前沿本身移动了哪怕一家企业两年里的投入产出完全一样算出来的效率值也可能不同。这就带来一个很实际的困惑。某家企业效率从0.72涨到0.78看起来是进步了但它可能是因为自己变得更好了也可能是因为行业里原本最强的企业掉下去了把前沿拉低了显得它离前沿更近了。这两种情况性质完全不同前者是内部改善后者是外部竞争环境变化。截面DEA没有办法区分这两件事。1.2 Malmquist指数补上了追赶和前沿移动两类信息DEA-Malmquist指数模型解决的就是跨期比较的问题。它把全要素生产率TFP的变化拆成两部分一部分是技术效率变化EFFCH衡量决策单元有没有向当期生产前沿追赶另一部分是技术进步变化TECHCH衡量生产前沿本身有没有向外移动也就是整个行业或样本群体的技术水平有没有提升。用大白话说EFFCH回答你离标杆更近还是更远了TECHCH回答标杆本身是不是更高了。一家企业的生产率上升可能是自己追上了标杆也可能是标杆被整体抬高了而它跟着受益更可能是两者同时发生。Malmquist指数的价值就在于把这两股力量拆开来看避免用一锅粥的效率值做决策。我经常用跑步来打比方。EFFCH是你在比赛里的名次变化TECHCH是世界纪录本身的刷新速度。名次没变但世界纪录在刷新说明整个项目的水平在提高名次提高了世界纪录没动说明是自己在变强。企业诊断、行业分析、政策评估里需要回答的问题大多落在这种区分上。1.3 适合用Malmquist的场景以及不适合的场景适合用Malmquist指数模型的场景有这几类一是生产率动态研究比如分析某行业近五年的全要素生产率是上升还是下降增长主要靠技术进步还是效率改善二是政策评估比如某个补贴政策实施前后受补贴企业的TFP变化趋势一看便知三是企业或机构的分板块诊断比如连锁企业各分公司的管理效率和规模效率变化四是区域经济分析比较不同地区全要素生产率的增长路径。不适合硬上的场景也有。最典型的是只有一年截面数据那就老老实实用传统DEA或者SFAMalmquist必须有至少两期数据才能算。另一种是数据口径变化很大的情况比如某年统计口径调整、指标定义变了这种数据算出来的跨期指数会失真而且很难察觉。还有一种是你主要想考察成本最小化或利润最大化那需要价格变量传统Malmquist指数只处理数量变量应该考虑成本Malmquist或利润Malmquist复杂度会高一个台阶。2. 距离函数与指数公式先弄懂再动手2.1 Shephard距离函数到底在度量什么Malmquist指数不是凭空发明的指标它的底层是Shephard距离函数。这个函数在不同教材里表述不一样但核心思想很直观给定一个生产可能集某个投入产出组合距离生产前沿还有多远。用产出导向来理解距离函数的值越大说明这个组合在当前技术水平下还有越大的产出扩张空间值等于1说明它已经在前沿上无法在不增加投入的情况下继续增产。投入导向则反过来衡量在产出不变的情况下投入最多能压缩多大比例。DEAP里默认你可以选投入导向或产出导向实际研究里投入导向用得更多因为企业通常更关心产出不变的情况下怎么省投入。距离函数是跨期比较的基石。需要特别注意的是前沿可以来自不同时期用第1期的技术去评价第2期的投入产出组合和用第2期的技术去评价第1期的组合得到的结果含义完全不同。Malmquist指数的计算需要同时用到这几种跨期距离。2.2 为什么跨期变化要取几何平均如果只用某一个时期的前沿做参照会有一个方向性问题。用第1期的技术前沿去衡量两个时期的效率变化得到的结果可能和用第2期的技术前沿来衡量不一样因为两期前沿的位置和形状可能都变了。取单个时期做参照结论会被这个时期是否极端所左右。Färe等人在1994年给出的经典做法是取两期距离函数的几何平均。公式写出来是这样[ M_O(x^{t1}, y^{t1}, x^t, y^t) \sqrt{ \frac{D_O^t(x^{t1}, y^{t1})}{D_O^t(x^t, y^t)} \times \frac{D_O^{t1}(x^{t1}, y^{t1})}{D_O^{t1}(x^t, y^t)} } ]其中(D_O^t(x^t, y^t))表示用第t期的技术前沿评价第t期的投入产出组合(D_O^t(x^{t1}, y^{t1}))表示用第t期的技术前沿评价第t1期的组合以此类推。几何平均的好处是避免因参照期选择造成的系统性偏差让指数更中性。这里有个容易误解的点很多初学者以为Malmquist指数算的是自己和自己比。实际上它同时包含了自己和自己比和自己和前沿比两层含义。比如一家企业两期都在前沿上效率变化为1但两期前沿之间的移动可能不是1所以它的Malmquist指数仍然可以大于1或小于1。2.3 TFPCH、EFFCH、TECHCH、PECH、SECH的分解链DEAP输出结果里的核心概念有以下五个TFPCH全要素生产率变化指数即Malmquist指数的最终值。大于1说明生产率提升小于1说明下降。EFFCH技术效率变化衡量决策单元向当期前沿追赶的程度。大于1说明相对位置变好。TECHCH技术进步变化衡量生产前沿本身的移动。大于1说明技术前沿外移也就是整体技术水平提升。PECH纯技术效率变化在规模报酬可变VRS假设下计算的效率变化反映纯管理水平的改善。SECH规模效率变化反映规模收益状态的变化。它们的关系是TFPCH EFFCH × TECHCH而EFFCH PECH × SECH。所以完整展开就是TFPCH PECH × SECH × TECHCH。很多论文里直接报告EFFCH和TECHCH就够了但如果想深入分析效率变化究竟来自管理改善还是规模调整就需要看PECH和SECH。比如EFFCH提升但PECH没动SECH提升说明效率改善主要靠规模效应而不是管理水平真的提高了。这两种结论对企业决策的意义差别很大。2.4 DEAP输出里最容易看懵的一行数字我拿一个实际会出现的输出片段来举例假设某企业第1期到第2期的结果是这样的firmyeareffchtechchpechsechtfpch121.0501.1001.0201.0291.155先验证数字关系1.02 × 1.029 ≈ 1.051.05 × 1.10 1.155。这行数字翻译成人话就是这家企业从第1期到第2期纯技术效率提升了2%规模效率提升了2.9%两者合起来技术效率提升5%同时行业技术前沿前移了10%最终全要素生产率提升了15.5%。这个例子特别能说明问题。如果只看传统DEA效率你可能只知道这家企业效率提升了5%但Malmquist告诉你真正的生产率提升有15.5%其中大部分来自行业技术进步带来的红利。反过来有的企业TFPCH大于1但EFFCH小于1说明整个行业技术在进步这家企业却在掉队只是被行业上升的潮水托着走。这类发现是截面DEA给不了的。3. 动手算之前先解决指标、数据与工具选型3.1 投入产出指标的数量界限与等张性DEA对指标数量极其敏感。样本量不变时指标越多区分度越差到最后每个决策单元都可能是有效的这叫维数诅咒。业界常用的经验法则是决策单元数量至少是投入与产出指标数量之和的3倍以上。假设你有5个投入、3个产出指标总数是8样本至少要24个越多越好。指标之间还要满足等张性也就是投入增加不应该导致产出减少。选指标时可以做一个相关分析剔除与产出明显负相关的投入项。有些课题组喜欢把能拿到的数据全塞进去结果一堆企业效率都是1然后开始怀疑模型有问题。其实问题往往出在指标太多样品被稀释掉了。我个人的建议是投入指标控制在2到4个产出指标控制在1到3个核心逻辑是该模型解决什么问题就放什么指标。比如做制造业企业效率评价投入可以选总资产、员工人数或营业成本产出可以选营业收入或工业总产值。指标数量不是多多益善而是在覆盖关键维度的前提下越少越稳。3.2 DEAP面板数据的排列顺序最容易翻车的地方DEAP 2.1读取Malmquist数据时有一个硬性要求数据必须先是第1期所有决策单元再是第2期所有决策单元依此类推。每个决策单元内部先按产出指标排列再按投入指标排列排列顺序必须和指令文件里设定的产出数、投入数完全一致。新手最容易犯的错误是把数据按每个决策单元的所有时期排列也就是先放企业A的第1、2、3期再放企业B的第1、2、3期。这种排列在传统面板模型里没问题但在DEAP里会直接导致结果错乱而且程序不报错。你看到的结果看起来有模有样实际上是拿错位数据算出来的非常隐蔽。正确的排列结构是这样第1期企业1的产出1、产出2、投入1、投入2企业2的产出1、产出2、投入1、投入2……企业N第2期企业1的产出1、产出2、投入1、投入2企业2的……企业N第3期依次类推每一期的企业顺序必须保持一致。第1期的第5个是企业E第2期的第5个也必须是企业E否则两期之间的变化就完全对不上了。3.3 零值、负数和量纲问题DEA模型基于比例关系计算对数据的正负性很敏感。投入指标原则上必须是正数产出指标如果出现零值或负数计算距离函数时会出问题因为扩张比例在非正数上没办法定义。实际数据里产出为负的情况并不少见比如企业亏损时利润为负。处理办法通常是对该指标做平移处理把整个序列加一个常数让最小值为正。需要注意平移会影响效率值的绝对大小所以论文里如果用了平移一定要在方法部分写清楚。另一种思路是换一个不会出现负数的产出指标比如用毛利率或产量代替利润能避免就很省事。量纲问题倒是相对简单。DEA具有单位不变性同一个指标统一单位就行不需要做标准化或无量纲化。比如产出用万元还是亿元不影响效率值。这一点和很多机器学习模型完全不同不需要画蛇添足去归一化。3.4 常用工具怎么选做Malmquist指数的工具不少我列一个常用对比表工具上手难度费用核心优势需要注意DEAP 2.1低免费学术界认可度高输出规范无图形界面需手动整理数据MaxDEA中商业试用支持超效率、SBM、非期望产出等扩展模型不同版本结果格式有差异RdeaR、Benchmarking等包中高免费可编程适合批量分析和二次开发需要会写R代码Stata第三方命令中高商业付费方便与计量模型结合需要额外安装命令日常做课题和写论文DEAP 2.1是最稳妥的选择原因有三免费、算法经典、结果文件可以直接贴到附录里。MaxDEA适合需要算超效率或SBM模型的情况因为DEAP不直接支持这些扩展。如果要做大规模模拟或Bootstrap那就直接用R脚本化以后改参数重跑非常方便。我自己的做法是标准结果用DEAP跑一份需要高级图表或者稳健性检验时再用R做补充。两者结果稍微有点差异是正常的关键要在论文里写清楚用的什么软件、什么版本、什么模型设定。4. DEAP 2.1跑通Malmquist的完整操作4.1 一个输入文件里同时装着指令和数据DEAP 2.1没有图形界面它靠一个纯文本文件同时存放运行指令和样本数据。运行时在命令行输入文件名程序读取这个文件里的配置跑完后把结果写到另一个文本文件里。这个文本文件通常用.dta作为扩展名但本质是纯文本用记事本或VS Code打开编辑都可以。先建一个工作目录把deap.exe和输入文件放一起。我这里以20家企业、3年数据、2个产出指标、2个投入指标的设置为例子文件名叫malm.dta。配置部分一共9行前两行是文件名信息后七行是模型参数。这个文件结构本身不难难的是很多人不知道前两行到底要填什么。看下面的示例就清楚了。4.2 指令文件的每一行到底该怎么填malm.dta malm-out.txt 20 3 2 2 0 0 2逐行解释第1行输入文件名也就是当前这个文件自己的名字DEAP用它来做程序内部标识。第2行输出文件名运行完成后结果会写入这个文件。第3行决策单元企业数量这里是20。第4行时期数这里是3也就是有3年的面板数据。第5行产出指标数量这里是2。第6行投入指标数量这里是2。第7行导向选择0表示投入导向1表示产出导向。第8行规模报酬假设0表示CRS1表示VRS。第9行模型类型0是普通DEA多阶段1是成本DEA2就是Malmquist-DEA这里填2。有两点要特别提醒第8行虽然可以填VRS但Malmquist指数的主流基准是CRSDEAP在CRS和VRS下都会输出PECH和SECH。如果没有特殊理由填0。第9行是最容易漏的地方默认模板经常是0忘了改成2跑出来的就是普通DEA而没有跨期分解结果。4.3 数据按时期-企业-投入产出排列配置部分写完以后从第10行开始就是数据。数据排列顺序遵循前面说的规则第1期的20家企业全部排完再排第2期的20家依次类推。每个企业的数据一行2个产出在前2个投入在后。我举个例子假设第1年第1家企业产出1是90、产出2是70、投入1是100、投入2是50那么数据部分就写90 70 100 50 85 68 95 52 ...每行代表一家企业空格隔开即可。20家企业3年总共60行数据。如果数据只有55行DEAP可能不会报错而是把紧接着的某行数据错位读取结果就废了。所以数据行数一定要自己核对企业数 × 时期数。这里再强调一次不要按企业-年份堆数据。DEAP对Malmquist的读取逻辑里时期是外层循环企业是内层循环。反过来的数据程序不会像Stata那样给你个报错提示它只会默默算出一个看似正常的结果。4.4 运行、报错和输出文件在Windows系统下直接双击deap.exe会弹出一个命令行窗口提示输入文件名。输入malm.dta或者不含扩展名的malm不同版本略有不同回车程序运行完会在同目录生成malm-out.txt。常见的异常情况有这么几种提示找不到文件多半是当前工作目录不对需要把deap.exe、malm.dta放在同一目录或者在命令行里先切换目录程序一闪而过可能是输入文件的编码有问题DEAP对UTF-8编码兼容性一般建议用记事本另存为ANSI编码还有一种是输出文件生成了但内容是空的或只有几行大概率是输入文件里数字之间混入了中文逗号或全角空格。跑通以后不要急着看结论先做一次数据校验随意挑一家企业检查它在输出结果里的效率值排序是否和直观判断一致。比如一家明显投入少产出多的企业效率不可能排到倒数。这一步虽然笨但能拦截掉大部分数据排列错误。5. 结果解读从数字到结论的翻译方法5.1 DEAP输出表的字段含义DEAP输出的Malmquist结果主要是一张按相邻年份比较的汇总表。输出文件里会依次出现每个年份对的逐企业结果然后是年度均值汇总最后是累计均值汇总。逐企业结果的字段是firm、year、effch、techch、pech、sech、tfpch。year2表示这是第1期到第2期的变化year3表示第2期到第3期的变化。每个企业一行每个年份对都会重复一次。年度均值汇总给出的是每一年所有企业指标的整体均值反映行业整体趋势。累计均值汇总则是以第1期为基期的累计变化反映整个考察期内的总变化。有一类输出在普通DEA结果里也有比如各年份的效率得分表。做Malmquist分析时如果你看到的是两期之间的变化表而不是每个时期的效率得分表那就说明模型设置对了。如果输出里只有效率得分没有变化指数回到指令文件检查第9行是不是填了2。5.2 大于1、等于1、小于1分别说明什么判断标准很直接指数等于1表示没有变化大于1表示改善小于1表示退步。具体到每个指标含义有差异EFFCH大于1决策单元相对前沿的位置变好了可能原因包括管理改善、资源重新配置、规模调整等。EFFCH小于1相对位置变差说明它离当期最优生产水平更远了需要警惕。TECHCH大于1生产前沿向外移动行业整体技术水平在提升小于1则说明技术前沿收缩行业整体在退步。PECH大于1在可变规模报酬下纯技术效率提升通常解释为管理或制度层面改善。SECH大于1规模效率改善说明企业规模收益状态变得更有利。实际解读时最值得关注的是EFFCH和TECHCH的组合关系。如果大部分企业TFPCH增长主要靠TECHCH而EFFCH普遍下降说明行业技术进步快但企业追赶速度没跟上马太效应在加剧。如果EFFCH高而TECHCH低说明行业整体技术升级乏力企业只能靠内部挖潜来维持增长这种增长有天花板。5.3 年度变化、累计变化与几何平均DEAP给出的年度指数反映的是相邻两期之间的变化。如果考察期有3年就会有2个年份对的指数。要计算整个考察期的累计变化不能用加法要用连乘。举个例子某企业3年的TFPCH分别是1.05、1.10、1.02三年累计变化就是(1.05 × 1.10 × 1.02) - 1 0.1781也就是17.81%。如果需要报告年均增长率用几何平均(1.05 × 1.10 × 1.02)^(1/3) - 1 ≈ 0.056约5.6%。这和算术平均值5.67%很接近但严谨的做法是几何平均因为指数本质上是比率比率连乘才是累计变化。DEAP输出里的cumulative means部分帮我们做了累计计算但我仍然建议自己手动复核一次特别是面板数据里个别企业缺失年份时程序退出或读取错位的情况会让累计值失真。5.4 怎么把结果画成能放进报告里的图光有数字表格还不够决策者看图的效率远高于看表。常用的可视化有这么几种按企业画柱状图横轴是企业纵轴是累计TFPCH或年均TFPCH直观比较谁强谁弱。按年份画折线图横轴是年份纵轴是年度均值看行业整体TFP趋势。EFFCH与TECHCH四象限图横轴为TECHCH纵轴为EFFCH用(1,1)点画十字线。右上角是效率提升技术进步双优区右下角是技术进步但效率下降说明技术升级了但企业没接住左上角是效率提升但技术退步典型吃老本型左下角是双下降危险区需要重点关注。四象限图我几乎每份报告都会用因为它能把几十家企业的动态变化压缩到一张图上管理层一眼就能看出哪些板块在引领、哪些板块在拖后腿。工具直接用Excel、R或Python的matplotlib都能画没必要为了画图专门学新软件。6. 实战避坑清单6.1 全部有效是最常见的假象跑完DEAP发现所有决策单元效率都是1这可能是真实现象但更可能是指标体系出了问题。最常见的原因是指标太多、样本太少导致每个企业在某个指标上都有相对优势DEA就区分不出来了。处理办法按优先级排序先精简指标砍掉高度相关或与业务逻辑关系弱的指标再扩大样本比如把单一行业扩展到相关行业群或者引入更多年份构成面板最后可以考虑改用超效率模型它能让有效决策单元之间也分出名次但注意超效率模型不适合直接替代传统效率值做政策结论。我在实际项目里遇到过一次全部有效当时一组数据有6个投入、4个产出样本才18个。砍掉2个投入、1个产出之后模型立刻有了区分度。指标精简不是丢信息而是让模型聚焦核心矛盾。6.2 CRS还是VRS主结果用哪个更稳妥围绕Malmquist指数到底用CRS还是VRS学术上讨论了很多年。Färe等人提出Malmquist指数时用的是CRS假设这是最标准的基准。CRS下计算出的Malmquist指数性质更干净分解出的TECHCH也更稳定。VRS模型允许规模报酬可变能进一步分解出PECH和SECH业务含义更丰富但VRS下前沿交叉现象更频繁导致跨期指数的几何平均容易出现异常值。我的建议是主结果用CRS下的Malmquist同时在附录里报告VRS下的分解结果。这样既守住方法论上的主流标准又能回答案审或领导关于规模效率的追问。如果你所在领域期刊普遍要求VRS分解那就以VRS为主但要做稳健性检验证明结论不因CRS/VRS选择而改变。6.3 为什么DEAP和MaxDEA结果差一点同一个数据用DEAP和MaxDEA跑出来的Malmquist指数有时会出现小数点后第二位的差异甚至个别企业趋势方向相反。这通常不是谁算错了而是背后的算法细节不同DEAP 2.1默认使用多阶段DEA方法会进一步处理投入产出的松弛量有些软件默认采用一阶段DEA或加性模型对无效率部分的处理方式不同。距离函数的具体数值在这种细节下自然会有差异。写论文时不要只写Malmquist指数要写清楚软件、版本、模型设定、导向、规模报酬假设。例如使用DEAP 2.1软件采用投入导向、CRS假设下的Malmquist指数方法。这句话看起来像套话但没有它你的结果别人根本无法复现。审稿人如果用MaxDEA复跑发现数字对不上就会产生质疑写清楚能省掉很多麻烦。6.4 平衡面板、缺失值和数据校验DEAP 2.1在处理Malmquist模型时要求平衡面板也就是说每个决策单元必须在每个时期都有数据。如果某家企业某年缺失通常只能做两个选择补齐或者把它从样本里剔除。插补方法可以用前后年份均值的简单插补但要在论文里说明如果缺失企业比例较高插补本身会成为模型结果的软肋不如直接放弃这些企业。数据校验我建议分三步做第一步核对数据行数是否等于企业数乘以时期数第二步抽查几个企业看各期数据是否维持相同顺序第三步跑一个最简单的CRS-DEA截面结果看看哪家企业效率是1是否符合业务直觉。这三步做完基本可以排除数据排列层面的错误。6.5 审稿人问显著性该怎么应对DEA本质上是确定性方法它本身不产生置信区间。Malmquist指数也没有现成的P值所以审稿人问到显著性时常规做法是做Bootstrap。但Malmquist的Bootstrap比截面DEA的Bootstrap复杂得多因为它要处理两期前沿之间的相关性重抽样方案设计不好会直接扭曲结果。如果确实需要显著性检验R里面有相关包可以尝试但也需要花时间理解重抽样逻辑。对于实际业务分析我更建议把精力放在稳定性检验上换一组指标、换一个导向、换CRS和VRS看核心结论的方向是否保持一致。稳定性检验做扎实了通常比一个Bootstrap的P值更有说服力。最后说一点我自己的体会。Malmquist模型最难的不是软件操作而是把生产率变化讲成一个能被业务听懂的故事。指标选得再好、软件跑得再顺如果最后只能说企业2的TFPCH是1.08那这份分析的价值就打折了。我习惯把结果落到三个问题上谁在追赶前沿谁在推动前沿谁在拖后腿。把这三个问题讲清楚一份效率评价报告才算真正闭环。希望这篇流程能帮你少走几段弯路。