带有非期望产出的SBM模型(slacks-based measure)可用于处理多个投入和产出变量的效率测度问题,可用于工业经济绿色发展效率的分析。在绿色发展分析中,需要同时考虑经济收益(期望产出)和负面环境效应(非期望产出)的问题,一方面要提高经济收益,另一方面需要减少污染排放,是投入期望产出非期望产出三方权衡的问题。1

这个帖子记录了和非期望产出SBM模型苦苦斗争一个星期的学习成果。

image-20220822150334401

数学原理

DEA模型/CCR模型

DEA

SBM模型是数据包络分析(Data Envelopment Analysis, DEA)的一种。在DEA模型中,假定存在n个可比决策单元(decision making units, DMU),记为DMUj(j=1,2,,n)

每个DMUm种投入,记为Xi(i=1,2,,m),每种投入的权重为vi

q种产出,记为Yr(r=1,2,,q),每种产出的权重为ur.

对第k个可比决策单元而言,其投入产出比(技术效率)为

Hk=r=1qurYrki=1mviXik

限定范围为Hk[0,1]. 现要求在所有可比决策单元的效率均不超过1的条件下,调节权重[v1,v2,,vm][u1,u2,,uq],使得被评价的单元DMUk效率值最大化。即如下规划模型: max  z=r=1qurYrki=1mviXiks.t.  r=1qurYrji=1mviXij1 (vi0,ur0)  i=1,2,,m; r=1,2,,q; j=1,2,,n

该模型所确定的权重系数组合是对于DMUk最有利的。由于i=1mviXik>0,模型的规划条件即为 s.t.  r=1qurYrji=1mviXij0;

在上述线性规划模型中,所要求的是投入和产出项目的指标权重,在原始意义上就是uv。模型指定了一个可比决策单元DMUk,在规划过程中力求这个单元最终的效率评价达到最高。实际应用中,如何选择这个特殊的DMU必然会成为问题的关键。或许需要根据决策者的感性判断(或其他手段辅助),选定一个最优的决策单元,或者人为设置一个对照的“理想型”,将其视为效率最高的情形。

投入导向CCR

t=(i=1mviXik)1,则模型的目标函数为

max  z=tr=1qurYrk=r=1qturYrk,

μr=tur,νi=tvi,根据t的定义可知i=1mνiXik=1;将规划条件两边同乘t,得到

s.t.  r=1qμrYrji=1mνiXij0.

从而将非线性规划模型转换为线性规划模型:

max  z=r=1qμrYrks.t.  r=1qμrYrji=1mνiXij0 (μr0,νi0)  i=1mνiXik=1  i=1,2,,m; r=1,2,,q; j=1,2,,n

其对偶模型为(对偶模型求解过程见文末)

minθ=j=1nXmjXmkλj+λn+1s.t.j=1nλjXij(θ+λn+1)Xik(λj0)j=1nλjYrjYrki=1,2,,m;r=1,2,,q;j=1,2,,n

以上处理后得到的是投入导向的DEA模型。

这里与常见的处理方式有点差异,因为在转化为标准形式的时候规划模型的自由度减1。

产出导向CCR

同理,若在降低自变量自由度时采用t=(r=1qurYrk)1,则可演算得到产出导向的DEA模型:

min  z=i=1mνrXiks.t.  r=1qμrYrji=1mνiXij0 (μr0,νi0)  r=1qμrYrk=1  i=1,2,,m; r=1,2,,q; j=1,2,,n

其对偶模型为

min  ϕ=j=1nYqjYqkλj+λn+1s.t.  j=1nλjYrj(θ+λn+1)Yrk  (λj0)  j=1nλjXijXrk  i=1,2,,m; r=1,2,,q; j=1,2,,n

SBM模型

不带非期望产出的情形

在DEA模型中,线性规划的最终目的是使得Hk尽可能大,即DMUk的产出效率尽可能高。虽然考虑到了多种产出的情形,但是每一种产出的权重都是正的(ur0) ,所以依然是要尽可能使得每一种产出都越高越好。当产出中存在非期望内容时,我们希望这些非期望的产出尽可能低,同时期望产出尽可能高。Kaoru Tone提出的SBM模型(slacks-based model)2可以处理这类非期望产出的问题。

我们仍然以X=(xij)Rm×n表示实际投入,Y=(yrj)Rq×n表示实际产出。在不带非期望产出的情况下,有可能存在的生产情形必然包括投入更多、产出更低的情况(即效率更低的情况总是能够实现的):

P={(x,y) | xXλ, yYλ, λ0}

其中λRn上的一个非负向量。

