我发现R和Python中medcouple()实现之间的区别。考虑一个数组,该数组由10个重复的480次组成,并以[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 ,, 20,21]。对于R和Python中的此数组medcouple(),返回不同的结果。

以下R代码返回0:

library(mrfDepth)
values = c(rep(10, 480),
c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21))
medcouple(values, FALSE)


但是下面的Python代码:

from statsmodels.stats.stattools import medcouple
arr=[10.0]*480 + [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]
medcouple(arr)
returns 1!


IMHO R就在这里,但是有任何原始开发者可以对此发表评论吗?

最佳答案

查看您的数据,可以预期medcouple很小,但肯定。 Medcouple可衡量偏度。如Hubert and Vandervieren所述:


  从该定义可以清楚地看出,医疗耦合始终位于-1和1之间。向右偏斜的分布对医疗耦合具有正值,而MC在向左偏斜的分布处变为负。最后,对称分布的零耦合数为零。


在数据中,您有很多10s,左边有9个值(1到9),右边有11个值(11到21)。因此,它有点偏向右侧。

在您的计算中,由于四舍五入,它们返回零(我检查了您的python代码,它返回0,而不是1。)但是,如果在数据中输入的位数不是那么多10,那么您会看到一个小的正值:

> medcouple([10.0]*3 + [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21])
array(0.05263158)


更新资料

实际上,我的最初解释是错误的...对不起!

我已经检查了您提供的R代码,它返回1,而不是您看到的零。我还绘制了(使用R)不同样本的medcouple(在初始数据中添加了不同的10s数量)。

我不仅使用了mrfDepth库,还使用了还实现medcouple统计信息的robustbase。他们返回了相同的值。

为了帮助理解这种不对称度量的行为,我使用了偏度统计信息添加了一些图。

最后,为了使事情变得更有趣,我将所有这些结果与一个非常相似的数据样本进行了比较(仅省略了两个数字:20和21)。

参见下面的代码:

library(robustbase) # mc (also a medcouple implementation)
library(mrfDepth) # medcouple
library(moments) # skewness

symmetric.sample = function(n) {
    c(c(1:19), rep(10,n))
}
skewed.sample = function(n) {
    c(c(1:21), rep(10,n))
}

xlab = "# 10s added"
n = 1:150

png("skew.png", width=600, height=1000, pointsize=8, res=160)
par(mfrow=c(4,2), pch=20)
hist(sapply(30, symmetric.sample), breaks=0:21, xlab="symmetric sample (with 30 10s added)", main="")
hist(sapply(30, skewed.sample), breaks=0:21, xlab="skewed sample (with 30 10s added)", main="")
plot(n, sapply(sapply(n, symmetric.sample), robustbase::mc), col="red", xlab=xlab, ylab="robustbase's mc on symmetric sample")
plot(n, sapply(sapply(n, skewed.sample), robustbase::mc), col="red", xlab=xlab, ylab="robustbase's mc on skewed sample")
plot(n, sapply(sapply(n, symmetric.sample), medcouple, do.reflect=FALSE), col="red", xlab=xlab, ylab="mrfDepth's mc on symmetric sample")
plot(n, sapply(sapply(n, skewed.sample), medcouple, do.reflect=FALSE), col="red", xlab=xlab, ylab="mrfDepth's mc on skewed sample")
plot(n, sapply(sapply(n, symmetric.sample), skewness), col="red", xlab=xlab, ylab="skewness on symmetric sample")
plot(n, sapply(sapply(n, skewed.sample), skewness), col="red", xlab=xlab, ylab="skewness on skewed sample")
dev.off()


python - R和Python中`medcouple()`实现之间的区别-LMLPHP

现在,关于python的stattools结果,结果完全不同。将原始数据(1到21)加4或更多的10s,medcouple返回0。

我已经测试过Jordi Gutiérrez Hermoso's python implementation。它与R medcouples功能一致。

09-11 17:55