Пример #1
0
 def test_invalid(self):
     """Test the interval function catches invalid intervals"""
     x = np.array([-5, -3, -2, -2, 100])
     with self.assertRaises(ValueError):
         npinterval.interval(x, 1.01)
     with self.assertRaises(ValueError):
         npinterval.interval(x, 0)
Пример #2
0
 def test_single(self):
     """Test the interval warns if only 1 sample is included"""
     # Don't know how to test warnings below python 3.2
     if sys.version_info[0] + 0.1*sys.version_info[1] < 3.2:
         return
     x = np.array([-5, -3, -2, -2, 100])
     with self.assertWarns(RuntimeWarning):
         npinterval.interval(x, 1/5)
Пример #3
0
 def test_intervals(self):
     """Test the interval function correctly computes valid intervals"""
     x = np.array([-5, -3, -2, -2, 100])
     self.assertEqual(
         npinterval.interval(x, 2/5),
         (-2, -2, 2, 4))
     self.assertEqual(
         npinterval.interval(x, 3/5),
         (-3, -2, 1, 4))
     self.assertEqual(
         npinterval.interval(x, 4/5),
         (-5, -2, 0, 4))
Пример #4
0
def run_mcmc(meas, x, nsamples, covm=None, scales=None):
    """
    Sample the likelihood space with a Markov Chain Monte Carlo.

    :param meas: TemplateMeasurement
        measurement whose spectrum likelihood space is to be probe
    :param x: [float]
        parameter values where to start the chain
    :param covm: [[float]]
        covariance matrix values if sampling transformed space
    :param scales: [float]
        parameter scales if not sampling transformed space
    :return: [float], [float], [float], pymcmc.MCMC
        posterior mean, lower CI, upper CI for each parameter, and the MCMC
        object used for sampling
    """
    mcmc = MCMC(meas.spec.npars)
    mcmc.set_values(x)

    if covm is not None and scales is None:
        mcmc.set_covm(covm)
    elif scales is not None:
        mcmc.set_scales(scales)
    else:
        raise ValueError("Must provide covariance OR scales")

    mcmc.rescale = 2  # good starting point
    mcmc.learn_scale(meas.spec.ll, 1000)

    mcmc.run(meas.spec.ll, nsamples)

    mean = list()
    mean_down = list()
    mean_up = list()

    for ipar in range(meas.spec.npars):
        mean.append(np.mean(mcmc.data[:, ipar]))
        low, high, _, _ = npinterval.interval(mcmc.data[:, ipar], 0.6827)
        mean_down.append(low-mean[-1])
        mean_up.append(high-mean[-1])

    return mean, mean_down, mean_up, mcmc
Пример #5
0
def run_mcmc(meas, x, nsamples, covm=None, scales=None):
    """
    Sample the likelihood space with a Markov Chain Monte Carlo.

    :param meas: TemplateMeasurement
        measurement whose spectrum likelihood space is to be probe
    :param x: [float]
        parameter values where to start the chain
    :param covm: [[float]]
        covariance matrix values if sampling transformed space
    :param scales: [float]
        parameter scales if not sampling transformed space
    :return: [float], [float], [float], pymcmc.MCMC
        posterior mean, lower CI, upper CI for each parameter, and the MCMC
        object used for sampling
    """
    mcmc = MCMC(meas.spec.npars)
    mcmc.set_values(x)

    if covm is not None and scales is None:
        mcmc.set_covm(covm)
    elif scales is not None:
        mcmc.set_scales(scales)
    else:
        raise ValueError("Must provide covariance OR scales")

    mcmc.rescale = 2  # good starting point
    mcmc.learn_scale(meas.spec.ll, 1000)

    mcmc.run(meas.spec.ll, nsamples)

    mean = list()
    mean_down = list()
    mean_up = list()

    for ipar in range(meas.spec.npars):
        mean.append(np.mean(mcmc.data[:, ipar]))
        low, high, _, _ = npinterval.interval(mcmc.data[:, ipar], 0.6827)
        mean_down.append(low - mean[-1])
        mean_up.append(high - mean[-1])

    return mean, mean_down, mean_up, mcmc
Пример #6
0
 def test_full(self):
     """Test the interval function correctly finds the full interval"""
     x = np.array([-5, -3, -2, -2, 100])
     self.assertEqual(
         npinterval.interval(x, 1),
         (-5, 100, 0, 5))