Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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.")