def testNormal(plot = False, perc = 1e-3): N = int(1e6) # effective number of simulations: iterations = int(1e2) y = nrm.likelihood.simul(3,100) eps = ABC.findEpsilon(y = y, iterations = N, prior = nrm.prior, likelihood = nrm.likelihood, dist = misc.euclidean_dist, perc = perc, sum_statistics = misc.meanVar) thetas_all = [] t0 = time.clock() thetas, zs = ABC.sampler(y = y, iterations = iterations, prior = nrm.prior, likelihood = nrm.likelihood, dist = misc.euclidean_dist, tolerance = eps, sum_statistics = misc.meanVar) thetas_all.append(thetas) t1 = time.clock() if plot: misc.plotDensity(thetas_all, meanPrior = 0, sigmaPrior = 100, empMean = np.mean(y), sigma = 4, n = 100) print(np.mean(thetas)) return(t1-t0)
def test_MA2_samplers(which = "basic", noisy = False, generator = "MA(2)", naive = True, exactBF = False): # simulate observation if generator == "MA(2)": y = MA2.likelihood.simul(theta = [0.6,0.2], n = 100+2) elif generator == "MA(1)": y = MA1.likelihood.simul(theta = 0.6, n = 100+1) else: raise ValueError("Invalid name of the generator, " "only MA(1) and MA(2) are allowed.") # total number of simulations N = int(1e6) # expected proportion of accepted simulations perc = 1e-3 # effective number of simulations: iterations = int(N * perc) if which == "MCMC": eps = 60 thetas, zs = ABC.MCMCsampler(y = y, iterations = iterations, prior = MA2.prior, likelihood = MA2.likelihood, dist = misc.euclidean_dist, tolerance = eps, sum_statistics = misc.autocov, transKernel = MA2.transKernel) misc.plot_thetas(thetas) elif which == "basic": eps = ABC.findEpsilon(y = y, iterations = N, prior = MA2.prior, likelihood = MA2.likelihood, dist = misc.euclidean_dist, perc = perc, sum_statistics = misc.autocov) thetas, zs = ABC.sampler(y = y, iterations = iterations, prior = MA2.prior, likelihood = MA2.likelihood, dist = misc.euclidean_dist, tolerance = eps, sum_statistics = misc.autocov) misc.plot_thetas(thetas) elif which == "importance": thetas, zs, weights = ABC.importanceSampler(y = y, iterations = int(1e5), prior = MA2.prior, likelihood = MA2.likelihood, proposal = MA2.proposal, densKernel = MA2.densKernel, bandwidth = 10, sum_statistics = misc.autocov, noisy = noisy) out = np.sum([t * w for t,w in zip(thetas, weights)],axis = 0)/np.sum(weights) print("Evaluation of E[theta] using importance sampler gives: ", out) elif which == "KernelMCMC": thetas, zs = ABC.kernelMCMCSampler(y = y, iterations = int(1e4), prior = MA2.prior, likelihood = MA2.likelihood, densKernel = MA2.densKernel, bandwidth = 10, transKernel = MA2.transKernel, sum_statistics = misc.autocov, dist = misc.euclidean_dist, tolerance = 10, noisy = noisy) misc.plot_thetas(thetas) elif which == "modelChoiceSampler": eps = ABCv.findEpsilon(y = y, iterations = N, prior = MA2.prior, likelihood = MA2.likelihood, dist = misc.euclidean_dist_multi, perc = np.array([0.01,0.001, 0.0001, 0.00001]), sum_statistics = misc.autocov) if naive: evs = [] for e in eps: thetas, zs, ms = ABC.modelChoiceSampler(y = y, iterations = iterations, paramPriors = [MA1.prior, MA2.prior], likelihoods = [MA1.likelihood, MA2.likelihood], modelPrior = misc.twoModelsPrior, dist = misc.euclidean_dist, tolerance = 7, sum_statistics = misc.autocov) ev0 = len([m for m in ms if m == 0])/len(ms) evs.append(ev0) else: evs = [] for e in eps: ms = ABCv.modelChoiceSampler(y = y, iterations = N, paramPriors = [MA1.prior, MA2.prior], likelihoods = [MA1.likelihood, MA2.likelihood], modelPrior = misc.twoModelsPrior, dist = misc.euclidean_dist_multi, tolerance = e, sum_statistics = misc.autocov) ev0 = ms[0]/(ms[0]+ms[1]) evs.append(ev0) misc.plotMAModSel(evs) if exactBF: print("Finding actual Bayes Factor...\n") ev0exact = bf.MALogBayesFactor(y, resolution=(100,200)) for e in evs: misc.printModelChoice("MA(1)", "MA(2)", e, ev0exact) else: raise ValueError("Invalid name of tested model.")