Loading...
墨滴

朱坚

2021/08/30  阅读:33  主题:默认主题

综合评价法之秩和比法

1. 背景介绍

秩和比法(Rank-sum ratio,简称RSR法),是我国学者、原中国预防医学科学院田凤调教授于1988年提出的,集古典参数统计与近代非参数统计各自优点于一体的统计分析方法。

它不仅适用于四格表资料的综合评价,也适用于行×列表资料的综合评价,同时也适用于计量资料和分类资料的综合评价。

RSR法现在广泛地应用于医疗卫生、科技、经济等邻域的多指标综合评价、统计预测预报、鉴别分类、统计质量控制等方面。

2. 设计思想

使用数据大小的相对关系,对评价对象进行排名,根据排名的结果计算得到RSR。

一般过程是将效益型指标从小到大排序进行排名、成本型指标从大到小排序进行排名,再计算秩和比,最后统计回归、分档排序。通过秩转换,获得无量纲统计量RSR;

在此基础上,运用参数统计分析的概念与方法,研究RSR的分布;以RSR值对评价对象的优劣直接排序或分档排序,从而对评价对象做出综合评价。

2.1 优点

以非参数法为基础,对指标的选择无特殊要求,适用于各种评价对象,由于计算时使用的数值是秩次,可以消除异常值的干扰。

2.1 缺点

排序的主要依据是利用原始数据的秩次,最终算得的 RSR 值反映的是综合秩次的差距,而与原始数据的顺位间的差距程度大小无关,这样在指标转化为秩次是会失去一些原始数据的信息,如原始数据的大小差别等。

当 RSR 值实际上不满足正态分布时,分档归类的结果与实际情况会有偏差(根据中心极限定理,样本量大时会趋近于正态分布),且只能回答分级程度是否有差别,不能进一步回答具体的差别情况。

3. 计算步骤

此处计算步骤以基金投资案例说明,选取7个指标对基金投资进行评价。

其中X1,X2,X3为正向指标(效益型指标),值越大越好,排序时从小到大排。

​ X4,X5为负向指标(成本型指标),值越低越好,排序时从大到小排。

原始数据如下:

X1 X2 X3 X4 X5
1 34100 0.999091 0.98 0.971793 0.002727
2 22630 0.673973 0.673973 1 0
3 5766 0.774194 0.774194 0.993056 0
4 992 1 0.9375 0.71875 0.21875
5 13206 0.680751 0.664319 0.775862 0.00939
6 26319 0.831567 0.804476 0.805949 0.014134
7 45601 0.807614 0.7845 0.771886 0.004759
8 34007 0.836828 0.807657 0.899782 0.000912
9 34565 0.910314 0.896861 0.796059 0.006278
10 5735 1 1 1 0

3.1 编秩

编秩方法有整次秩和比法和非整次秩和比法。

3.1.1 整次秩和比法

将 n 个评价对象的 m 个评价指标排列成 n 行 m 列的原始数据表。编出每个指标各评价对象的秩,其中效益型指标从小到大编秩,成本型指标从大到小编秩,同一指标数据相同者编平均秩。

得到秩矩阵

如下表:

  1. 对X2按从小到大排序,其中值为1的两个指标( ),按算术平均进行编秩:(9+10)/2=9.5
  2. 对X5按从大到小排序,其中值为0的三个指标,按算术平均进行编秩:(8+9+10)/3=9
X1 R1 X2 R2 X3 R3 X4 R4 X5 R5
1 34100 8 0.999091 8 0.98 9 0.971793 4 0.002727 6
2 22630 5 0.673973 1 0.673973 2 1 1.5 0 9
3 5766 3 0.774194 3 0.774194 3 0.993056 3 0 9
4 992 1 1 9.5 0.9375 8 0.71875 10 0.21875 1
5 13206 4 0.680751 2 0.664319 1 0.775862 8 0.00939 3
6 26319 6 0.831567 5 0.804476 5 0.805949 6 0.014134 2
7 45601 10 0.807614 4 0.7845 4 0.771886 9 0.004759 5
8 34007 7 0.836828 6 0.807657 6 0.899782 5 0.000912 7
9 34565 9 0.910314 7 0.896861 7 0.796059 7 0.006278 4
10 5735 2 1 9.5 1 10 1 1.5 0 9

