多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

DEA模型在Stata中的实现:从CCR到Malmquist实操指南

DEA模型在Stata中的实现:从CCR到Malmquist实操指南 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期到t1期的全要素生产率变化并且把这种变化分解为“效率变化”和“技术变化”两部分。效率变化是说追赶前沿的能力提高了没有技术变化是说起前沿本身往前移动了多少。* 假设面板数据已经按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/ExcelStata窗口里的表格不利于直接写报告我一般用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/MalmquistStata完全够用。遇到需要网络DEA、动态DEA这类高级模型时再考虑切到MaxDEA或者DEAP也没必要一开始就追求复杂工具。效率分析这件事先跑稳经典模型把指标和数据理清楚比会用十个高级模型都管用。
返回列表