2

wtd.iqr使用包(版本 1.6.6)中的函数来计算加权四分位数范围(与 vanilla R包reldist返回的未加权四分位数范围相反),我得到了意想不到的结果。为了探索这个问题,我尝试将 的输出与.IQRstatsreldist::wtd.iqrIQR

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

> 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似乎总是返回一个输出值大约wtd.iqr是相同输入值返回值的两倍。

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

事实上,在我看来,wtd.iqr实际上可能返回的不是四分位数范围,而是四分位数之一。但是,如果这里有一个错误,它肯定不会那么明显——可以吗?

大概这两个函数以不同的方式定义了四分位距的概念,但是文档中没有任何线索。文档IQR说明它“计算 x 值的四分位数范围”,而文档wtd.iqr说明它“从加权样本返回经验四分位数范围”。

4

1 回答 1

3

不,你没有想太多。这实际上是一个错误。我已经在这里完成了函数定义:https ://github.com/cran/reldist/blob/master/R/wtd.quantile.R 。它在内部使用Hmisc包的wtd.quantile函数,然后用概率值 0.25 和 0.75 减去它。但是这两个调用是在不同的行中进行的,因此 R 将其视为不同的调用,而不是计算表达式a-b,它返回-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)
}
于 2017-10-25T12:09:10.723 回答