X矩阵的每一列代表了一个可比决策单元,当X右乘一个n维向量后得到的是一个m维向量,Xλ=[j=1nxijλj]m×1,可以视为由所有DMU按照λ所规定的配比混合而成的新的生产投入组合。同理,Yλ代表了所有DMU按照λ所规定的配比混合而成的新的产出组合。(Xλ,Yλ)就是所有实际生产情形线性混合而成的“虚拟生产情形”(基于规模报酬不变)。在这个“虚拟生产情形”的基础之上,更加浪费的生产情形必然是可行的,故采用上述形式定义有可能的生产情形。

在这种定义下,默认了效率最高的生产情形暗含在实际生产情形通过线性组合所形成的参数空间范围之中。即我们不考虑生产效率远远超出现有技术水平的情形。

具体地,用(x0,y0)来描述某一个DMU0(从实际生产情形X,Y中而来): x0=Xλ+ss y0=Yλss+ 其中ss0,ss+0分别称为投入过量(input excess)和产出不足(output shortfall),统一称为和投入和产出的松弛向量(slacks)。据此定义指标:

ρ=11mi=1m(si/xi0)1+1qr=1q(sr+/yr0)

该指标满足以下特性:

  1. 每个DMU都有一个不同的ρ
  2. 随着投入和产出松弛向量ss,ss+而单调变化
  3. 取值范围为ρ(0,1]

为了表达(x0,y0)的效率,以ρ指标构建SBM模型:

min  ρ=11mi=1m(si/xi0)1+1qr=1q(sr+/yr0)s.t.  x0=Xλ+ss  y0=Yλss+  λ0, ss0, ss+0

DMU0达到效率最优(SBM-efficient)时,满足 ρ=1, ss=0, ss+=0

如何理解DMU效率最优等同于松弛变量均为零?在作者的理解中,认为SBM-efficient意味着该决策单元的任何优化都不会引起投入过量和产出不足。

若有唯一的λ,则确定唯一的(ss,ss+)(x0,y0)关系。规划自变量为(ss,ss+),目的是使得ρ尽可能小,即ssss+都要尽可能大。这可以看成是一种对当下生产效率不信任的态度。

当处于效率最优状态时,生产投入的要素配比恰到好处,此时进行任何调节都无法使得效率进一步提升。

再将λ也视为自变量,即尝试不同组合情况下的DMU0,通过调整λ可以进一步优化目标函数。

**Charnes-Cooper transformation: **将目标函数的分子和分母都乘t,使得分母变为1,即

t=[1+1qr=1q(sr+yr0)]1,

从而目标函数变为

min ρ=t1mi=1mtsixi0.

定义SS=tss,SS+=tss+,ΛΛ=tλ,则原非线性规划中的约束条件转换为 s.t.  1=t+1qr=1qSr+yr0  tx0=XΛΛ+SS  ty0=YΛΛSS+  Λ0,SS0,SS+0,t0 最后完整地写一下转换后的线性规划(多项式形式):

min  ρ=t1mi=1mtsixi0s.t.  1=t+1qr=1qSr+yr0  txi0=j=1nxijΛj+Si  tyr0=j=1nyrjΛjSr+  Λj0,Si0,Sr+0,t0  i=1,2,,m;r=1,2,,q;j=1,2,,n

通过线性规划的可行解(ρ,Λ,t,SS,SS+),可以解出原型的可行解(ρ,λ,ss,ss+)

ρ=1,则称该DMU为SBM-efficient,此时ss=0,ss+=0; 若ρ<1,则称该DMU为SBM-inefficient,对于一个SBM-inefficient的决策单元(假设为DMUk),其投入和产出满足:

xk=Xλ+ssyk=Yλss+

由于得到了投入过量和产出不足的具体数值,因此我们可以对该可比决策单元进行优化,称为SBM投射(SBM-projection):

xkxkssykyk+ss+

带有非期望产出的情形

如果我们考虑到非期望产出的情形3,这些非期望产出在低效情况下的情形并非产出不足,而是“产出过多”,因此需要引入新的松弛向量ss+以规范非期望产出。记Y为实际期望产出,Z为实际非期望产出,分别有q1,q2个。生产可能性中也应区分期望产出和非期望产出,即(x0,y0,z0),其中 z0=Zλ+ss+. 同理以ρ指标构建SBM模型:

min  ρ=11mi=1m(si/xi0)1+1q1+q2[r1=1q1(sr+/yr0)+r=1q2(sr+/zr0)]s.t.  x0=Xλ+ss  y0=Yλss+  z0=Zλ+ss+  λ0, ss0, ss+0

当某一个DMU达到效率最优时,

