为什么 qqnorm 的理论分位数与小数据集的手动计算不同?

问题描述 投票:0回答:1

我正在使用 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)
r statistics quantile qq qqplot
1个回答
1
投票

如果你查看

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
调出辅助函数文档。它指出了

a
的选择遵循Becker等人(1988)中同名函数的记录,并且似乎是受到Blom(1958)关于期望正态顺序统计的近似值的结果的启发(另见分位数) .

因此,该函数被设计为在 N 值小于 10 时以不同的方式工作,这可能是因为参考来源中描述了更好的统计特性。大概是针对小样本量的调整。

© www.soinside.com 2019 - 2024. All rights reserved.