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)
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)
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))
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
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
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))