我正在使用 R 中的 qqnorm 函数从整数数据集中生成理论分位数。我预计对于任何大小的数据集,由 qqnorm 计算的分位数和使用分位数公式手动计算的分位数都是相同的。然而,我发现这只适用于 n = 1 和 n > 10。 这是我使用的代码:
# Define the function to compare quantiles
compare_quantiles <- function(n) {
data <- 1:n
qq_result <- qqnorm(data, plot = FALSE)
theoretical_quantiles_qq_norm <- qq_result$x
theoretical_quantiles_by_hand <- qnorm((1:length(data) - 0.5) / length(data))
# Check if the quantiles are identical
identical_results <- all.equal(theoretical_quantiles_qq_norm, theoretical_quantiles_by_hand)
return(identical_results)
}
# Check for n = 1 to n = 100
results <- sapply(1:100, compare_quantiles)
如果你查看
qqnorm
的代码,你会发现这一行
x <- qnorm(ppoints(n))[order(order(y))]
因此,它不像您那样使用
(1:length(data) - 0.5) / length(data)
,而是使用此辅助函数。 ppoints
函数定义为
function (n, a = if (n <= 10) 3/8 else 1/2)
{
if (length(n) > 1L)
n <- length(n)
if (n > 0)
(1L:n - a)/(n + 1 - 2 * a)
else numeric()
}
如果您使用
?ppoints
调出辅助函数文档。它指出了
的选择遵循Becker等人(1988)中同名函数的记录,并且似乎是受到Blom(1958)关于期望正态顺序统计的近似值的结果的启发(另见分位数) .a
因此,该函数被设计为在 N 值小于 10 时以不同的方式工作,这可能是因为参考来源中描述了更好的统计特性。大概是针对小样本量的调整。