1. 非期望超效率SBM模型概述
非期望超效率SBM(Slacks-Based Measure)模型是数据包络分析(DEA)方法中的一种重要扩展模型,它能够同时考虑期望产出和非期望产出,并测量决策单元(DMU)的相对效率。与传统DEA模型相比,该模型具有两个显著特点:
- 能够处理投入和产出的松弛变量问题
- 可以评估效率值超过1的超效率情况
这种模型特别适用于存在"坏产出"(如污染物排放、医疗失误等)的效率评估场景。我在环境效率评估和医院绩效分析等项目中多次应用该模型,发现它能更准确地反映实际效率情况。
2. 模型数学原理详解
2.1 基本模型构建
非期望超效率SBM模型的核心数学表达式如下:
code复制min ρ = (1 - (1/m)∑(s_i^- /x_ik)) / (1 + (1/(s1+s2))(∑(s_r^+ /y_rk) + ∑(s_t^b /b_tk)))
s.t.
x_ik = ∑λ_j x_ij + s_i^-, i=1,...,m
y_rk = ∑λ_j y_rj - s_r^+, r=1,...,s1
b_tk = ∑λ_j b_tj + s_t^b, t=1,...,s2
λ_j ≥ 0, s_i^- ≥ 0, s_r^+ ≥ 0, s_t^b ≥ 0
其中:
- x表示投入变量
- y表示期望产出
- b表示非期望产出
- s表示松弛变量
- ρ为效率值
2.2 超效率处理机制
与传统SBM模型不同,超效率版本允许效率值大于1。实现这一特性的关键在于约束条件的调整:在评估第k个DMU时,将其从参考集中排除。这种处理方式使得效率前沿可以突破原始边界,从而得到超效率值。
3. Matlab实现步骤
3.1 数据准备与预处理
首先需要整理投入、期望产出和非期望产出数据。建议使用CSV或Excel文件存储原始数据,Matlab读取后应进行标准化处理:
matlab复制data = readtable('efficiency_data.csv');
inputs = table2array(data(:,1:3)); % 假设前3列为投入
good_outputs = table2array(data(:,4:6)); % 4-6列为期望产出
bad_outputs = table2array(data(:,7:8)); % 7-8列为非期望产出
% 数据标准化
inputs = normalize(inputs);
good_outputs = normalize(good_outputs);
bad_outputs = normalize(bad_outputs);
3.2 模型求解核心代码
以下是实现非期望超效率SBM模型的关键函数:
matlab复制function [eff, slacks] = super_sbm(input_data, good_output, bad_output, dmu_index)
[m, n] = size(input_data);
s1 = size(good_output, 2);
s2 = size(bad_output, 2);
f = [zeros(1,n) 1/(m)*ones(1,m) zeros(1,s1+s2) -1]';
Aeq = [input_data eye(m) zeros(m,s1) zeros(m,s2) -input_data(:,dmu_index);
-good_output zeros(s1,m) eye(s1) zeros(s1,s2) good_output(:,dmu_index);
bad_output zeros(s2,m) zeros(s2,s1) eye(s2) -bad_output(:,dmu_index)];
beq = [zeros(m,1); good_output(:,dmu_index); bad_output(:,dmu_index)];
lb = [zeros(1,n+m+s1+s2) -Inf]';
ub = [];
options = optimoptions('linprog','Display','none');
[x, ~, exitflag] = linprog(f,[],[],Aeq,beq,lb,ub,[],options);
if exitflag ~= 1
eff = NaN;
slacks = NaN(m+s1+s2,1);
else
eff = x(end);
slacks = x(n+1:n+m+s1+s2);
end
end
3.3 批量计算与结果分析
对全部DMU进行效率评估的完整流程:
matlab复制num_dmu = size(inputs, 2);
efficiency = zeros(num_dmu, 1);
slacks_all = zeros(num_dmu, m+s1+s2);
for k = 1:num_dmu
[eff, slk] = super_sbm(inputs', good_outputs', bad_outputs', k);
efficiency(k) = eff;
slacks_all(k,:) = slk';
end
% 结果可视化
figure;
bar(efficiency);
title('超效率SBM评估结果');
xlabel('DMU编号');
ylabel('效率值');
4. 实际应用案例分析
4.1 工业环境效率评估
在某省30家火力发电厂的效率评估项目中,我们设定:
- 投入:煤炭消耗量、员工人数、资本投入
- 期望产出:发电量
- 非期望产出:SO2排放量、NOx排放量
应用该模型后,发现:
- 效率值分布在0.85-1.25之间
- 3家电厂呈现超效率特征(>1)
- 通过松弛变量分析,识别出主要效率损失来自NOx排放控制不足
4.2 医院运营效率研究
对20家三甲医院进行评估:
- 投入:医护人员数量、床位数、医疗设备价值
- 期望产出:治愈病例数、手术量
- 非期望产出:医疗事故数、患者投诉量
关键发现:
- 超效率医院普遍具有较高的医疗设备利用率
- 非期望产出松弛变量显示医疗事故与医护人员工作负荷呈非线性关系
5. 常见问题与解决方案
5.1 数据异常处理
问题:某些DMU的投入或产出数据存在极端值
解决方案:
- Winsorize处理:将极端值替换为指定分位数
matlab复制function data = winsorize(data, p)
lower = prctile(data, p);
upper = prctile(data, 100-p);
data(data < lower) = lower;
data(data > upper) = upper;
end
- 使用Robust标准化方法替代常规标准化
5.2 模型无可行解情况
问题:部分DMU评估时出现无可行解警告
可能原因及处理:
- 数据存在零值 → 添加微小扰动项
- 投入产出维度设置不合理 → 重新检验指标相关性
- 样本量不足 → 增加DMU数量或减少指标维度
5.3 效率值解释困惑
常见疑问:为什么效率值可以大于1?
解释要点:
- 超效率值表示相对于新的效率前沿的距离
- 值1.2意味着该DMU即使投入增加20%仍能保持效率前沿位置
- 这种特性特别适合高效率单元之间的进一步区分
6. 模型优化与扩展方向
6.1 考虑非期望产出的弱可处置性
改进模型以反映环境规制的实际影响:
matlab复制% 在约束条件中添加弱可处置性系数
Aeq = [Aeq;
zeros(1,n) zeros(1,m) zeros(1,s1) ones(1,s2) 0];
beq = [beq; phi]; % phi为处置系数,0≤phi≤1
6.2 动态窗口分析
引入Malmquist指数实现跨期效率比较:
- 计算各期效率值
- 分解技术效率变化和技术进步
- 可视化效率演变趋势
6.3 结合机器学习方法
前沿研究方向:
- 使用随机森林筛选关键投入产出指标
- 应用聚类分析识别DMU群体特征
- 基于效率值的预测模型构建
在实际项目中,我发现将非期望超效率SBM模型与这些扩展方法结合,能够提供更丰富的决策支持信息。特别是在环境规制效果评估中,动态窗口分析能清晰展示政策实施前后的效率变化轨迹。
