weighted.median()
包中的spatstat函数返回“ 10.5”,当我传递平均加权分数10、11和12时,我期望的响应是“ 11”(这是[C0的输出]和stats::median()
)。
加权中位数的概念对我来说不是很自然。输出不正确,还是我误解了该功能的目的?
stats::median()
由matrixStats::weightedMedian()
(v0.3.0)在2020-02-23创建
我相信这是程序包中的一个缺陷,我将解释原因。
首先,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 package的情况下调用weighted.median
。但是,如果使用数据调用weighted.quantile
,则会得到非常奇怪的结果:
probs
不正确。
如果您使用0.5
查看此函数的主体,并按照逻辑进行操作,则权重在第10行被标准化为变量weighted.quantile
的方式似乎存在问题。为了正常工作,归一化的权重应该是与weighted.quantile(x, w)
#> 0% 25% 50% 75% 100%
#> 10.00 10.00 10.50 11.25 12.00
相同长度的向量,但是从0开始到以1结束,并且两者之间的间隔与权重成正比。
但是,如果您看一下它的实际计算方式:
body(weighted.quantile)
您可以看到它不是从0开始。在您的情况下,第一个元素将是0.3333。
为了显示这种情况,让我们用正确的表达式写在这一行上。 (首先,我们需要解锁绑定才能访问该函数)
Fx
现在,我们得到加权分位数的正确结果(包括正确的中位数)
x
这里有一个关于更小的有限样本中的分位数的定义(包括中位数)的更基本的问题。
R基本函数body(weighted.quantile)[[10]]
#> Fx <- cumsum(w)/sum(w)
的帮助文件说,有一个参数unlockBinding("weighted.quantile", asNamespace("spatstat"))
body(weighted.quantile)[[10]] <- substitute(Fx <- (cumsum(w) - min(w))/(sum(w) - min(w)))
,带有7个不同的选项,它们将给出不同的答案。帮助文件中引用了Rob Hyndman的一篇精美文章,对它们进行了仔细地描述。 weighted.quantile(x, w)
#> 0% 25% 50% 75% 100%
#> 10.0 10.5 11.0 11.5 12.0
的默认值为quantile.default
。
type
中的算法执行quantile.default
的模拟(根据其帮助文件);即,对累积分布函数type=7
进行线性插值,然后计算逆函数。 此算法已在spatstat代码中正确实现。
您提到的另一个软件包中的加权中位数正在计算加权中位数的不同定义。
非常感谢您吸引我们注意此示例。这可能促使我们将spatstat::weighted.quantile
的实现扩展为包含其他类型。
偶然地,CRAN软件包的错误报告应发布在软件包的错误报告页面上,如CRAN所示。我很幸运看到了这篇文章。但是,非常感谢你们俩发现了这个问题。