查看您的数据,可以预期 medcouple 虽小,但却是积极的。 Medcouple 是衡量偏度的指标。正如Hubert and Vandervieren所说:
从这个定义可以清楚地看出,medcouple 总是介于 -1 和 1 之间。向右偏斜的分布对于 medcouple 具有正值,而 MC 在左侧偏斜分布中变为负值。最后,对称分布的中间偶为零。
在您的数据中,您有很多 10,加上左边的 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。它们返回了相同的值。
为了帮助理解这种不对称度量的行为,我添加了一些使用偏度统计量的图。
最后,为了让事情变得更有趣,我将所有这些结果与一个非常相似的数据样本进行了比较(仅省略了 2 个数字: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 的 stattools 结果,结果完全不同。添加4个或更多10s做原始数据(1到21),medcouple返回0。
我已经测试了Jordi Gutiérrez Hermoso's python implementation。与 R medcouples 函数一致。