https://github.com/tansey/smoothfdr
Raw File
Tip revision: c5b693d0a66e83c9387433b33c0eab481bd4a763 authored by Wesley Tansey on 08 May 2020, 15:42:20 UTC
Fixed bug in easy that created too large a support for the alternative distribution
Tip revision: c5b693d
hmrfPost.py
import numpy as np
import scipy.stats as st
import csv
import sys
from smoothfdr.utils import calc_fdr

expdir = sys.argv[1]

with open(expdir + 'buffer_lis.csv', 'rb') as f:
    reader = csv.reader(f, delimiter=' ')
    lis = np.array([float(x) for x in reader.next() if x != ''])

# Try treating the LIS as a prior probability of coming from the null hypothesis
# data = np.loadtxt(expdir + 'flatdata.csv', delimiter=',').flatten()
# params = np.loadtxt(expdir + 'buffer_estimate_result.csv')[2:]
# means = params[0::3]
# variances = params[1::3]
# mix_weights = params[2::3]
# sigprob = lambda x: np.sum([w * st.norm.pdf(x, loc=m, scale=np.sqrt(v)) for w, m, v in zip(means, variances, mix_weights)], axis=0)
# nullprob = lambda x: st.norm.pdf(x)
# postprob = (sigprob(data) * (1-lis)) / (sigprob(data) * (1-lis) + nullprob(data) * lis)
# discovered = calc_fdr(postprob, 0.1)

# Step-up procedure for LIS
alpha = 0.1 # FDR level
lis_orders = np.argsort(lis)[::1]
lis_sum = 0
max_i = len(lis)
for i, s in enumerate(lis_orders):
    lis_sum += lis[s]
    threshold = 1. / (1. + i) * lis_sum
    if threshold > alpha:
        max_i = i
        break

# Save the discoveries to file
discovered = np.zeros((128,128))
selected = lis_orders[:max_i]
discovered = discovered.flatten()
discovered[selected] = 1
discovered = discovered.reshape((128,128))
np.savetxt(expdir + 'hmrf_discoveries.csv', discovered, delimiter=',', fmt='%d')
back to top