如何从数据样本中估计Zipf截断分布的参数?


10

我对Zipf的估算参数有问题。我的情况如下:

我有一个样本集(从产生应遵循Zipf分布的调用的实验中测得)。我必须证明此生成器确实会生成带有zipf分发的调用。我已经阅读了此问答,如何从一组最高频率中计算Zipf定律系数?但由于使用了截短的分布,所以结果很差。例如,如果我在生成过程中将“ s”值设置为“ 0.9”,则如果我尝试估算报告的“问题与答案”中所写的“ s”值,那么我将获得等于0.2 ca的“ s”。我认为这是由于我使用了TRUNCATED发行版(我必须用截断点来限制zipf,它被右截断了)。

如何使用截断的zipf分布估算参数?


要明确的是,您确切地截断了什么?值的分布还是Zipf图本身?你知道截断点吗?截断是数据的人工产物还是数据处理的人工产物(例如,您或实验人员做出的某些决定)?任何其他详细信息将有所帮助。
主教

@cardinal。(第1/2部分)感谢枢机主教。我将提供更多详细信息:我有一个VoIP生成器,该生成器按照Zipf(和其他分发方式)生成每个呼叫者音量的呼叫。我必须验证此生成器是否确实遵循这些分布。对于Zipf分布,我需要定义截断点(因此它是已知的,并且它指的是值的分布),这是用户生成的最大呼叫数和scale参数。特别是在我的情况下,该值等于500,这表示一个用户最多可以生成500个呼叫。
毛里齐奥

(第2/2部分)要设置的另一个参数是Zipf的scale参数,该参数定义分布的范围(在我的情况下,该值为0.9)。我拥有所有参数(样本大小,每个用户的频率等),但我必须验证我的数据集是否遵循zipf分布。
毛里齐奥

因此您显然正在通过重新分配分布,因为对于我认为是“截短的Zipf”的情况,缩放参数0.9是不可能的。如果您可以生成大量此类数据,而您“仅”有500种可能的结果,为什么不使用卡方拟合优度检验呢?由于您的分布具有长尾巴,因此您可能需要相当大的样本量。但是,那将是一种方式。另一种快捷方法是检查是否为较小数量的呼叫获得正确的经验分布。i=1500i0.9
主教

Answers:


14

更新: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=10621/(21)=1

Zipf分布的iid样本的度数分布(左)和Zipf(右)图。

因此,如果您的数据已被截断,以至于您看不到任何大于某个阈值值,但是该数据以其他方式Zipf分布并且相当大,则可以从度分布中估算。一种非常简单的方法是将一条线拟合到对数对数图并使用相应的系数。τ αττα

如果您的数据被截断从而看不到较小的值(例如,对大型Web数据集进行大量过滤的方式),则可以使用Zipf图以对数-对数比例估计斜率,然后“退出”缩放指数。假设您根据Zipf图得出的斜率估算值为。然后,缩放律系数的一个简单估计是 α =1-1β^

α^=11β^.

@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)

结果图是

“截断的” Zipf图(在i = 500处被截断)

从该图可以看出,(左右)的度数分布的相对误差非常好。你可以做一个正式的卡方检验,但这并没有严格地告诉你,数据按照预先设定的分配。它只是告诉你没有证据可以断定他们没有i30

但是,从实际的角度来看,这样的阴谋应该是相对吸引人的。


附录2:让我们考虑一下毛里齐奥在下面的评论中使用的示例。我们假设且,截短的Zipf分布的最大值。n = 300α=2X 中号一个X = 500n=300000xmax=500

我们将以两种方式计算Pearson的统计量。标准方法是通过统计量 ,其中是样本中观察到的值的计数,。X 2 = 500 Σ= 1直径: - ë 2χ2 øÊ=Ñp=Ñ-α/Σ 500 Ĵ = 1 Ĵ-α

X2=i=1500(OiEi)2Ei
OiiEi=npi=niα/j=1500jα

我们还将计算第二个统计量,该统计量是通过首先对大小为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 )

+1,像往常一样好答案。您应该提名自己为主持人,仍然还有1小时:)
mpiktas 2011年

@mpiktas,感谢您的赞美和鼓励。我不确定我是否有理由提名已经非常强大的候选人名单,这些候选人一贯参加比我更长的时间。
主教

@cardinal,这里有一些替代Hill估算器的链接:Paulauskas的原始文章以及VaiciulisGadeikis和Paulauskas的后续文章。据推测,此估计量比原始Hill的属性更好。
mpiktas 2011年

