【问题标题】:Percentile results in R do not match MS ExcelR 中的百分位数结果与 MS Excel 不匹配
【发布时间】:2020-04-17 19:34:16
【问题描述】:

我有以下玩具数据集(实际数据集约为 500,000 条记录):

library(data.table)

dt <- data.table(Address = c("Gold", "Gold", "Silver", "Silver", "Gold", "Gold", "Copper", "Gold", "Bronze"),
                 Name = c("Stat1", "Stat1", "Stat1", "Stat1", "Stat1", "Stat1", "Stat1", "Stat1", "Stat1"), 
                 AvgValue = c(0, 0.5, 1.25, 0.75, 1.5, 0.7, 0.41, 0.83, 2.58),
                 Samples = c(123, 233, 504, 3, 94, 50, 401, 402, 12))

我想做以下事情:

a) 对数据进行子集化,以便我们仅考虑“值”列中大于零的“黄金”记录AND

b) 使用上面“a”中的过滤数据,打印出百分位数和其他描述性统计数据。

上面执行“a”和“b”的代码如下:

qs = dt[AvgValue > 0 & Address %like% 'Gold', 
        .(Samples = sum(Samples),
          '25th'    = quantile(AvgValue, probs = c(0.25)),
          '50th'    = quantile(AvgValue, probs = c(0.50)),
          '75th'    = quantile(AvgValue, probs = c(0.75)),
          '95th'    = quantile(AvgValue, probs = c(0.95)),
          '99th'    = quantile(AvgValue, probs = c(0.99)),
          '99.9th'  = quantile(AvgValue, probs = c(0.999)), 
          '99.99th' = quantile(AvgValue, probs = c(0.9999)),
          'Mean'    = mean(AvgValue),
          'Median'  = median(AvgValue),
          'StdDev'  = sd(AvgValue)),
        by = .(Name, Address)]
setkey(qs, 'Name')

打印qs显示:

Name    Address Samples 25th  50th   75th   95th   99th    99.9th   99.99th   Mean     Median   StdDev
Stat1   Gold    779     0.65  0.765  0.9975 1.3995 1.4799  1.49799  1.499799  0.8825   0.765    0.4334647

到目前为止,一切都很好。这些来自(小)玩具数据集的值似乎与 MS Excel 中 PERCENTILE() 函数的输出相关联。

编辑: 问题是:当我将此 R 代码应用于更大的数据集时,R 输出的值与 Excel 中的 PERCENTILE() 函数输出的值不相关。在较低的百分位数中,值略有不同。在较高的百分位数中,值显着不同。以下是区别:

             25th           50th        75th        95th        99th        99.9th      99.99th
    R        0.414442227    0.428557466 0.45030771  1.668065665 42.7787092  146.9633133 349.6416913
    Excel    0.414774203    0.429350073 0.448245768 0.971100779 13.31231723 98.75342572 188.2700879

这里有 20 个实际数据点(总共 11,283 个“黄金”行)。这些是降序排列的:

AvgValue
349.1436739
190.189758
175.2157327
158.6492516
132.9550737
132.2686941
126.570912
122.9771829
107.6942185
99.98552912
98.93274272
98.75984129
98.73709105
98.30154271
98.2491005
96.97274385
96.94577839
96.9128099
96.90816688
96.82527478

Excel 中的值似乎“更正确”(尤其是较高的百分位数)。

有人发现我的 R 代码有什么明显错误吗?

如果没有,关于为什么 R 中的值没有与 Excel 中的值绑定的任何想法?

也许是 Quantile() 函数的“类型”参数(我没有传入)?

谢谢!

【问题讨论】:

  • 至于为什么 Excel 和 R 可能在某些百分位数上存在分歧,请阅读?quantile,即type= 参数如何选择“九个分位数算法之一”。我不记得哪种类型与 Excel 最兼容,但它们通常会提供不同的值。
  • 是的。您需要在分位数中使用tytpe=6 才能获得与 Excel 相同的结果。
  • 顺便说一句,为了节省输入,您可以使用as.list(quantile(AvgValue, probs = c(0.25, .5, .75, .95, .99, .999, .9999), names=FALSE)),它将每个分位数返回一列。如果排除 names=FALSE,您将返回名为 25%99.9% 等的列,如果可以的话
  • @G5W 如果您对此有参考,那将是一个很好的答案。如果它来自另一个 SO Q&A,请标记为重复 :)
  • @GW5 - 我按照您的建议尝试了 Type=6,但输出不匹配。维基百科 (en.wikipedia.org/wiki/Quantile) 建议 Excel 函数 PERCENTILE() 使用 Type=7。我尝试使用 R=7 并且结果也不匹配。这越来越有趣了……

标签: r excel data.table subset


【解决方案1】:

我可以通过在 R quantile 函数中设置 type=7 来重现 Excel percentile 函数。请参阅下面来自lapply 的输出[[7]]],并与在我的玩具矢量testveclog 上使用Excel 的percentile 得到的结果进行比较:

set.seed(12272019)
testveclog <- rlnorm(11283, meanlog=-0.12, sdlog=3)
lapply(1:9, function(x) quantile(testveclog, prob=c(0.95, 0.99, 0.999), type=x))

#[[1]]
#      95%       99%     99.9% 
# 131.0835  933.6057 6213.7963 

#[[2]]
#      95%       99%     99.9% 
# 131.0835  933.6057 6213.7963 

#[[3]]
#      95%       99%     99.9% 
# 131.0835  932.8875 6213.7963 

#[[4]]
#      95%       99%     99.9% 
# 131.0141  933.0096 6198.9585 

#[[5]]
#      95%       99%     99.9% 
# 131.1827  933.3687 6230.8209 

#[[6]]
#      95%       99%     99.9% 
# 131.3103  935.1852 6269.9696 

#[[7]]
#      95%       99%     99.9% 
# 131.0372  933.0168 6199.0109 

#[[8]]
#      95%       99%     99.9% 
# 131.2253  933.4860 6243.8705 

#[[9]]
#      95%       99%     99.9% 
# 131.2146  933.4567 6240.6081

writeClipboard(as.character(testveclog)) #copy and then paste into Excel to compare functions

请注意,在最新版本的 Excel 中,PERCENTILE.EXC 已弃用 PERCENTILE 函数,这与使用 type=6Rquantile 函数的输出相匹配

【讨论】:

    猜你喜欢
    • 2011-08-22
    • 2019-06-02
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2021-09-28
    • 1970-01-01
    • 2020-03-19
    相关资源
    最近更新 更多