繁体   English   中英

spatstat 包中的加权中位数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM