[英]weighted median in spatstat package
当我通过 10、11 和 12 的均匀加权分数时, spatstat包中的weighted.median()
函数返回“10.5”。我期待“11”的响应(这是stats::median()
的输出) stats::median()
和matrixStats::weightedMedian()
)。
加权中位数的概念对我来说不是很自然。 输出不正确,还是我误解了函数的用途?
x <- c(10, 11, 12)
w <- c( 1, 1, 1)
spatstat::weighted.median(x, w)
#> [1] 10.5
spatstat::weighted.quantile(x, w, probs = .5)
#> 50%
#> 10.5
matrixStats::weightedMedian(x, w)
#> [1] 11
median(x)
#> [1] 11
由reprex 包(v0.3.0) 于 2020 年 2 月 23 日创建
关于小有限样本中分位数(包括中位数)的定义,这里有一个更基本的问题。
R 基函数quantile.default
的帮助文件说有一个参数type
,有 7 个不同的选项,它们会给出不同的答案。 在帮助文件中引用的 Rob Hyndman 的一篇精美文章中详细描述了这些。 quantile.default
的默认值是type=7
。
spatstat::weighted.quantile
的算法执行type=4
的模拟(根据其帮助文件); 即对累积分布函数F(x)
进行线性插值,然后计算反函数。 该算法在 spatstat 代码中正确实现。
您提到的另一个包中的加权中位数正在计算加权中位数的不同定义。
非常感谢您让我们注意到这个例子。 这可能会促使我们扩展spatstat::weighted.median
的实现以包含其他类型。
顺便说一句,CRAN 包的错误报告应发布在包的错误报告页面上,如 CRAN 所示。 很幸运看到这个帖子。 但是非常感谢你们两人发现了这个问题。
我相信这是包装中的一个缺陷,我将解释原因。
首先, weighted.median
实际上只是在probs
向量设置为0.5
调用weighted.quantile
。 但是如果你用你的数据调用weighted.quantile
,你会得到非常奇怪的结果:
weighted.quantile(x, w)
#> 0% 25% 50% 75% 100%
#> 10.00 10.00 10.50 11.25 12.00
那是不对的。
如果您使用body(weighted.quantile)
查看此函数的body(weighted.quantile)
,并按照逻辑进行操作,那么在第 10 行将权重标准化为名为Fx
的变量的方式似乎存在问题。 为了正常工作,归一化的权重应该是一个与x
长度相同的向量,但从 0 开始到 1 结束,两者之间的间距与权重成正比。
但是如果你看看这是如何实际计算的:
body(weighted.quantile)[[10]]
#> Fx <- cumsum(w)/sum(w)
你可以看到它不是从 0 开始的。在你的例子中,第一个元素是 0.3333。
因此,为了说明情况确实如此,让我们用正确的表达式写下这一行。 (首先我们需要解锁绑定才能访问该函数)
unlockBinding("weighted.quantile", asNamespace("spatstat"))
body(weighted.quantile)[[10]] <- substitute(Fx <- (cumsum(w) - min(w))/(sum(w) - min(w)))
现在我们得到了加权分位数的正确结果(包括正确的中位数)
weighted.quantile(x, w)
#> 0% 25% 50% 75% 100%
#> 10.0 10.5 11.0 11.5 12.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.