【问题标题】:Difference between `medcouple()` implementation in R and PythonR 和 Python 中的 `medcouple()` 实现之间的区别
【发布时间】:2018-07-05 00:33:50
【问题描述】:

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

以下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!

恕我直言R就在这里,但是有没有原创开发者可以对此发表评论?

【问题讨论】:

  • 我已经运行了 python 代码,medcouple(arr) 返回的是 0,而不是 1。
  • 我也试过了,我认为自发布此问题以来代码已得到纠正。

标签: python r statsmodels


【解决方案1】:

查看您的数据,可以预期 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 函数一致。

【讨论】:

  • 很高兴您测试了我的实现,但我想补充一点。尽管您似乎在我添加 GPL 标头之前专门查看了 Mercurial 历史以查找文件的 WIP 版本,但请注意,该文件始终包含在 GPL 中,因为它是 R 原始文件的翻译。如果您这样做是为了反对 GPL,请注意,如果没有 GPL,您对该文件的权利就会减少,例如像您一样下载和研究它的权利。
  • 但是要明确一点,因为我的代码总是被 GPL 覆盖,因为它是 R 原版的衍生作品(我通过尽可能仔细地阅读它来翻译 C 代码),你没有行使您没有的任何权利。我只是指出 GPL 授予了您权利,如果这确实发生了,那么寻找没有 GPL 标头的文件版本是一种毫无意义的姿态。
猜你喜欢
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 2014-08-01
  • 2020-09-01
  • 2020-08-14
相关资源
最近更新 更多