我一直在使用来自wtd.iqr包(Version1.6.6)的reldist函数来计算加权四分位数范围(而不是IQR从香草R stats包返回的未加权四分位数范围),得到了意想不到的结果。为了探讨这个问题,我尝试比较reldist::wtd.iqr的输出和IQR的输出。
令我惊讶的是,我发现IQR和reldist::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可能实际上不是返回四分位数范围,而是返回一个四分位数。但是如果这里有一个bug,它肯定不会是那么明显的一个--是吗?
据推测,这两个函数以不同的方式定义了四分位数范围的概念,但文档中没有任何线索。IQR的文档声明它“计算x值的四分位数范围”,而wtd.iqr的文档声明它“从一个加权样本返回一个经验的四分位数范围”。
发布于 2017-10-25 12:09:10
不,你没想过头。实际上是个窃听器。我在这里已经完成了函数定义:https://github.com/cran/reldist/blob/master/R/wtd.quantile.R。它在内部使用Hmisc包的wtd.quantile函数,然后用概率值.25和.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)
}https://stackoverflow.com/questions/46931159
复制相似问题