3.1.1 非整次秩和比法

用类似于线性插值(也比较像优劣解距离法)的方式对指标值进行编秩,以改进 RSR 法编秩方法的不足,所编秩次与原指标值之间存在定量的线性对应关系,从而克服了 RSR 法秩次化时易损失原指标值定量信息的缺点。

  • 对于正向指标(效益型指标):
  • 对于负向指标(成本型指标):

3.2 计算RSR

将某对象的各秩乘以相应的权重并求和后,除以对象个数,得到该对象的RSR,公式:

其中, 表示某个对象, 表示各指标的序号。

当各指标权重相同时,权重 ,RSR的计算可以简化为:

  • 本步骤计算得到的RSR,即可作为为各对象综合评价得分。
  • 有时我们不仅需要计算综合得分,还需要对评价对象进行分级,此时可以从正态分布的角度对各评价对象分级。

本例中使用整次秩和比法编秩,计算结果如下,如

X1 X2 X3 X4 X5 R1 R2 R3 R4 R5 RSR
1 34100 0.999091 0.980000 0.971793 0.002727 8 8 9 4 6 0.7
2 22630 0.673973 0.673973 1 0 5 1 2 1.5 9 0.37
3 5766 0.774194 0.774194 0.993056 0 3 3 3 3 9 0.42
4 992 1 0.937500 0.71875 0.21875 1 9.5 8 10 1 0.59
5 13206 0.680751 0.664319 0.775862 0.00939 4 2 1 8 3 0.36
6 26319 0.831567 0.804476 0.805949 0.014134 6 5 5 6 2 0.48
7 45601 0.807614 0.784500 0.771886 0.004759 10 4 4 9 5 0.64
8 34007 0.836828 0.807657 0.899782 0.000912 7 6 6 5 7 0.62
9 34565 0.910314 0.896861 0.796059 0.006278 9 7 7 7 4 0.68
10 5735 1 1.000000 1 0 2 9.5 10 1.5 9 0.64

3.3 评价对象分级

对RSR进行分布检验,确认分布之后通过分布的概率进行分级。主要步骤:

  1. 通过将RSR进行排序,并转为概率单位Probit
  2. 回归分析,计算出回归方程
  3. 将第1步的概率单位代入到第2步的回归方程,计算出校正RSR值
  4. 根据校正RSR值进行分级

3.3.1 确定RSR分布

确定RSR分布是指用概率单位Probit表达值的累计频率。Probit模型是一种广义的线性模型,服从正态分布。其转换步骤为:

  1. 编制RSR频数分布表,列出各组频数 ,计算各组累计频数
  2. 为各组RSR编秩
  3. 计算累计频率 ,最后一项使用 进行修正。(不修正的话,该值对应的Probit为无穷大,不能用于计算)
  4. 将累计频率换算为概率单位 ,Probit为累计频率对应的标准正态离差加5。(研究过程经常通过加5,使结果都为正数)

以上4个步骤为理论步骤,实际操作中可以简化为:

  1. 将RSR按从小到大进行排序,计算各RSR值的分位数,RSR值一样的分位数使用算术平均值法计算。(该分位数结果与上一方法中第3步一致)
  2. 将累计频率换算为概率单位Probit,Probit为累计频率对应的标准正态离差加5。换算时将分位数值为1的使用 进行修正。
X1 X2 X3 X4 X5 R1 R2 R3 R4 R5 RSR f Σf 修正 原Probit Probit
1 13206 0.680751 0.664319 0.775862 0.00939 4 2 1 8 3 0.36 1 1 0.1 0.1 -1.28155 3.718448
2 22630 0.673973 0.673973 1 0 5 1 2 1.5 9 0.37 1 2 0.2 0.2 -0.84162 4.158379
3 5766 0.774194 0.774194 0.993056 0 3 3 3 3 9 0.42 1 3 0.3 0.3 -0.5244 4.475599
4 26319 0.831567 0.804476 0.805949 0.014134 6 5 5 6 2 0.48 1 4 0.4 0.4 -0.25335 4.746653
5 992 1 0.937500 0.71875 0.21875 1 9.5 8 10 1 0.59 1 5 0.5 0.5 0 5
6 34007 0.836828 0.807657 0.899782 0.000912 7 6 6 5 7 0.62 1 6 0.6 0.6 0.253347 5.253347
7 45601 0.807614 0.784500 0.771886 0.004759 10 4 4 9 5 0.64 1 7.5 0.75 0.75 0.67449 5.67449
8 5735 1 1.000000 1 0 2 9.5 10 1.5 9 0.64 1 7.5 0.75 0.75 0.67449 5.67449
9 34565 0.910314 0.896861 0.796059 0.006278 9 7 7 7 4 0.68 1 9 0.9 0.9 1.281552 6.281552
10 34100 0.999091 0.980000 0.971793 0.002727 8 8 9 4 6 0.7 1 10 1 0.975 1.959964 6.959964

