背景介绍
秩和比法(Rank-sum ratio,简称RSR法),是我国学者、原中国预防医学科学院田凤调教授于1988年提出的,集古典参数统计与近代非参数统计各自优点于一体的统计分析方法。
它不仅适用于四格表资料的综合评价,也适用于行×列表资料的综合评价,同时也适用于计量资料和分类资料的综合评价。
RSR法现在广泛地应用于医疗卫生、科技、经济等邻域的多指标综合评价、统计预测预报、鉴别分类、统计质量控制等方面。
设计思想
使用数据大小的相对关系,对评价对象进行排名,根据排名的结果计算得到RSR。
一般过程是将效益型指标从小到大排序进行排名、成本型指标从大到小排序进行排名,再计算秩和比,最后统计回归、分档排序。通过秩转换,获得无量纲统计量RSR;
在此基础上,运用参数统计分析的概念与方法,研究RSR的分布;以RSR值对评价对象的优劣直接排序或分档排序,从而对评价对象做出综合评价。
优点
以非参数法为基础,对指标的选择无特殊要求,适用于各种评价对象,由于计算时使用的数值是秩次,可以消除异常值的干扰。
缺点
排序的主要依据是利用原始数据的秩次,最终算得的 RSR 值反映的是综合秩次的差距,而与原始数据的顺位间的差距程度大小无关,这样在指标转化为秩次是会失去一些原始数据的信息,如原始数据的大小差别等。
当 RSR 值实际上不满足正态分布时,分档归类的结果与实际情况会有偏差(根据中心极限定理,样本量大时会趋近于正态分布),且只能回答分级程度是否有差别,不能进一步回答具体的差别情况。
计算步骤
此处计算步骤以基金投资案例说明,选取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 |
编秩
编秩方法有整次秩和比法和非整次秩和比法。
整次秩和比法
将 n 个评价对象的 m 个评价指标排列成 n 行 m 列的原始数据表。编出每个指标各评价对象的秩,其中效益型指标从小到大编秩,成本型指标从大到小编秩,同一指标数据相同者编平均秩。
得到秩矩阵 $R=\left ( R_{ij} \right )_{m \times n}$
如下表:
- 对X2按从小到大排序,其中值为1的两个指标( $R_{4,2}$, $R_{10,1}$ ),按算术平均进行编秩:(9+10)/2=9.5
- 对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 |
非整次秩和比法
用类似于线性插值(也比较像优劣解距离法)的方式对指标值进行编秩,以改进 RSR 法编秩方法的不足,所编秩次与原指标值之间存在定量的线性对应关系,从而克服了 RSR 法秩次化时易损失原指标值定量信息的缺点。
- 对于正向指标(效益型指标): $R_{ij}=1+\left ( n-1 \right )\frac{X_{ij}-min\left ( X_{1j},X_{2j},...,X_{nj} \right )}{max\left ( X_{1j},X_{2j},...,X_{nj} \right ) - min\left ( X_{1j},X_{2j},...,X_{nj} \right )}$
- 对于负向指标(成本型指标): $R_{ij}=1+\left ( n-1 \right )\frac{max\left ( X_{1j},X_{2j},...,X_{nj}\right ) - X_{ij}}{max\left ( X_{1j},X_{2j},...,X_{nj} \right ) - min\left ( X_{1j},X_{2j},...,X_{nj} \right )}$
计算RSR
将某对象的各秩乘以相应的权重并求和后,除以对象个数,得到该对象的RSR,公式: $RSR_{i} = \frac{1}{n}\sum_{j=1}^{m}\omega_{j}R_{ij}$
其中,$i$表示某个对象,$j$表示各指标的序号。
当各指标权重相同时,权重 $\omega_{j}=\frac{1}{m}$ ,RSR的计算可以简化为: $RSR_{i} = \frac{1}{mn}\sum_{j=1}^{m}R_{ij}$
- 本步骤计算得到的RSR,即可作为为各对象综合评价得分。
- 有时我们不仅需要计算综合得分,还需要对评价对象进行分级,此时可以从正态分布的角度对各评价对象分级。
计算结果如下,如 $RSR_{11}=\left (8+8+9+4+6 \right ) /(5 \times 10)=0.7$
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 |
评价对象分级
对RSR进行分布检验,确认分布之后通过分布的概率进行分级。主要步骤:
- 通过将RSR进行排序,并转为概率单位Probit
- 回归分析,计算出回归方程
- 将第1步的概率单位代入到第2步的回归方程,计算出校正RSR值
- 根据校正RSR值进行分级
确定RSR分布
确定RSR分布是指用概率单位Probit表达值的累计频率。Probit模型是一种广义的线性模型,服从正态分布。其转换步骤为:
- 编制RSR频数分布表,列出各组频数 $f$ ,计算各组累计频数 $\sum f$
- 为各组RSR编秩
- 计算累计频率 $\bar R/n \times 100%$ ,最后一项使用 $1-\frac{1}{4n}$ 进行修正。(不修正的话,该值对应的Probit为无穷大,不能用于计算)
- 将累计频率换算为概率单位$Probit$,Probit为累计频率对应的标准正态离差加5。(研究过程经常通过加5,使结果都为正数)
以上4个步骤为理论步骤,实际操作中可以简化为:
- 将RSR按从小到大进行排序,计算各RSR值的分位数,RSR值一样的分位数使用算术平均值法计算。(该分位数结果与上一方法中第3步一致)
- 将累计频率换算为概率单位Probit,Probit为累计频率对应的标准正态离差加5。换算时将分位数值为1的使用 $1-\frac{1}{4n}$ 进行修正。
X1 | X2 | X3 | X4 | X5 | R1 | R2 | R3 | R4 | R5 | RSR | f | Σf | $\bar R/n$ | $\bar R/n$ 修正 | 原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 |
计算回归方程
- 通过QQ图的方式对数据进行正态性检验。以累积频率所对应的概率单位Probit为自变量,RSR值为因变量,计算直线回归方程: $RSR=a+b \times Probit$
- 计算出回归方程之后,需要进行校验,主要包括:残差独立性检验、方差齐性检验、回归系数有效性检验、拟合优度检验
此处的校验R-squared和Adj. R-squared值并不高,因为数据做了截取。在真实数据中这两项的值都超过了0.99
计算校正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 |
根据校正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 |
相关代码Python
import pandas as pd
import statsmodels.api as sm
from warnings import simplefilter
from scipy.stats import norm
df = pd.DataFrame([
[34100, 0.999091, 0.98, 0.971793, 0.002727],
[22630, 0.673973, 0.673973, 1, 0],
[5766, 0.774194, 0.774194, 0.993056, 0],
[992, 1, 0.9375, 0.71875, 0.21875],
[13206, 0.680751, 0.664319, 0.775862, 0.00939],
[26319, 0.831567, 0.804476, 0.805949, 0.014134],
[45601, 0.807614, 0.7845, 0.771886, 0.004759],
[34007, 0.836828, 0.807657, 0.899782, 0.000912],
[34565, 0.910314, 0.896861, 0.796059, 0.006278],
[5735, 1, 1, 1, 0]
], 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)