@mpiktas,感谢您的链接。Hill估算器有很多“新的和改进的”版本。原始方法的主要缺点在于,它需要在停止平均的位置选择“截止”。我认为大多数情况下是通过“盯眼”它来完成的,这使人对主观性感到不满。我记得,Resnick的一本关于长尾分布的书对此进行了详细讨论。我认为这是他的最新作品。
主教

@cardinal,非常感谢,您非常友善且非常详细!您在R中的示例对我来说非常有用,但是在这种情况下如何执行正式的卡方检验?(我对其他分布(例如均匀分布,指数分布,正态分布使用卡方检验),但是我对zipf表示怀疑。抱歉,但这是我针对这些主题的第一种方法)。给主持人的问题:我是否还要写另一个问答,例如“如何对截短的zipf分布执行卡方检验?” 还是继续进行此问答,也许更新标签和标题?
Maurizio

5

论文

Clauset,A 等人经验数据中的幂律分布。2009年

很好地描述了如何拟合幂律模型。关联的网页具有代码示例。不幸的是,它没有给出截断分布的代码,但可能会为您提供一个指针。


顺便说一句,本文讨论了一个事实,即可以使用对数正态分布或指数分布对许多“幂律数据集”进行相同的建模(在某些情况下更好)!


不幸的是,本文没有对截断的分布进行任何说明。我在R中发现了一些以简单的方式处理Zipf估计参数的软件包(zipfR,VGAM),但是截断的分布需要“特殊处理”。在您的最后一句话中,您的意思是可以对幂律数据集建模,例如使用指数分布,然后对“截断”指数分布应用某些估计参数过程?我是这个话题的新手!
Maurizio

在本文中,作者重新分析了拟合幂律的不同数据集。作者指出,在许多情况下,幂律模型不是那么好,而替代分布会更好。
csgillespie 2011年

2

按照用户主教的详细回答,我对我的大概截断的zipf分布进行了卡方检验。下表报告了卡方检验的结果:

在此处输入图片说明

例如,其中StartIntervalEndInterval代表呼叫范围,而Observed则是从0到19个呼叫之间生成的呼叫者数量,依此类推。计算,否则到那时为止,“部分”卡方值是可以接受的!

对于其他测试,结果是相同的,最后一列(或最后两列)始终会增加最终值,我不知道为什么,我也不知道是否(以及如何)使用另一个验证测试。

PS:为了完整起见,为了计算期望值(Expected),我以这种方式遵循了枢机主教的建议:

在此处输入图片说明

其中X_i用于计算: x <- (1:n)^-SP_i用于计算p <- x / sum(x),最后得到E_i(每个nr个呼叫的预期用户nr)是P_i * Total_Caller_Observed

并且自由度= 13时,卡方善意总是拒绝样本集遵循Zipf分布的假说,因为测试统计量(在这种情况下为64,14)大于卡方表中报告的“缺点”。最后一列。图形结果在此处报告: 在此处输入图片说明

尽管截断点设置为500,但获得的最大值是294。我认为最终的“分散”是卡方检验失败的原因。

更新!

我尝试对使用上面答案中报告的R代码生成的可估计zipf数据样本执行卡方检验。

> x <- (1:500)^(-2)
> p <- x / sum(x)
> y <- sample(length(p), size=300000, repl=TRUE, prob=p)
> tab <- table(y)
> length(tab)
[1] 438
> plot( 1:438, 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)

相关图如下: 在此处输入图片说明

卡方检验结果报告如下图: 在此处输入图片说明

卡方检验统计量(44,57)太高,无法通过选定的自由度进行验证。同样在这种情况下,数据的最终“分散”也是导致高卡方值的原因。但是有一个过程可以验证这个zipf分布(无论我的“错误”生成器如何,我都希望专注于R数据样本)?


@Maurizio,由于某种原因,直到现在我都错过了这篇文章。无论如何,您是否可以对其进行编辑并添加与我的帖子中的最后一个图相似的图,但是要使用您观察到的数据?这可能有助于诊断问题。我想我还看到了您的另一个问题,即您在生成均匀分布方面遇到困难,因此也许这些问题也将延续到这些分析中。(?) 问候。
主教

@cardinal,我更新了结果!你怎么看?关于均匀分布的问题是我必须以更好的方式指定的另一件事,我将在今天或明天这样做;)
Maurizio

S=0.9

p=P(Xi=500)4.05×104n=845484544.051043.431(10.000405)84540.9675。请注意与上述模拟的匹配程度。
主教

@cardinal,我也认为生成过程中存在“错误”(我的目标是验证该生成器是否确实遵循Zipf分布)。这些天,我必须与项目的设计师交流。
毛里齐奥
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.