信息熵的4个量化指标的R代码实现
熵(entropy)在统计学中是一个很重要的概念,代表着信息的多少。经济学里面衡量贫富差距的基尼系数,以及环境生物学领域衡量物种多样性的辛普森多样性指数,以及免疫组库领域的D50都有异曲同工之妙。
比如有10个人,他们的月薪都是2万,那么这10个人组成的小团体的基尼系数就是0,说明没有贫富差距 如果他们的月薪都是3万,基尼系数也仍然是0 ,因为大家都一样。 但是如果他们的收入是1到10,每个人不一样,那么这个小团体的基尼系数就是0.3 如果前面的9个人是1到9万的收入,但是最后一个月不是10万,而是100万,这个小团体的基尼系数就是0.67 如果最后那个人是1个亿,基尼系数就会接近于1。
a=rep(n,10)
b1=a/sum(a)
b1 # 首先每个人的收入都是3万
plot(cumsum(b1),type = 'l')
a=1:10
a=sort(a)
b2=a/sum(a)
b2 ## 然后每个人的收入都不一样,相差一万
points(cumsum(b2),type = 'l')
a=c(1:9,100)
a=sort(a)
b3=a/sum(a)
b3 # 最后,假定其中一个人收入是100万,遥遥领先剩余的9个人
points(cumsum(b3),type = 'l')
y1=as.numeric(table(b1)/length(b1))
y2=as.numeric(table(b2)/length(b2))
y3=as.numeric(table(b3)/length(b3))
shannon.entropy <-function(x,type='raw'){
if(type=='raw'){
myfreqs <- table(x)/length(x)
myvec <- as.data.frame(myfreqs)[,2]
}else{
myvec=x
}
-sum(myvec * log2(myvec))
}
metric.entropy <-function(x,type='raw'){
if(type=='raw'){
myfreqs <- table(x)/length(x)
myvec <- as.data.frame(myfreqs)[,2]
}else{
myvec=x
}
-sum(myvec * log(myvec,length(x)))
}
## modify shannon.entropy to metric entropy
[1] 0
> shannon.entropy(b2)
[1] 3.321928
> shannon.entropy(b3)
[1] 3.321928
>
> metric.entropy(b1)
[1] 0
> metric.entropy(b2)
[1] 1
> metric.entropy(b3)
[1] 1
Simpson.index <-function(x,type='raw'){
if(type=='raw'){
myfreqs <- table(x)/length(x)
myvec <- as.data.frame(myfreqs)[,2]
}else{
myvec=x
}
-sum(myvec * log(myvec,length(x)))
1-sum( myvec ^2)
}
[1] 0
> Simpson.index(b2)
[1] 0.9
> Simpson.index(b3)
[1] 0.9
> Simpson.index(1:100)
[1] 0.99
> Simpson.index(1:1000)
[1] 0.999
基尼系数最大为1,表示居民之间的收入分配绝对不平均,即100%的收入被一个单位的人全部占有了; 基尼系数最小为0,表示居民之间的收入分配绝对平均,即人与人之间收入完全平等,没有任容何差异。
x <- sort(x)
G <- sum(x * 1L:length(x))
G <- 2 * G/sum(x) - (length(x) + 1L)
G/length(x)
}
> gini.index(b1)
[1] 0
> gini.index(b2)
[1] 0.3
> gini.index(b3)
[1] 0.6724138
输入1和2这两个数,来计算香农信息熵结果是1,辛普森多样性指数是0.5 但是对基尼系数来说,输入1和2这两个数,实际上相当于输入了1个a和2个b,就是3个元素。
D50最大为0.5,意味着全部的CDR3序列占比一致,多样性好 D50最小为0,意味着有且只有一种CDR3序列,多样性差
if(type=='raw'){
myfreqs <- table(x)/length(x)
myvec <- sort(as.numeric(myfreqs),decreasing = T)
}else{
myvec=sort(x,decreasing = T)
}
len=length(myvec)
state=cumsum(myvec)>sum(myvec)/2
(len -sum(state))/len #
}
[1] 0
> d50.index(b2)
[1] 0.5
> d50.index(b3)
[1] 0.5
> d50.index(1:100)
[1] 0.5
> d50.index(1:1000)
[1] 0.5
> d50.index(c(1,2,2,2,3,4))
[1] 0.25
文末友情宣传
生信爆款入门-全球听(买一得五)(第5期)(可能是最后一期)你的生物信息学入门课 (必看!)数据挖掘第3期(两天变三周,实力加量),医学生/临床医师首选技能提高课 生信技能树的2019年终总结 ,你的生物信息学成长宝藏 2020学习主旋律,B站74小时免费教学视频为你领路,还等什么,看啊!!!
赞 (0)