【问题标题】:Statistical test for random graph's edges binomial distribution随机图边二项分布的统计检验
【发布时间】:2018-03-16 22:20:40
【问题描述】:

我正在探索随机图的行为,并想估计边缘分布。

l = []
k = 0
while k < 10000:
    g = nx.gnp_random_graph(n=n,p=p)
    l.append(len(g.edges()))
    k += 1

然后我绘制直方图np.histogram(l, bins=150),它的分布似乎是二项式的 但是,我想应用统计测试来估计。

我试过scipy.stats.binom_test,但它需要其他参数。 给定直方图,我如何估计分布?

【问题讨论】:

标签: python scipy statistics networkx


【解决方案1】:

binom_test 可用于检查单个 Erdos-Renyi 图是否具有合理的参数边数。但您是在询问一组结果,以及这些结果是否具有正确的分布。

为此,您可以使用拟合优度检验,将经验分布与假设的零分布进行比较。存在各种 GoF 测试,但您需要一种用于离散数据的测试。 statsmodels 实现了 Χ2 平方检验以验证拟合优度(docs)

我们需要一个零假设来使用这种类型的检验,这是一个二项分布:E-R 图有n*(n-1)/2 可能的边,它们被添加 独立概率p。很明显,这个分布是二项式的,所以你真正要做的就是检查随机数生成器是否正常。

无论如何,我们的空模型是边的分布为 ~Binom(n_edge, p),预期边数为 p * n*(n-1)/2


这是应用测试的代码。

import networkx as nx
from statsmodels.stats import gof
from scipy import stats

# generate some graphs and measure edge count
p = 0.1
n = 100
n_edge = n*(n-1)/2

l = []
for i in xrange(1000):
    g = nx.gnp_random_graph(n=n, p=p)
    l.append(len(g.edges()))

## we use a chi square test of goodness of fit for the measured edge counts
# chi square: null hypothesis is that data l comes from the binom distribution.
# so if pval is > alpha we do not reject the null.

alpha = 0.001 
chi2, pval, sig_test, msg = gof.gof_chisquare_discrete(stats.distributions.binom, (n_edge, p,), l, alpha, msg="Binom ")
print msg
print "\tpval: {:.3f}".format(pval)
print "\tgood fit to binom(N, p)? {}".format(pval > alpha)

这会产生如下输出:

 >>> chisquare - test for Binom at arg = (4950, 0.1) with pval = 0.8129512780114826 
 >>>    pval: 0.813
 >>>    good fit to binom(N, p)? True

所以边的分布确实是二项式的。

【讨论】:

  • 感谢您提供如此详细的答复。您能否澄清一下,为什么 alpha = 0.001。据我记得,我们拒绝/接受关于 p 值 = 0.005 的假设
  • 另外,我发现这种方法不适用于大 n。例如,尝试 n = 200。
  • 关于 alpha,有很多关于适当的重要性值的讨论(参见例如nature.com/articles/nmeth.4120)。 0.05 的 p 值阈值(la Fisher)可能适用于 20 个样本。但是对于 10k 个样本,更严格的阈值是谨慎的。在这种情况下,生成的 p 值为 0.8,因此无论您设置什么严格性并不重要,您总是会拒绝它!
  • 至于 n=200 的情况,是的,我现在明白了。我已经看过了,这是相当不幸的。我认为它需要一个带有 statsmodels 的错误报告,因为错误来自对分布函数进行采样的代码。这里:github.com/statsmodels/statsmodels/blob/master/statsmodels/… 限制设置为-1000和+1000,然后根据具体数据移入。当 n=100 时,PDF 的相关部分是 [445, 545] ish。但 n=200,相关部分上升到 [1890, 2090]。这意味着 [-1000, 1000] 范围内的 bin 都是空的。
  • 作为一个组合,您可以编辑 gof.py 代码,将 1000 增加到 10000 或者可能是 1e6。但是 statsmodels 开发人员将能够评论选择 1000 值是否还有其他原因,例如由于失去对分发的支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 2015-09-16
相关资源
最近更新 更多