gpt4 book ai didi

python - 哪个 winsorize 更准确,Python 还是 R

转载 作者:行者123 更新时间:2023-12-03 19:36:11 27 4
gpt4 key购买 nike

我正在尝试实现一个 winsorization 函数,但对它的确切定义感到困惑。显然,R包中的winsorize函数,DescTool,以及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.].

更糟糕的是,基于维基百科的 example ,它应该是 [3., 3., 3., 3., 4., 5., 6., ..., 96., 96., 96. ,96.] 因为第 2.5 个百分位数是 2.475,介于 2 和 3 之间,因此,所有小于 2.475 的值都应四舍五入为 3。

有人知道我应该实现哪个版本吗?

谢谢

最佳答案

这似乎是分位数定义方式的不同。 R 默认使用连续分位数函数,?quantile 的“类型 7”下的 9 种分位数列表中对此进行了描述。如果您在 DescTools::Winsorize 中使用 type = 1,结果似乎与 scipy.stats.mstats 中的 winsorize 匹配(仅基于问题中显示的输出)。

library(DescTools)
data <- seq(0, 99)
Winsorize(data, probs=c(0.025, 1-0.025), type = 1)
# [1] 2 2 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
# [34] 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
# [67] 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 97
# [100] 97

这 9 种方法都没有产生该示例的维基百科页面上显示的输出。虽然那里没有引文,所以我不会考虑太多。

关于python - 哪个 winsorize 更准确,Python 还是 R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59203815/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com