3.3.2 计算回归方程

  1. 通过QQ图的方式对数据进行正态性检验。以累积频率所对应的概率单位Probit为自变量,RSR值为因变量,计算直线回归方程:
  2. 计算出回归方程之后,需要进行校验,主要包括:残差独立性检验、方差齐性检验、回归系数有效性检验、拟合优度检验

​ 此处的校验R-squared和Adj. R-squared值并不高,因为数据做了截取。在真实数据中这两项的值都超过了0.99

在这里插入图片描述
在这里插入图片描述

3.3.3 计算校正RSR值

将Probit代入回归方程,计算出校正RSR值

X1 X2 X3 X4 X5 R1 R2 R3 R4 R5 RSR f Σf R/n R/n' Probit Probit' regression
1 13206 0.680751 0.664319 0.775862 0.00939 4 2 1 8 3 0.36 1 1 0.1 0.1 -1.28155 3.718448 0.368154
2 22630 0.673973 0.673973 1 0 5 1 2 1.5 9 0.37 1 2 0.2 0.2 -0.84162 4.158379 0.42236
3 5766 0.774194 0.774194 0.993056 0 3 3 3 3 9 0.42 1 3 0.3 0.3 -0.5244 4.475599 0.461446
4 26319 0.831567 0.804476 0.805949 0.014134 6 5 5 6 2 0.48 1 4 0.4 0.4 -0.25335 4.746653 0.494844
5 992 1 0.937500 0.71875 0.21875 1 9.5 8 10 1 0.59 1 5 0.5 0.5 0 5 0.52606
6 34007 0.836828 0.807657 0.899782 0.000912 7 6 6 5 7 0.62 1 6 0.6 0.6 0.253347 5.253347 0.557276
7 45601 0.807614 0.784500 0.771886 0.004759 10 4 4 9 5 0.64 1 7.5 0.75 0.75 0.67449 5.67449 0.609168
8 5735 1 1.000000 1 0 2 9.5 10 1.5 9 0.64 1 7.5 0.75 0.75 0.67449 5.67449 0.609168
9 34565 0.910314 0.896861 0.796059 0.006278 9 7 7 7 4 0.68 1 9 0.9 0.9 1.281552 6.281552 0.683967
10 34100 0.999091 0.980000 0.971793 0.002727 8 8 9 4 6 0.7 1 10 1 0.975 1.959964 6.959964 0.767558

3.3.4 根据校正RSR分级

在分级时可以按照合理拍档或最佳拍档原则进行分级。本例中将40%以下的作为C等,80%以下的作为B等,其余的作为A等。40%,80%对应的就是正态分布函数的累计概率(面积)。

注:其实在实际操作中,level分类时,直接使用regression的分位数得到的效果也是一样的,而且操作起来更简单。

