点击此处阅读原文
带有非期望产出的SBM模型(slacks-based measure)可用于处理多个投入和产出变量的效率测度问题,可用于工业经济绿色发展效率的分析。在绿色发展分析中,需要同时考虑经济收益(期望产出)和负面环境效应(非期望产出)的问题,一方面要提高经济收益,另一方面需要减少污染排放,是投入、期望产出和非期望产出三方权衡的问题。
这个帖子记录了和非期望产出SBM模型苦苦斗争一个星期的成果。
数学原理
DEA模型/CCR模型
DEA
SBM模型是数据包络分析(Data Envelopment Analysis, DEA)的一种。在DEA模型中,假定存在个可比决策单元(decision making units, DMU),记为;
每个有种投入,记为,每种投入的权重为;
有种产出,记为,每种产出的权重为.
对第个可比决策单元而言,其投入产出比(技术效率)为
限定范围为. 现要求在所有可比决策单元的效率均不超过的条件下,调节权重和,使得被评价的单元效率值最大化。即如下规划模型:
该模型所确定的权重系数组合是对于最有利的。由于,模型的规划条件即为
在上述线性规划模型中,所要求的是投入和产出项目的指标权重,在原始意义上就是和。模型指定了一个可比决策单元,在规划过程中力求这个单元最终的效率评价达到最高。实际应用中,如何选择这个特殊的必然会成为问题的关键。或许需要根据决策者的感性判断(或其他手段辅助),选定一个最优的决策单元,或者人为设置一个对照的“理想型”,将其视为效率最高的情形。
投入导向CCR
令,则模型的目标函数为
令,根据的定义可知;将规划条件两边同乘,得到
从而将非线性规划模型转换为线性规划模型:
其对偶模型为(对偶模型求解过程见文末)
以上处理后得到的是投入导向的DEA模型。
这里与常见的处理方式有点差异,因为在转化为标准形式的时候规划模型的自由度减了1。
产出导向CCR
同理,若在降低自变量自由度时采用,则可演算得到产出导向的DEA模型:
其对偶模型为
SBM模型
不带非期望产出的情形
在DEA模型中,线性规划的最终目的是使得尽可能大,即的产出效率尽可能高。虽然考虑到了多种产出的情形,但是每一种产出的权重都是正的() ,所以依然是要尽可能使得每一种产出都越高越好。当产出中存在非期望内容时,我们希望这些非期望的产出尽可能低,同时期望产出尽可能高。Kaoru Tone提出的SBM模型(slacks-based model)可以处理这类非期望产出的问题。
我们仍然以表示实际投入,表示实际产出。在不带非期望产出的情况下,有可能存在的生产情形必然包括投入更多、产出更低的情况(即效率更低的情况总是能够实现的):
其中是上的一个非负向量。
矩阵的每一列代表了一个可比决策单元,当右乘一个维向量后得到的是一个维向量,,可以视为由所有按照所规定的配比混合而成的新的生产投入组合。同理,代表了所有按照所规定的配比混合而成的新的产出组合。就是所有实际生产情形线性混合而成的“虚拟生产情形”(基于规模报酬不变)。在这个“虚拟生产情形”的基础之上,更加浪费的生产情形必然是可行的,故采用上述形式定义有可能的生产情形。
在这种定义下,默认了效率最高的生产情形暗含在实际生产情形通过线性组合所形成的参数空间范围之中。即我们不考虑生产效率远远超出现有技术水平的情形。
具体地,用来描述某一个(从实际生产情形中而来):
其中分别称为投入过量(input excess)和产出不足(output shortfall),统一称为和投入和产出的松弛向量(slacks)。据此定义指标:
该指标满足以下特性:
- 每个都有一个不同的
- 随着投入和产出松弛向量而单调变化
- 取值范围为
为了表达的效率,以指标构建SBM模型:
当达到效率最优(SBM-efficient)时,满足
如何理解效率最优等同于松弛变量均为零?在作者的理解中,认为SBM-efficient意味着该决策单元的任何优化都不会引起投入过量和产出不足。
若有唯一的,则确定唯一的关系。规划自变量为,目的是使得尽可能小,即和都要尽可能大。这可以看成是一种对当下生产效率不信任的态度。
当处于效率最优状态时,生产投入的要素配比恰到好处,此时进行任何调节都无法使得效率进一步提升。
再将也视为自变量,即尝试不同组合情况下的,通过调整可以进一步优化目标函数。
**Charnes-Cooper transformation: **将目标函数的分子和分母都乘,使得分母变为,即
从而目标函数变为
定义,则原非线性规划中的约束条件转换为
最后完整地写一下转换后的线性规划(多项式形式):
通过线性规划的可行解,可以解出原型的可行解。
若,则称该为SBM-efficient,此时;
若,则称该为SBM-inefficient,对于一个SBM-inefficient的决策单元(假设为),其投入和产出满足:
由于得到了投入过量和产出不足的具体数值,因此我们可以对该可比决策单元进行优化,称为SBM投射(SBM-projection):
带有非期望产出的情形
如果我们考虑到非期望产出的情形,这些非期望产出在低效情况下的情形并非产出不足,而是“产出过多”,因此需要引入新的松弛向量以规范非期望产出。记为实际期望产出,为实际非期望产出,分别有个。生产可能性中也应区分期望产出和非期望产出,即,其中
同理以指标构建SBM模型:
当某一个达到效率最优时,
通过Charnes-Cooper转换,得到线性规划模型:
通过线性规划的可行解,可以解出原始模型的可行解。
若,则称该为SBM-efficient,此时;
若,则称该为SBM-inefficient,对于一个SBM-inefficient的决策单元(假设为),其投入和产出满足:
由于得到了投入过量和产出不足的具体数值,因此我们可以对该可比决策单元进行优化,称为SBM投射(SBM-projection):
Python代码实现
为了便于编程,我们将以上规划问题写成矩阵形式,
其中自变量为
目标函数系数矩阵为
约束条件方程系数为
约束条件常数项为
代码结构来自wonder1322的博客
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,这里剔除,即
目标函数的系数向量为
其中有个。
除了要满足以外,还应保证,即
对于模型中的主要约束条件,消去后得到
以上两式整合得到,则
至此得到矩阵形式的全部系数。
线性规划的对偶形式
线性规划
的对偶形式为
问题的自变量为,目标函数展开后为
主要约束条件展开后为
将目标函数代入第二个不等式,得到
以上对偶规划模型的多项式形式如下所示:
参考资料
李成宇. 中国工业绿色发展质量测度及影响因素研究[D]. 山东科技大学, 2020. DOI: 10.27275/d.cnki.gsdku.2020.000319.
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