reldist::wtd.iqr 给出与 IQR 相同权重的不同结果

reldist::wtd.iqr gives different result from IQR for equal weights

我使用 reldist 包(版本 1.6.6)中的 wtd.iqr 函数计算加权四分位距(相对于未加权四分位距 return由 IQR 编辑,来自 vanilla R stats 包)。为了探索这个问题,我尝试将 reldist::wtd.iqr 的输出与 IQR.

的输出进行比较

令我惊讶的是,我发现 IQRreldist::wtd.iqr return 相同输入值的输出值完全不同 即使输入值的权重相同(即当权重应该没有区别时)。

> x <- rnorm(10000)
> wt <- rep(1, length(x))
> paste(c('IQR:', IQR(x), 'wtd.iqr:', reldist::wtd.iqr(x, weight = wt)))
[1] "IQR:"              "1.34879539936654"  "wtd.iqr:"          "0.675866062623211"
> 

在上面的测试中,IQR 似乎总是 return 输出值大约是 wtd.iqr return 相同输入值的输出值的两倍。

对于不遵循上述分布的输入值,这种关系不一定成立:事实上,对于真实数据,我有时会从 wtd.iqr 中得到负值,我本以为是不可能,但从未发现 IQR 会发生这种情况。

事实上,在我看来 wtd.iqr 实际上可能 return 不是四分位间距而是 四分位之一 。但是如果这里有一个错误,它肯定不会那么明显---可以吗?

推测这两个函数以不同的方式定义了四分位数范围的概念,但文档中没有任何线索。 IQR 的文档说明它 'computes interquartile range of the x values',而 wtd.iqr 的文档说明它 'Returns an empirical interquartile range from a weighted sample'.

不,你没有想太多。这实际上是一个错误。我在这里完成了函数定义: https://github.com/cran/reldist/blob/master/R/wtd.quantile.R 。它在内部使用 Hmisc 包的 wtd.quantile 函数,然后用概率值 .25 和 .75 减去它。但是这两个调用是在不同的行中进行的,因此 R 将其视为不同的调用,而不是计算表达式 a-b,它是最后一行 returns -b。因此,将返回 25% 的 -ve 值。

如果你只是试试这个:

quantile(x = x,c(0,0.25,0.5,0.75,1))

#             0%                      25%                      50%                      75% 
#-3.903016136384592105202 -0.677263029412919159711 -0.012691140400805673433  0.636730086813689699632 
#                100% 
# 3.745404178709976328321 

reldist::wtd.iqr(x = x,weight = wt)

 #25% 
 #0.67726302941291915971 

返回25%ile的负数。最后一行在 R 函数调用中返回。

这是函数定义:

wtd.iqr <- function(x, na.rm = FALSE, weight=FALSE) {
  wtd.quantile(x, q=0.75, na.rm = na.rm, weight=weight)
- wtd.quantile(x, q=0.25, na.rm = na.rm, weight=weight)
}

应该是:

wtd.iqr <- function(x, na.rm = FALSE, weight=FALSE) {
  wtd.quantile(x, q=0.75, na.rm = na.rm, weight=weight) - wtd.quantile(x, q=0.25, na.rm = na.rm, weight=weight)
}