1. 非期望超效率SBM模型的核心价值与应用场景
在效率评估领域,传统DEA模型存在一个明显的局限性——它无法有效处理"非期望产出"(Undesirable Outputs)。所谓非期望产出,是指在生产过程中伴随目标产出产生的负面效应,比如发电厂的二氧化碳排放、制造业的废水排放等。这些产出不仅无法带来效益,反而需要投入额外资源进行处理。
超效率SBM(Slacks-Based Measure)模型正是在这一背景下应运而生。它通过引入松弛变量(Slack Variables),能够同时考虑投入过剩和产出不足的问题,从而更精确地测量决策单元(DMU)的效率值。当我们将非期望产出纳入考量时,模型就演变为非期望超效率SBM模型,这也是当前环境效率、能源效率等领域的前沿研究方法。
这个模型在Matlab中的实现具有特殊的实践价值。Matlab强大的矩阵运算能力和灵活的编程环境,使其成为实现复杂DEA模型的理想工具。通过Matlab,研究者可以:
- 自定义距离函数来处理非期望产出
- 灵活调整模型导向(投入导向/产出导向)
- 处理大规模数据集时保持计算效率
- 可视化效率前沿和分析结果
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模型数学基础与核心公式解析
2.1 基本SBM模型框架
传统SBM模型的目标函数可以表示为:
[ \rho = \min \frac{1 - \frac{1}{m} \sum_{i=1}^{m} s_i^- / x_{i0}}{1 + \frac{1}{s} \sum_{r=1}^{s} s_r^+ / y_{r0}} ]
其中:
- ( m ) 和 ( s ) 分别代表投入和产出的数量
- ( s_i^- ) 和 ( s_r^+ ) 是投入和产出的松弛变量
- ( x_{i0} ) 和 ( y_{r0} ) 是被评估DMU的观测值
2.2 非期望产出的处理方法
在处理非期望产出时,通常采用以下两种方法之一:
-
倒数转换法:
将非期望产出 ( b ) 转换为 ( 1/b ),然后作为普通产出处理 -
方向距离函数法:
在目标函数中明确区分期望产出和非期望产出:[ \rho = \min \frac{1 - \frac{1}{m} \sum_{i=1}^{m} s_i^- / x_{i0}}{1 + \frac{1}{s_1} \sum_{r=1}^{s_1} s_r^+ / y_{r0} - \frac{1}{s_2} \sum_{k=1}^{s_2} s_k^- / b_{k0}}} ]
其中 ( s_1 ) 和 ( s_2 ) 分别是期望产出和非期望产出的数量
2.3 超效率扩展
超效率SBM模型允许效率值超过1,这使得对高效DMU的进一步区分成为可能。关键修改在于将被评估DMU排除在参考集之外:
[ \sum_{j=1,j\neq 0}^{n} \lambda_j = 1 ]
这一变化使得前沿面不再包含被评估DMU本身,从而可能得到大于1的效率值。
3. Matlab实现的关键步骤
3.1 数据准备与预处理
在Matlab中,我们通常将数据组织为三个矩阵:
matlab复制% 投入矩阵 (n个DMU × m个投入变量)
X = [...];
% 期望产出矩阵 (n个DMU × s1个期望产出)
Y_good = [...];
% 非期望产出矩阵 (n个DMU × s2个非期望产出)
Y_bad = [...];
对于非期望产出,建议先进行标准化处理以避免量纲影响:
matlab复制Y_bad_norm = Y_bad ./ max(Y_bad);
3.2 模型构建与求解
使用Matlab的优化工具箱(Optimization Toolbox)可以高效实现模型求解。以下是核心代码框架:
matlab复制function [eff, lambda, slacks] = SBM_Undesirable(X, Y_good, Y_bad, k)
% k: 被评估DMU的索引
[n, m] = size(X);
s1 = size(Y_good, 2);
s2 = size(Y_bad, 2);
% 定义决策变量
lambda = optimvar('lambda', n-1, 'LowerBound', 0);
s_minus = optimvar('s_minus', m, 'LowerBound', 0);
s_plus = optimvar('s_plus', s1, 'LowerBound', 0);
s_bad = optimvar('s_bad', s2, 'LowerBound', 0);
tau = optimvar('tau', 'LowerBound', 0);
% 构建优化问题
prob = optimproblem;
% 目标函数
numerator = 1 - (1/m)*sum(s_minus./X(k,:)');
denominator = 1 + (1/s1)*sum(s_plus./Y_good(k,:)') ...
- (1/s2)*sum(s_bad./Y_bad(k,:)');
prob.Objective = numerator / denominator;
% 约束条件
prob.Constraints.cons1 = sum(lambda) == 1;
prob.Constraints.cons2 = X([1:k-1 k+1:end],:)'*lambda ...
== tau*X(k,:)' - s_minus;
prob.Constraints.cons3 = Y_good([1:k-1 k+1:end],:)'*lambda ...
== tau*Y_good(k,:)' + s_plus;
prob.Constraints.cons4 = Y_bad([1:k-1 k+1:end],:)'*lambda ...
== tau*Y_bad(k,:)' - s_bad;
% 求解
options = optimoptions('fmincon', 'Display', 'off');
[sol, fval] = solve(prob, 'Options', options);
% 返回结果
eff = fval;
lambda = sol.lambda;
slacks = struct('input', sol.s_minus, ...
'good_output', sol.s_plus, ...
'bad_output', sol.s_bad);
end
3.3 结果分析与可视化
计算完成后,可以通过以下方式分析结果:
matlab复制% 计算所有DMU的效率值
efficiencies = zeros(n, 1);
for i = 1:n
[efficiencies(i), ~, ~] = SBM_Undesirable(X, Y_good, Y_bad, i);
end
% 效率值排序与排名
[eff_sorted, rank] = sort(efficiencies, 'descend');
% 绘制效率分布直方图
figure;
histogram(efficiencies, 20);
title('效率值分布');
xlabel('效率值');
ylabel('DMU数量');
% 投入产出改进分析
[~, lambda, slacks] = SBM_Undesirable(X, Y_good, Y_bad, 5);
disp('对于DMU5的建议改进:');
disp(['应减少的投入量: ', num2str(slacks.input')]);
disp(['应增加的期望产出: ', num2str(slacks.good_output')]);
disp(['应减少的非期望产出: ', num2str(slacks.bad_output')]);
4. 实际应用中的关键问题与解决方案
4.1 数据异常值处理
在实际数据中,异常值会显著影响效率前沿的构建。建议采用以下方法之一:
-
Winsorizing处理:
将极端值替换为指定百分位数的值:matlab复制function x = winsorize(x, pct) lower = prctile(x, pct); upper = prctile(x, 100-pct); x(x < lower) = lower; x(x > upper) = upper; end -
超级效率鲁棒性调整:
在计算效率值时,排除可能受异常值影响的DMU:matlab复制function eff_robust = robust_SBM(X, Y_good, Y_bad, k, n_remove) % 多次计算,每次排除效率值最高的n_remove个DMU eff_values = zeros(n_remove+1, 1); temp_rank = 1:n; for i = 1:n_remove+1 [eff_values(i), ~, ~] = SBM_Undesirable(... X(temp_rank,:), Y_good(temp_rank,:), Y_bad(temp_rank,:), k); temp_rank = setdiff(temp_rank, max(temp_rank)); end eff_robust = median(eff_values); end
4.2 模型选择与验证
针对不同场景,可能需要调整模型设定:
-
导向选择测试:
matlab复制% 投入导向模型 function eff_input = SBM_input_oriented(X, Y_good, Y_bad, k) % 修改目标函数仅考虑投入松弛 prob.Objective = 1 - (1/m)*sum(s_minus./X(k,:)'); % ...其余部分相同 end % 产出导向模型 function eff_output = SBM_output_oriented(X, Y_good, Y_bad, k) % 修改目标函数仅考虑产出松弛 prob.Objective = 1 / (1 + (1/s1)*sum(s_plus./Y_good(k,:)') ... - (1/s2)*sum(s_bad./Y_bad(k,:)')); % ...其余部分相同 end -
交叉验证法评估模型稳定性:
matlab复制function stability = cross_validate_SBM(X, Y_good, Y_bad, folds) n = size(X, 1); indices = crossvalind('Kfold', n, folds); corr_coef = zeros(folds, 1); for i = 1:folds test = (indices == i); train = ~test; eff_full = zeros(sum(test), 1); eff_partial = zeros(sum(test), 1); % 全数据集效率 for j = 1:sum(test) [eff_full(j), ~, ~] = SBM_Undesirable(X, Y_good, Y_bad, find(test,j)); end % 子数据集效率 for j = 1:sum(test) [eff_partial(j), ~, ~] = SBM_Undesirable(... X(train,:), Y_good(train,:), Y_bad(train,:), j); end % 计算相关系数 corr_coef(i) = corr(eff_full, eff_partial); end stability = mean(corr_coef); end
4.3 大规模数据优化技巧
当处理大规模数据集时(如n > 1000),可采用以下优化策略:
-
并行计算加速:
matlab复制parfor i = 1:n efficiencies(i) = SBM_Undesirable(X, Y_good, Y_bad, i); end -
稀疏矩阵技术:
matlab复制function eff = sparse_SBM(X_sparse, Y_good_sparse, Y_bad_sparse, k) % 将密集约束转换为稀疏形式 A = [speye(m); sparse(s1+s2, m)]; b = [X_sparse(k,:)'; Y_good_sparse(k,:)'; -Y_bad_sparse(k,:)']; % ...修改约束条件使用稀疏矩阵乘法 end -
启发式前沿缩减:
matlab复制function reduced_set = frontier_reduction(X, Y_good, Y_bad, threshold) % 先计算初步效率值 prelim_eff = zeros(size(X,1), 1); for i = 1:length(prelim_eff) prelim_eff(i) = simplified_SBM(X, Y_good, Y_bad, i); end % 选择潜在前沿DMU reduced_set = prelim_eff > (max(prelim_eff) - threshold); end
5. 行业应用案例与扩展讨论
5.1 环境效率评估实例
以中国30个省份的工业系统为例,我们设定:
- 投入:资本存量、劳动力、能源消费
- 期望产出:工业增加值
- 非期望产出:工业SO2排放、工业废水排放
通过Matlab实现的分析可以揭示:
matlab复制% 载入示例数据
load('province_data.mat'); % 包含X, Y_good, Y_bad
% 计算效率
eff = zeros(30,1);
for i=1:30
eff(i) = SBM_Undesirable(X, Y_good, Y_bad, i);
end
% 区域效率比较
regions = {'东部','中部','西部'};
region_idx = [ones(11,1); 2*ones(8,1); 3*ones(11,1)];
boxplot(eff, region_idx, 'Labels', regions);
title('三大区域工业环境效率比较');
ylabel('效率值');
5.2 模型扩展方向
-
动态非期望超效率SBM:
引入时间维度,使用Malmquist指数分析效率变化:matlab复制function [eff_change, tech_change] = malmquist_index(X1, X2, Y_g1, Y_g2, Y_b1, Y_b2) % 计算相邻两期的效率变化和技术进步 % ...实现略 end -
网络SBM模型:
将生产过程分解为多个子过程,分别计算效率:matlab复制function [overall_eff, stage_eff] = network_SBM(X1, X2, Z, Y_good, Y_bad, k) % X1: 第一阶段投入 % X2: 第二阶段投入 % Z: 中间产品 % ...实现多阶段效率计算 end -
模糊SBM模型:
处理数据不确定性,引入模糊数学理论:matlab复制function [eff_lower, eff_upper] = fuzzy_SBM(X_low, X_up, Yg_low, Yg_up, Yb_low, Yb_up, k) % 计算效率值的上下界 % ...实现模糊DEA模型 end
5.3 与其他模型的对比研究
在Matlab中可以方便地实现模型比较:
matlab复制% 传统CCR模型效率
ccr_eff = zeros(n,1);
for i=1:n
ccr_eff(i) = CCR_model(X, [Y_good, -Y_bad], i);
end
% SBM模型效率
sbm_eff = zeros(n,1);
for i=1:n
sbm_eff(i) = SBM_Undesirable(X, Y_good, Y_bad, i);
end
% 绘制对比散点图
figure;
scatter(ccr_eff, sbm_eff, 'filled');
hold on;
plot([0,1.5], [0,1.5], 'r--');
xlabel('CCR模型效率');
ylabel('SBM模型效率');
title('两种模型效率值比较');
legend('DMU', '45度线', 'Location', 'best');
通过这种对比可以发现,传统CCR模型往往会高估效率值,特别是在存在非期望产出的情况下。而SBM模型由于考虑了松弛变量,能够更准确地反映实际效率水平。
