dplyr::ntile和statar::xtile之间的区别

3

我的理解是dplyr::ntilestatar::xtile试图做相同的事情。但有时输出结果不同:

dplyr::ntile(1:10, 5)
# [1] 1 1 2 2 3 3 4 4 5 5

statar::xtile(1:10, 5)
# [1] 1 1 2 2 3 3 3 4 5 5

我正在将Stata代码转换为R代码,因此statar::xtile可以生成与原始Stata代码相同的输出结果,但我认为在R中dplyr::ntile是等效的。
根据Stata帮助文档,xtile用于:
创建包含分位数类别的变量
statar::xtile显然是在复制这个功能。
dplyr::ntile则是:
将输入向量分为n个桶的粗略排名。
这两个函数的意义是否相同?
如果是,那么它们为什么会给出不同的答案?
如果不是,那么:
1.有何区别?
2.何时应使用其中之一?

1
你可以检查每个函数的源代码。ntile: function (x, n) { floor((n * (row_number(x) - 1)/length(x)) + 1) }xtile稍微复杂一些。 基础R可能是这样的as.integer(cut(1:10, quantile(1:10, seq(0, 1, length.out = 5 + 1)), include.lowest = TRUE))。在?quantile中解释的类型也可能会有所帮助。 - alistaire
Stata的xtile文档请参见http://www.stata.com/manuals14/dpctile.pdf。 - Nick Cox
谢谢。我现在明白了区别。虽然我不知道如何在基本R中实现它。@alistaire的建议与ntile相同。有什么想法吗? - Danny
好的,我明白了。只是 xtile 使用了不同的分位数算法类型。我会将其写成答案。 - Danny
1个回答

3
感谢 @alistaire 指出,dplyr::ntile 只是执行以下操作:
function (x, n) { floor((n * (row_number(x) - 1)/length(x)) + 1) }

与分成分位数类别不同,xtile 的作用也不同。
查看 statar::xtile 的代码可以找到 statar::pctile,并且 statar文档说明:

pctile 计算类型为 2 的分位数和加权分位数(类似于 Stata _pctile)

因此,在基本 R 中与 statar::xtile 等效的函数是:
.bincode(1:10, quantile(1:10, seq(0, 1, length.out = 5 + 1), type = 2), 
         include.lowest = TRUE)
# [1] 1 1 2 2 3 3 3 4 5 5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接