X1 X2 X3 X4 X5 R1 R2 R3 R4 R5 RSR f Σf R/n R/n' Probit Probit' regression level
1 13206 0.680751 0.664319 0.775862 0.00939 4 2 1 8 3 0.36 1 1 0.1 0.1 -1.28155 3.718448 0.368154 C
2 22630 0.673973 0.673973 1 0 5 1 2 1.5 9 0.37 1 2 0.2 0.2 -0.84162 4.158379 0.42236 C
3 5766 0.774194 0.774194 0.993056 0 3 3 3 3 9 0.42 1 3 0.3 0.3 -0.5244 4.475599 0.461446 C
4 26319 0.831567 0.804476 0.805949 0.014134 6 5 5 6 2 0.48 1 4 0.4 0.4 -0.25335 4.746653 0.494844 C
5 992 1 0.937500 0.71875 0.21875 1 9.5 8 10 1 0.59 1 5 0.5 0.5 0 5 0.52606 B
6 34007 0.836828 0.807657 0.899782 0.000912 7 6 6 5 7 0.62 1 6 0.6 0.6 0.253347 5.253347 0.557276 B
7 45601 0.807614 0.784500 0.771886 0.004759 10 4 4 9 5 0.64 1 7.5 0.75 0.75 0.67449 5.67449 0.609168 B
8 5735 1 1.000000 1 0 2 9.5 10 1.5 9 0.64 1 7.5 0.75 0.75 0.67449 5.67449 0.609168 B
9 34565 0.910314 0.896861 0.796059 0.006278 9 7 7 7 4 0.68 1 9 0.9 0.9 1.281552 6.281552 0.683967 A
10 34100 0.999091 0.980000 0.971793 0.002727 8 8 9 4 6 0.7 1 10 1 0.975 1.959964 6.959964 0.767558 A

4. 相关代码Python

import pandas as pd
import statsmodels.api as sm
from warnings import simplefilter
from scipy.stats import norm
 
df = pd.DataFrame([
    [341000.9990910.980.9717930.002727],
    [226300.6739730.67397310],
    [57660.7741940.7741940.9930560],
    [99210.93750.718750.21875],
    [132060.6807510.6643190.7758620.00939],
    [263190.8315670.8044760.8059490.014134],
    [456010.8076140.78450.7718860.004759],
    [340070.8368280.8076570.8997820.000912],
    [345650.9103140.8968610.7960590.006278],
    [57351110]
], columns=["X1""X2""X3""X4""X5"])
# 正向指标,从小到大排序
df["R1"] = df["X1"].rank(ascending=True, method="average")
df["R2"] = df["X2"].rank(ascending=True, method="average")
df["R3"] = df["X3"].rank(ascending=True, method="average")
# 负向指标,从大到小排
df["R4"] = df["X4"].rank(ascending=False, method="average")
df["R5"] = df["X5"].rank(ascending=False, method="average")
# 计算RSR值
df["RSR"] = df.loc[:, ["R1""R2""R3""R4""R5"]].sum(axis=1) / (5 * 10)
# 排序
df.sort_values(by="RSR", inplace=True)
# 因为实际数据没有重复,此处偷懒,直接写1
df["f"] = 1
df["Σf"] = df["RSR"].rank(method="average")
df["R/n"] = df["Σf"] / len(df)
df["R/n'"] = df["R/n"]
df.iat[-1-1] = 1 - 1 / 4 / len(df)
 
df["Probit"] = norm.ppf(df["R/n'"])
df["Probit'"] = df["Probit"] + 5
import numpy as np
 
r0 = np.polyfit(df["Probit'"], df["RSR"], deg=1)
if r0[1] > 0:
    print(f"\n回归直线方程为:y = {r0[0]} Probit + {r0[1]}")
else:
    print(f"\n回归直线方程为:y = {r0[0]} Probit - {abs(r0[1])}")
 
simplefilter(action="ignore", category=FutureWarning)
simplefilter(action="ignore", category=UserWarning)
print(sm.OLS(df["Probit"], sm.add_constant(df["RSR"])).fit().summary())
df["regression"] = np.polyval(r0, df["Probit'"])
 
C_LEVEL = norm.ppf(0.4) + 5
B_LEVEL = norm.ppf(0.8) + 5
A_LEVEL = 10
 
threshold = np.polyval(r0, [0, C_LEVEL, B_LEVEL, A_LEVEL])
print("threshold:", threshold)
df["level"] = pd.cut(df["regression"], threshold, labels=["C""B""A"])
df["regression_pct"] = df["regression"].rank(pct=True, ascending=True, method="average")
# 设置pandas打印时显示的列数
pd.set_option("display.max_columns"1000)
pd.set_option("display.max_columns"None)
pd.set_option("display.width"1000)
print(df)

朱坚

2021/08/30  阅读:33  主题:默认主题

作者介绍

朱坚