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
.
的输出进行比较
令我惊讶的是,我发现 IQR
和 reldist::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)
}
我使用 reldist
包(版本 1.6.6)中的 wtd.iqr
函数计算加权四分位距(相对于未加权四分位距 return由 IQR
编辑,来自 vanilla R stats
包)。为了探索这个问题,我尝试将 reldist::wtd.iqr
的输出与 IQR
.
令我惊讶的是,我发现 IQR
和 reldist::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)
}