更新:2011 年 4 月 7 日这个答案变得很长,涵盖了手头问题的多个方面。但是,到目前为止,我一直拒绝将其分解为单独的答案。
对于这个例子,我在最底部添加了关于 Pearson 的 $\chi^2$ 性能的讨论。
布鲁斯 M. 希尔 (Bruce M. Hill) 可能撰写了关于在类似 Zipf 的环境中进行估计的“开创性”论文。他在 1970 年代中期就该主题写了几篇论文。但是,“Hill 估计器”(现在称为)本质上依赖于样本的最大阶数统计,因此,根据存在的截断类型,这可能会给您带来一些麻烦。
主要论文是:
BM Hill,一种简单的一般方法来推断分布的尾部,Ann。统计。, 1975 年。
如果您的数据确实最初是 Zipf,然后被截断,则可以利用度分布和Zipf 图之间的良好对应关系为您带来优势。
具体来说,度数分布只是看到每个整数响应的次数的经验分布,$$ d_i = \frac{\#\{j: X_j = i\}}{n}。$$
如果我们将它与 $i$ 绘制在对数图上,我们将得到一个线性趋势,其斜率对应于比例系数。
另一方面,如果我们绘制Zipf 图,我们将样本从最大到最小排序,然后根据它们的等级绘制值,我们会得到具有不同斜率的不同线性趋势。然而,斜率是相关的。
如果 $\alpha$ 是 Zipf 分布的标度系数,则第一个图中的斜率是 $-\alpha$,第二个图中的斜率是 $-1/(\alpha-1)$。下面是 $\alpha = 2$ 和 $n = 10^6$ 的示例图。左侧窗格是度数分布,红线的斜率为 $-2$。右侧是 Zipf 图,叠加的红线斜率为 $-1/(2-1) = -1$。
因此,如果您的数据已被截断,以至于您看不到大于某个阈值 $\tau$ 的值,但数据是 Zipf 分布的并且 $\tau$ 相当大,那么您可以从度分布。一种非常简单的方法是将一条线拟合到对数图并使用相应的系数。
如果您的数据被截断,以至于您看不到小值(例如,对大型 Web 数据集进行大量过滤的方式),那么您可以使用 Zipf 图估计对数刻度上的斜率,然后“退出”缩放指数。假设您对 Zipf 图的斜率估计为 $\hat{\beta}$。然后,缩放定律系数的一个简单估计是 $$ \hat{\alpha} = 1 - \frac{1}{\hat{\beta}} 。$$
@csgillespie 最近发表了一篇由密歇根州的 Mark Newman 共同撰写的关于该主题的论文。他似乎在这方面发表了很多类似的文章。下面是另一个以及其他一些可能感兴趣的参考资料。纽曼有时不会在统计上做最明智的事情,所以要小心。
MEJ Newman,幂律、帕累托分布和 Zipf 定律,当代物理学46,2005,第 323-351 页。
M. Mitzenmacher,幂律和对数正态分布生成模型简史,互联网数学。, 卷。1,没有。2,2003 年,第 226-251 页。
K. Knight,Hill 估计器的简单修改,适用于鲁棒性和减少偏差,2010。
附录:
这是 $R$ 中的一个简单模拟,以演示如果您从分布中获取大小为 $10^5$ 的样本(如您在原始问题下方的评论中所述),您可能会期望什么。
> x <- (1:500)^(-0.9)
> p <- x / sum(x)
> y <- sample(length(p), size=100000, repl=TRUE, prob=p)
> tab <- table(y)
> plot( 1:500, tab/sum(tab), log="xy", pch=20,
main="'Truncated' Zipf simulation (truncated at i=500)",
xlab="Response", ylab="Probability" )
> lines(p, col="red", lwd=2)
结果图是
从图中可以看出,$i \leq 30$(左右)的度数分布的相对误差非常好。您可以进行正式的卡方检验,但这并不严格告诉您数据遵循预先指定的分布。它只会告诉你,你没有证据可以断定他们没有。
不过,从实际的角度来看,这样的情节应该是相对引人注目的。
附录 2:让我们考虑一下 Maurizio 在下面的评论中使用的示例。我们假设 $\alpha = 2$ 和 $n = 300\,000$,截断 Zipf 分布的最大值 $x_{\mathrm{max}} = 500$。
我们将通过两种方式计算 Pearson 的 $\chi^2$ 统计量。标准方法是通过统计 $$ X^2 = \sum_{i=1}^{500} \frac{(O_i - E_i)^2}{E_i} $$ 其中 $O_i$ 是观察到的计数样本中的值 $i$ 和 $E_i = n p_i = ni^{-\alpha} / \sum_{j=1}^{500} j^{-\alpha}$。
我们还将计算第二个统计数据,首先将计数放入大小为 40 的 bin 中,如 Maurizio 的电子表格所示(最后一个 bin 仅包含 20 个单独结果值的总和。
让我们从这个分布中抽取 5000 个大小为 $n$ 的单独样本,并使用这两个不同的统计数据计算 $p$ 值。
$p$-values 的直方图如下所示,看起来非常统一。经验 I 类错误率分别为 0.0716(标准、未分箱方法)和 0.0502(分箱方法),与我们选择的 5000 样本大小的目标 0.05 值在统计上均无显着差异。
这是 $R$ 代码。
# Chi-square testing of the truncated Zipf.
a <- 2
n <- 300000
xmax <- 500
nreps <- 5000
zipf.chisq.test <- function(n, a=0.9, xmax=500, bin.size = 40)
{
# Make the probability vector
x <- (1:xmax)^(-a)
p <- x / sum(x)
# Do the sampling
y <- sample(length(p), size=n, repl=TRUE, prob=p)
# Use tabulate, NOT table!
tab <- tabulate(y,xmax)
# unbinned chi-square stat and p-value
discrepancy <- (tab-n*p)^2/(n*p)
chi.stat <- sum(discrepancy)
p.val <- pchisq(chi.stat, df=xmax-1, lower.tail = FALSE)
# binned chi-square stat and p-value
bins <- seq(bin.size,xmax,by=bin.size)
if( bins[length(bins)] != xmax )
bins <- c(bins, xmax)
tab.bin <- cumsum(tab)[bins]
tab.bin <- c(tab.bin[1], diff(tab.bin))
prob.bin <- cumsum(p)[bins]
prob.bin <- c(prob.bin[1], diff(prob.bin))
disc.bin <- (tab.bin - n*prob.bin)^2/(n * prob.bin)
chi.stat.bin <- sum(disc.bin)
p.val.bin <- pchisq(chi.stat.bin, df=length(tab.bin)-1, lower.tail = FALSE)
# Return the binned and unbineed p-values
c(p.val, p.val.bin, chi.stat, chi.stat.bin)
}
set.seed( .Random.seed[2] )
all <- replicate(nreps, zipf.chisq.test(n, a, xmax))
par(mfrow=c(2,1))
hist( all[1,], breaks=20, col="darkgrey", border="white",
main="Histogram of unbinned chi-square p-values", xlab="p-value")
hist( all[2,], breaks=20, col="darkgrey", border="white",
main="Histogram of binned chi-square p-values", xlab="p-value" )
type.one.error <- rowMeans( all[1:2,] < 0.05 )