如何测试分布是否遵循幂律?

机器算法验证 r 假设检验 拟合优度 幂律
2022-01-23 23:25:46

我有关于有多少用户发布多少问题的数据。例如,

[UserCount, QuestionCount] 
[2, 100] 
[9, 10] 
[3, 80] 
... ...

这意味着 2 个用户每个发布 100 个问题,9 个用户每个发布 10 个问题,依此类推。那么,如何确定UserCount, QuestionCount分布是否遵循幂律?

我找到了powerlaw 包但是,我只能通过一组数字来进行评估。(这个包中提供的例子是词频。)那么我该如何使用这个包呢?还是我有什么问题?我也有每个用户的问题计数的数据,即[100, 100, 10, 10, 10 ... ]如果我将这些数据传递给包,我会得到什么?

1个回答

根据 Clauset 等人的说法,这是您使用poweRlaw包测试幂律尾部的方式:

  1. 构造幂律分布对象。在这种情况下,您的数据是离散的,因此请使用类的离散版本
data <- c(100, 100, 10, 10, 10 ...)
data_pl <- displ$new(data)
  1. 估计和幂律的指数,并将它们分配给幂律对象xminα
est <- estimate_xmin(data_pl)
data_pl$xmin <- est$xmin
data_pl$pars <- est$pars

最后两行可以改写为一行

data_pl$xmin <- est

此外,此时,您可以看到 KS 统计信息:

est$KS
  1. KS 统计量告诉您幂律分布与您的数据的匹配程度,但它不会告诉您数据从幂律中提取的可能性有多大。所以你还需要一个值。这就是你的做法:p
bs <- bootstrap_p(data_pl)
bs$p

这可能需要一些时间,所以去喝杯茶吧……

  1. 假设你得到一个值并且它大于 0.05 或任何你的显着水平,你仍然需要排除没有其他替代分布比幂律更适合数据的可能性。软件包实现了您可以比较的其他 3 个替代方案。以对数正常为例:ppoweRlaw
data_alt <- dislnorm$new(data)
data_alt$xmin <- est$xmin
data_alt$pars <- estimate_pars(data_alt)
comp <- compare_distributions(data_pl, data_alt)

请注意,对数正态分布设置为幂律分布,因为函数要求两个分布的相同。对象有两个有趣的字段:表示哪个更合适,正数表示更好,否则为负数;表示差异有多大。xmincompare_distributionsxmincompcomp$test_statisticdata_plcomp$p_two_side

disexp对,类重复此步骤,dispois以将幂律与这些备选方案进行比较。