更新:2011年4月7日,这个答案越来越长,涵盖了手头问题的多个方面。但是,到目前为止,我一直拒绝将其分解为单独的答案。
在此示例的最底部,我添加了对Pearson的性能的讨论。χ2
布鲁斯·希尔(Bruce M. Hill)也许是在类似Zipf的情况下撰写有关估计的“原始”论文。他在1970年代中期就该主题写了几篇论文。但是,“ Hill estimator”(现在称为“ Hill estimator”)基本上依赖于样本的最大阶统计量,因此,根据当前截断的类型,这可能会给您带来麻烦。
主要论文是:
BM Hill,一种简单的推断分布尾部的通用方法,安。统计 ,1975年。
如果您的数据最初确实是Zipf,然后被截断,则可以利用度分布和Zipf图之间的良好对应关系来发挥您的优势。
具体来说,度数分布只是看到每个整数响应的次数的经验分布
di=#{j:Xj=i}n.
如果在对数对数图上针对绘制此图,我们将得到线性趋势,其斜率与缩放系数相对应。i
另一方面,如果绘制Zipf图,从最大到最小对样本进行排序,然后根据其等级对值进行绘制,则会得到具有不同斜率的不同线性趋势。但是,坡度是相关的。
如果是Zipf分布的比例定律系数,则第一个图中的斜率是,第二个图中的斜率是。下面是和的示例图。左侧窗格是度数分布,红线的斜率是。右边是Zipf图,叠加的红线的斜率为。- α - 1 /(α - 1 )α = 2 Ñ = 10 6 - 2 - 1 /(2 - 1 )= - 1α−α−1/(α−1)α=2n=106−2−1/(2−1)=−1
因此,如果您的数据已被截断,以至于您看不到任何大于某个阈值值,但是该数据以其他方式Zipf分布并且相当大,则可以从度分布中估算。一种非常简单的方法是将一条线拟合到对数对数图并使用相应的系数。τ αττα
如果您的数据被截断从而看不到较小的值(例如,对大型Web数据集进行大量过滤的方式),则可以使用Zipf图以对数-对数比例估计斜率,然后“退出”缩放指数。假设您根据Zipf图得出的斜率估算值为。然后,缩放律系数的一个简单估计是
α =1-1β^
α^=1−1β^.
@csgillespie发表了一篇由密歇根州的马克·纽曼(Mark Newman)合着的有关该主题的最新论文。他似乎为此发表了许多类似的文章。下面是另一个以及可能感兴趣的其他一些参考。纽曼有时在统计上没有做最明智的事情,因此要谨慎。
纽曼(MEJ Newman),《幂律,帕累托分布和齐普夫定律》,《当代物理学》第 46期,2005年,第323-351页。
M. Mitzenmacher,《幂律和对数正态分布的生成模型简史》,互联网数学。,卷 1号 ,2003年第2卷,第226-251页。
K.Knight,对Hill估算器的简单修改,并应用于鲁棒性和减少偏差,2010年。
附录:
这是一个简单模拟,以演示如果您从分布中抽取了大小为的样本(如原始问题下方的注释中所述),您会期望什么。10 5R105
> 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≤30
但是,从实际的角度来看,这样的阴谋应该是相对吸引人的。
附录2:让我们考虑一下毛里齐奥在下面的评论中使用的示例。我们假设且,截短的Zipf分布的最大值。n = 300α=2X 中号一个X = 500n=300000xmax=500
我们将以两种方式计算Pearson的统计量。标准方法是通过统计量
,其中是样本中观察到的值的计数,。X 2 = 500 Σ我= 1(直径:我 - ë 我)2χ2 ø我我Ê我=Ñp我=Ñ我-α/Σ 500 Ĵ = 1 Ĵ-α
X2=∑i=1500(Oi−Ei)2Ei
OiiEi=npi=ni−α/∑500j=1j−α
我们还将计算第二个统计量,该统计量是通过首先对大小为40的垃圾箱中的计数进行装箱而形成的,如Maurizio的电子表格中所示(最后一个垃圾箱仅包含20个独立结果值的总和。
让我们从此分布中绘制大小为 5000个单独样本,并使用这两个不同的统计量计算值。pnp
的直方图在下面,并且非常均匀。类型I的经验错误率分别为0.0716(标准,非合并方法)和0.0502(合并方法),并且与我们选择的5000个样本量的目标0.05值在统计学上均无显着差异。p
这是代码。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 )