function results=SBM(data,T,nx,ny,nz,info);
% 用途: 计算 SBM (Slacks-Based Measure) 相关模型
% 要求平衡面板数据,时间序列(截面)数据(令T=1)也可以计算。
% 数据data排列顺序 id year x y z.
% 如果是时间序列数据或者是截面数据前面自动空两列即,0 0 x y z.
% ---------------------------------------------------
% 调用命令: results = SBM(data,T,nx,nz,info)
% 输入变量: data = 需要分析的数据集
% T = 年份数(T改为1,可以克服SBM模型太多1不可比的问题)
% nx = 投入变量个数
% ny = 期望产出变量个数
% nz = 非期望产出变量个数
% info = 选项:
% info.model = 0 SBM模型
% = 1 超效率SBM模型
% = 2 非期望产出SBM
% = 3 非期望产出超效率SBM
% info.rts = 0 规模报酬不变
% info.rts = 1 规模报酬可变
% ---------------------------------------------------
% 返回结果: a structure
% results.method = 'SBM模型' if info.model=0
% = '超效率SBM模型' if info.model=1
% = '非期望产出SBM模型' if info.model=2
% = '非期望产出超效率SBM模型' if info.model=3
% results.lambda = lambda
% results.s_x = 投入松弛变量
% results.s_y = 产出松弛变量
% results.s_z = 非期望产出松弛变量
% results.eff = 最终效率值
% --------------------------------------------------
% ---------------------------------------------------
% 版本号:2002.0
% 本代码由红兰数据科学实验室(微信公众号)耿志飞编写。
% 编写时间:2020年2月04日。
% 本代码由苏州红兰数据技术有限公司版权所有,不得用于除学习、写论文以外的其他商业用途。
% 本代码基于MATLAB R2020a软件编写。
% 计算过程中有任何问题都可以通过公众号客服中心联系我们。
%
% 参考文献:
% [1] Kaoru Tone.A slacks-based measure of efficiency in data envelopment analysis[J].European Journal of Operational Research,2001(130):498-509.
% [2] Kaoru Tone.A slacks-based measure of super-efficiency in data envelopment analysis[J].European Journal of Operational Reaerach,2002(143):32-41.
% [3] Kaoru Tone.Dealing with Undesirable Outputs in DEA:A Slacks-based Measure (SBM) Approach.Presentation at NAPW III,Toronto,2003.
% [4] Hong Li,Kuangnan Fang,WeiYang,Di Wang,Xiaoxin Hong.Regional environmental efficiency evaluation in China:Analysis based on the Supper-SBM model with undesirable outputs
%
time1 = 0;
time2 = 0;
time3 = 0;
time4 = 0;
timet = clock; % start the clock for overall timing
fields = fieldnames(info);
nf = length(fields);
if nf > 0
for i=1:nf
if strcmp(fields{i},'model') model = info.model;
elseif strcmp(fields{i},'rts') rts = info.rts;
end
end
end
if model==0 & rts==0
results.method='SBM_CRS'
elseif model==0 & rts==1
results.method='SBM_VRS'
elseif model==1 & rts==0
results.method='Supper_SBM_CRS';
elseif model==1 & rts==1
results.method='Supper_SBM_VRS'
elseif model==2 & rts==0
results.method='SBM_Un_CRS'
elseif model==2 & rts==1
results.method='SBM_Un_VRS'
elseif model==3 & rts==0
results.method='Supper_SBM_Un_CRS'
elseif model==3 & rts==1
results.method='Supper_SBM_Un_VRS'
else
error('SBM: wrong input number of info.model');
end
if model==0
s_z=[];
if rts==0
[lambda,s_x,s_y,eff]=SBM_C(data,T,nx,ny);
elseif rts==1
[lambda,s_x,s_y,eff]=SBM_V(data,T,nx,ny);
end
elseif model==1
s_z=[];
if rts==0
[lambda,s_x,s_y,eff]=Supper_SBM_C(data,T,nx,ny);
elseif rts==1
[lambda,s_x,s_y,eff]=Supper_SBM_V(data,T,nx,ny);
end
elseif model==2
if rts==0
[lambda,s_x,s_y,s_z,eff]=SBM_unC(data,T,nx,ny,nz);
elseif rts==1
[lambda,s_x,s_y,s_z,eff]=SBM_unV(data,T,nx,ny,nz);
end
elseif model==3
if rts==0
[lambda,s_x,s_y,s_z,eff]=Supper_SBM_unC(data,T,nx,ny,nz);
elseif rts==1
[lambda,s_x,s_y,s_z,eff]=Supper_SBM_unV(data,T,nx,ny,nz);
end
else
error('SBM: wrong input number of info.model');
end
% return results
results.lambda=lambda;
results.s_x=s_x;
results.s_y=s_y;
results.s_z=s_z;
results.eff=eff;