ρ=1, ss=0, ss+=0, ss+=0.

通过Charnes-Cooper转换,得到线性规划模型: min  ρ=t1mi=1mSixi0s.t.  1=t+1q1+q2(r=1q1Sr+yr0+r=1q2Sr+yr0)  txi0=j=1nxijΛj+Si (i=1,2,,m)  tyr0=j=1nyrjΛjSr+ (r=1,2,,q1)  tzr0=j=1nzrjΛjSr+ (r=1,2,,q2)  Λj0,Si0,Sr+0,t0 由线性规划的可行解(ρ,Λ,t,SS,SS+,SS+),可以解出原始模型的可行解(ρ,λ,ss,ss+,ss+)

λλ=ΛΛt, ss=SSt, ss+=SS+t, ss+=SS+t

ρ=1,则称该DMU为SBM-efficient,此时ss=0,ss+=0,ss+=0

ρ<1,则称该DMU为SBM-inefficient,对于一个SBM-inefficient的决策单元(假设为DMUk),其投入和产出满足:

xk=Xλ+ssyk=Yλss+zk=Zλ+ss+

由于得到了投入过量和产出不足的具体数值,因此我们可以对该可比决策单元进行优化,称为SBM投射(SBM-projection): xkxkssykyk+ss+zkzkss+

Python代码实现

为了便于编程,我们将以上规划问题写成矩阵形式, min  ρ=CXXs.t.  AXX=b  XX0 其中自变量为 XX=[λ1,λ2,,λn,  t,  S1,S2,,Sm,  S1+,S2+,,Sq1+,  S1+,S2+,,Sq2+]T, 目标函数系数矩阵为 C=[0,0,,0,  1,  1mx10,1mx20,,1mxm0,  0,,0], 约束条件方程系数为 A=[00100α1αq1β1βq2x11x1nx10100000xm1xmnxm0010000y11y1ny10001000yq11yq1nyq10000100z11z1nz10000010zq21zq2nzq20000001],αr=1(q1+q2)yr0 (r=1,2,,q1),βr=1(q1+q2)zr0 (r=1,2,,q2),

约束条件常数项为 b=[1,  0,0,,0]T

代码结构来自wonder1322的博客

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import pandas as pd
import scipy.optimize as op
import numpy as np

def sbmeff2(input_variable, desirable_output, undesirable_output, dmu, data, method = 'revised simplex'):
    """用于求解sbm模型
    
    Parameters:
    -----------
    input_variable:
        投入[v1,v2,v3,...]
    desirable_output:
        期望产出[v1,v2,v3,...]
    undesirable_output:
        非期望产出[v1,v2,v3,...] 
    dmu:
        决策单元
    data:
        主数据
    method:
        求解方法.默认'revised simplex',可选'interior-point'

	Return:
	------
	res : DataFrame
		结果数据框[dmu	TE	slack...]
    """
 
    res = pd.DataFrame(columns = ['dmu','TE'], index = data.index)
    res['dmu'] = data[dmu]
    ## lambda有dmu个数个,S有变量个数个
    dmu_counts = data.shape[0]
    ## 投入个数
    m = len(input_variable)
    ## 期望产出个数
    s1 = len(desirable_output)
    ## 非期望产出个数
    s2 = len(undesirable_output)
    ## x[:dmu_counts] 为lambda
    ## x[dmu_counts : dmu_counts+1] 为 t
    ## x[dmu_counts+1 : dmu_counts + m + 1] 为投入slack
    ## x[dmu_counts+ 1 + m : dmu_counts + 1 + m + s1] 为期望产出slack
    ## x[dmu_counts + 1 + m + s1 :] 为非期望产出slack
    total = dmu_counts + m + s1 + s2 + 1
    cols = input_variable + desirable_output + undesirable_output
    newcols = []
    for j in cols:
        newcols.append(j+'_slack')
        res[j+'_slack'] = np.nan
        
    for i in range(dmu_counts):
        ## 优化目标:目标函数的系数矩阵
        c = [0]*dmu_counts + [1] + list(-1 / (m*data.loc[i, input_variable])) + [0] * (s1+s2)
        
        ## 约束条件:约束方程的系数矩阵
        A_eq = [[0]*dmu_counts + [1] + [0]*m +
                list(1/((s1+s2)*data.loc[i, desirable_output])) +
                list(1/((s1+s2)*data.loc[i, undesirable_output]))]
        
        ## 约束条件(1):投入松弛变量为正
        for j1 in range(m):
            list1 = [0] * m
            list1[j1] = 1
            eq1 = list(data[input_variable[j1]]) + [-data.loc[i ,input_variable[j1]]] + list1 + [0]*(s1+s2)
            A_eq.append(eq1)
        ## 约束条件(2):期望产出松弛变量为正
        for j2 in range(s1):
            list2 = [0] * s1
            list2[j2] = -1
            eq2 = list(data[desirable_output[j2]]) + [-data.loc[i, desirable_output[j2]]] + [0]*m + list2 + [0]*s2
            A_eq.append(eq2)
        ## 约束条件(3):非期望产出松弛变量为正
        for j3 in range(s2):
            list3 = [0] * s2
            list3[j3] = 1
            eq3 = list(data[undesirable_output[j3]]) + [-data.loc[i, undesirable_output[j3]]] + [0]*(m+s1) + list3
            A_eq.append(eq3)         
        ## 约束条件:常数向量
        b_eq = [1] + [0]*(m+s1+s2)               
        bounds = [(0, None)]*total ## 约束边界为零
        ## 求解
        op1 = op.linprog(c = c,A_eq=A_eq,b_eq=b_eq,bounds=bounds,method = method)
        res.loc[i, 'TE'] = op1.fun
        res.loc[i, newcols] = op1.x[dmu_counts+1 :]
    return res

