我正在尝试实现一个winsorization函数,但对它的确切定义感到困惑。显然,R
包中DescTool
的 winsorize 函数和Python
库中的 winsorize 函数会scipy.stats.mstats
产生不同的结果。我对此感到有些惊讶,因为这两个功能都非常受欢迎,但似乎没有人关心其中的区别。这是一个简单的测试:
在R
library(DescTools)
data <- seq(0, 99)
Winsorize(data, probs=c(0.025, 1-0.025))
结果是[2.475, 2.475, 2.475, 3., 4., 5., 6., ..., 96., 96.525, 96.525, 96.525]
。
然而,在 Python 中,
import numpy as np
from scipy.stats.mstats import winsorize
data = np.arange(100).astype(np.float)
new_data = winsorize(data, [0.025, 0.025])
new_data
结果是[2., 2., 2., 3., 4., 5., 6., ..., 96., 97., 97. ,97.]
。
更糟糕的是,根据维基百科的例子,应该是[3., 3., 3., 3., 4., 5., 6., ..., 96., 96., 96. ,96.]
因为第 2.5 个百分位数是 2.475,它介于 2 和 3 之间,因此,小于 2.475 的所有值都应该舍入到 3。
有人知道我应该实施哪个版本吗?
谢谢