Source code for esda.util
import numpy as np
[docs]
def fdr(pvalues, alpha=0.05):
"""
Calculate the p-value cut-off to control for
the false discovery rate (FDR) for multiple testing.
If by controlling for FDR, all of n null hypotheses
are rejected, the conservative Bonferroni bound (alpha/n)
is returned instead.
Parameters
----------
pvalues : array
(n, ), p values for n multiple tests.
alpha : float, optional
Significance level. Default is 0.05.
Returns
-------
: float
Adjusted criterion for rejecting the null hypothesis.
If by controlling for FDR, all of n null hypotheses
are rejected, the conservative Bonferroni bound (alpha/n)
is returned.
Notes
-----
For technical details see :cite:`Benjamini:2001` and
:cite:`Castro:2006tz`.
Examples
--------
>>> import libpysal
>>> import numpy as np
>>> np.random.seed(10)
>>> w = libpysal.io.open(libpysal.examples.get_path("stl.gal")).read()
>>> f = libpysal.io.open(libpysal.examples.get_path("stl_hom.txt"))
>>> y = np.array(f.by_col['HR8893'])
>>> from esda.moran import Moran_Local
>>> from esda import fdr
>>> lm = Moran_Local(y, w, transformation = "r", permutations = 999)
>>> fdr(lm.p_sim, 0.1)
0.002564102564102564
>>> fdr(lm.p_sim, 0.05) #return the conservative Bonferroni bound
0.000641025641025641
"""
n = len(pvalues)
p_sort = np.sort(pvalues)[::-1]
index = np.arange(n, 0, -1)
p_fdr = index * alpha / n
search = p_sort < p_fdr
sig_all = np.where(search)[0]
if len(sig_all) == 0:
return alpha / n
else:
return p_fdr[sig_all[0]]