def allele_frequency_probabilityln(allele_frequency_counts, theta=0.001): """Log space version to avoid inevitable overflows with coverage >100. Implements Ewens' Sampling Formula. allele_frequency_counts is a dictionary mapping count -> number of alleles with this count in the population.""" thetaln = math.log(theta) M = sum([frequency * count for frequency, count in allele_frequency_counts.iteritems()]) return factorialln(M) \ - (thetaln + sum([math.log(theta + h) for h in range(1, M)])) \ + sum([powln(thetaln, count) - powln(math.log(frequency), count) + factorialln(count) \ for frequency, count in allele_frequency_counts.iteritems()])
def allele_frequency_probabilityln(allele_frequency_counts, theta=0.001): """Log space version to avoid inevitable overflows with coverage >100. Implements Ewens' Sampling Formula. allele_frequency_counts is a dictionary mapping count -> number of alleles with this count in the population.""" thetaln = math.log(theta) M = sum([ frequency * count for frequency, count in allele_frequency_counts.iteritems() ]) return factorialln(M) \ - (thetaln + sum([math.log(theta + h) for h in range(1, M)])) \ + sum([powln(thetaln, count) - powln(math.log(frequency), count) + factorialln(count) \ for frequency, count in allele_frequency_counts.iteritems()])
def multinomial_coefficientln(n, counts): return factorialln(n) - sum(map(factorialln, counts))
def multinomialln(probs, obs): return factorialln(sum(obs)) - sum(map(factorialln, obs)) + sum( [math.log(math.pow(p, x)) for p, x in zip(probs, obs)])
def multinomialln(probs, obs): return factorialln(sum(obs)) - sum(map(factorialln, obs)) + sum([math.log(math.pow(p, x)) for p,x in zip(probs, obs)])