补充:求解对偶模型的过程

线性规划的矩阵形式

学习SBM模型的时候遇到了对偶规划这一步骤,之前没有接触过,在B站上找了一个教程对照着推导了一遍。

原始的线性规划模型,自变量是μ=[μ1,μ2,,μq],ν=[ν1,ν2,,νm]

注意:虽然规划模型中有XY,但是这是代表可比决策单元的投入量和产出量的,是已知的数据,所以并不是变量。 max  z=r=1qμrYrks.t.  r=1qμrYrji=1mνiXij0 (μr0,νi0)  i=1mνiXik=1  i=1,2,,m; r=1,2,,q; j=1,2,,n 先转换为矩阵形式,自变量向量记为XXmax  Z=CXXs.t.  AXXb  XX0 其中由于等式i=1mνiXik=1,导致自变量的自由度减1,这里剔除νm,即 XX=[μ1,μ2,,μq,ν1,ν2,,νm1]T. 目标函数的系数向量为 C=[Y1k,Y2k,,Yqk,0,0,,0], 其中有m10

除了要满足XX0以外,还应保证νm0,即 νm=1i=1m1νiXikXmk0i=1m1νiXik1. 对于模型中的主要约束条件,消去νm后得到 r=1qμrYrj+i=1m1νi(XikXmjXmkXij)XmjXmk,j=1,2,,n. 以上两式整合得到AXXb,则

A(n+1)×(q+m1)=[Y11Y21Yq1α11α21αm1,1Y12Y22Yq2α12α22αm1,2Y1nY2nYqnα1nα2nαm1,n000X1kX2kXm1,k],where αij=(XikXmjXmkXij),b=[Xm1Xmk,Xm2Xmk,,XmnXmk,1]T

至此得到矩阵形式的全部系数。

线性规划的对偶形式

这里补充一下关于线性规划问题转换为其对偶问题的数学推导4。已知有如下线性规划 PP:  max  Z=CXXs.t.  AXXb  XX0 的对偶形式为 DD:  min  W=YYTbs.t.  ATYYCT  YY0 DD问题的自变量为YY=[λ1,λ2,,λn+1]T,目标函数展开后为 W=YYTb=j=1nXmjXmkλj+λn+1. 主要约束条件展开后为 j=1nλjYrjYrkj=1nλj(XikXmjXmkXij)0r=1,2,,q; i=1,2,,m 将目标函数代入第二个不等式,得到 j=1nλjXijXik(λn+1+W). 以上对偶规划模型的多项式形式如下所示: min  W=j=1nXmjXmkλj+λn+1s.t.  j=1nλjYrjYrk (λj0)  j=1nλjXijXik(λn+1+W)  i=1,2,,m; r=1,2,,q; j=1,2,,n


  1. 李成宇. 中国工业绿色发展质量测度及影响因素研究[D]. 山东科技大学, 2020. DOI: 10.27275/d.cnki.gsdku.2020.000319↩︎

  2. Tone, K. (2001). A slacks-based measure of efficiency in data envelopment analysis. European Journal of Operational Research, 130(3), 498-509. DOI: 10.1016/S0377-2217(01)00324-1 ↩︎

  3. 带有非期望产出的SBM模型(python)wonder1322的博客 - CSDN博客 非期望产出的sbm模型 ↩︎

  4. 线性规划的对偶模型 hongmofang10的博客 - CSDN博客 对偶模型 ↩︎