Python 基尼系数 属性值为负值(二)
2020-07-01 本文已影响0人
王叽叽的小心情
上一篇中提到针对升序排序的正值的列表如何计算基尼系数,但是实际应用中会遇到属性值为负值的情况,同时还有加权的情况(上一篇中的代码可以设置权重)。
查找了一下,发现R中有一个对此进行改进的包GiniWegNeg(Computing the Gini-Based Coefficients for Weighted and Negative Attributes),该包主要有两个函数,一个是Gini_CTR_BS(),该函数是基于Chen, Tasur and Rhai (1982)文章的方法, 并进一步被Berebbei and Silber (1985)改进。另一个函数Gini_RSV,该函数是由该R包的作者(Emanuela Raffinetti emanuela.raffinetti@unimi.it)提出,他在2015年的时候提出了另外一种计算方法(负值和正值的总和分别设置为1等,具体可以看原文章)。
- 安装GiniWegNeg包
在R中需要安装,可以查看具体的函数
install.packages("GiniWegNeg")
library(GiniWegNeg)
help(GiniWegNeg)
- 使用方法
以中国的经济复杂度和多样性指标为例,进行计算,其中经济复杂度指标存在正值和负值,多样性指标在(0,1)之间,不存在负值情况,因此可以作为衡量两个函数Gini_CTR_BS和Gini_RSV的计算结果的基准。
#加载所需的包
library(GiniWegNeg)
library(data.table)
#设置当前工作路径
setwd("E:\\China Economics\\1 Economic complexity and diversity\\Code\\")
#读取经复杂度文件
df <- read.csv("E:\\China Economics\\Data\\Statistics\\year_ECI_city_size.csv", header=TRUE, sep=',')
#计算经济复杂度的基尼系数
gini_ECI_CTR_BS <- list()
gini_ECI_RSV <- list()
for(i in 0:15){
field = paste('X', 2000+i,sep = "", collapse = "")
gini_ECI_CTR_BS[i+1] <- Gini_CTR_BS(df[field])
gini_ECI_RSV[i+1] <- Gini_RSV(df[field])
}
# 计算经济多样性
#读取经济多样性文件
df2 <- read.csv("E:\\China Economics\\1 Economic complexity and diversity\\Data\\year_diversity_norm3_del_marco_and_sansha.csv",
header=TRUE, sep=',')
#计算基尼系数
gini_divers_CTR_BS <- list()
gini_divers_RSV <- list()
for(i in 0:15){
field = paste('X', 2000+i, sep = "", collapse = "")
gini_divers_CTR_BS[i+1] <- Gini_CTR_BS(df2[field])
gini_divers_RSV[i+1] <- Gini_RSV(df2[field])
}
接下来查看下两个函数计算的结果,对于属性全为正值的数据,计算结果是一样的,懒得画图了,截个图,
经济多样性的基尼系数,两个函数结果一致
但是对于存在负值的属性,两个函数的结果就不一样了,且趋势也不一致,一个增加,一个减少
经济复杂度计的基尼系数,结果不一致
- 再生问题
所以针对存在负值的属性,两个函数计算结果不一致,这不得让人纠结应该如何选择,同时更进一步思考,基尼系数对于人为构造的已进行归一化的变量是否实用,继续做点调研,回去看看它提出的初衷,再回来看看。