Esempio n. 1
0
    def test_univariate_sim_only_x_only(self):
        """
        Tests setup for univariate sim only where we only use an x input, not t.
        """
        m = 700  # number of simulated observations
        p = 3  # dimension of x (simulation inputs)

        x = 0.5 * np.random.uniform(-1, 3, (m, p))
        y = 5 * np.random.normal(0, 1, m) + 2
        d = SepiaData(x_sim=x, y_sim=y, t_sim=None)

        print('Testing univariate sim-only SepiaData...')
        print(d)
        self.assertTrue(d.obs_data is None)
        self.assertTrue(d.sim_only)
        self.assertTrue(d.scalar_out)

        d.transform_xt()
        self.assertTrue(np.all(np.min(d.sim_data.x_trans, 0) == 0))
        self.assertTrue(np.all(np.max(d.sim_data.x_trans, 0) == 1))

        d.standardize_y(center=False, scale=False)
        self.assertEqual(d.sim_data.orig_y_sd, 1)
        self.assertEqual(d.sim_data.orig_y_mean, 0)
        self.assertTrue(np.allclose(d.sim_data.y, d.sim_data.y_std))

        d.standardize_y(scale='columnwise')
        self.assertTrue(np.allclose(d.sim_data.orig_y_sd, 5, rtol=0.1))
        self.assertTrue(np.allclose(np.mean(d.sim_data.y_std, 0), 0, rtol=0.1))
        self.assertTrue(np.allclose(np.std(d.sim_data.y_std, 0), 1, rtol=0.1))
        self.assertTrue(d.sim_data.y.shape == d.sim_data.y_std.shape)

        d.create_K_basis(10)
        d.create_D_basis()
Esempio n. 2
0
    def setUp(self, m=100, n=1, nt_sim=50, nt_obs=20, n_theta=3, n_basis=5, sig_n=0.1, seed=42):
        n_hier = 3
        self.hier_idx = np.array([[0, 0, 0]])
        #self.hier_idx = np.array([[1, 1, 1], [2, -1, 2]]) # TODO this fails for multivariate; cant use for univariate now
        multi_data_list = []
        univ_data_list = []
        for si in range(n_hier):
            multi_data_dict = generate_data.generate_multi_sim_and_obs(m=m, n=n, nt_sim=nt_sim, nt_obs=nt_obs,
                                                                       n_theta=n_theta, n_basis=n_basis,
                                                                       sig_n=sig_n, seed=seed)
            univ_data_dict = generate_data.generate_univ_sim_and_obs(m=m, n=n, sig_n=sig_n, seed=seed)

            d = SepiaData(t_sim=univ_data_dict['t_sim'], y_sim=univ_data_dict['y_sim'], y_obs=univ_data_dict['y_obs'])
            d.transform_xt()
            d.standardize_y()
            univ_data_list.append(d)

            d = SepiaData(t_sim=multi_data_dict['t_sim'], y_sim=multi_data_dict['y_sim'],
                          y_ind_sim=multi_data_dict['y_ind_sim'], y_obs=multi_data_dict['y_obs'],
                          y_ind_obs=multi_data_dict['y_ind_obs'])
            d.transform_xt()
            d.standardize_y()
            d.create_K_basis(5)
            d.create_D_basis('constant')
            multi_data_list.append(d)

        self.univ_model_list = [SepiaModel(d) for d in univ_data_list]
        self.multi_model_list = [SepiaModel(d) for d in multi_data_list]
Esempio n. 3
0
    def test_univariate_sim_and_obs(self):
        """
        Tests univiariate sim and obs where we pass in both x and t.
        """
        m = 700  # number of simulated observations
        p = 3  # dimension of x (sim/obs inputs)
        q = 2  # dimension of t (extra sim inputs)
        n = 5  # number of observed observations

        x_sim = np.random.uniform(-1, 3, (m, p))
        t = np.random.uniform(-10, 10, (m, q))
        x_obs = np.random.uniform(-1.5, 3.5, (n, p))
        y_sim = 5 * np.random.normal(0, 1, m) + 2
        y_obs = 5 * np.random.normal(0, 1, n) + 1
        d = SepiaData(x_sim=x_sim,
                      y_sim=y_sim,
                      t_sim=t,
                      x_obs=x_obs,
                      y_obs=y_obs)

        print('Testing univariate sim and obs SepiaData...')
        print(d)
        self.assertTrue(d.obs_data is not None)
        self.assertTrue(not d.sim_only)
        self.assertTrue(d.scalar_out)

        d.transform_xt()
        self.assertTrue(np.all(np.min(d.sim_data.x_trans, 0) == 0))
        self.assertTrue(np.all(np.max(d.sim_data.x_trans, 0) == 1))
        self.assertTrue(np.all(np.min(d.sim_data.t_trans, 0) == 0))
        self.assertTrue(np.all(np.max(d.sim_data.t_trans, 0) == 1))

        d.transform_xt(-10, 10)
        self.assertTrue(np.all(np.min(d.sim_data.x_trans, 0) == -10))
        self.assertTrue(np.all(np.max(d.sim_data.x_trans, 0) == 10))
        self.assertTrue(np.all(np.min(d.sim_data.t_trans, 0) == -10))
        self.assertTrue(np.all(np.max(d.sim_data.t_trans, 0) == 10))

        d.standardize_y(center=False, scale=False)
        self.assertEqual(d.sim_data.orig_y_sd, 1)
        self.assertEqual(d.sim_data.orig_y_mean, 0)
        self.assertTrue(np.allclose(d.sim_data.y, d.sim_data.y_std))
        self.assertEqual(d.obs_data.orig_y_sd, 1)
        self.assertEqual(d.obs_data.orig_y_mean, 0)
        self.assertTrue(np.allclose(d.obs_data.y, d.obs_data.y_std))

        d.standardize_y(scale='columnwise')
        self.assertTrue(np.allclose(d.sim_data.orig_y_sd, 5, rtol=0.1))
        self.assertTrue(np.allclose(d.sim_data.orig_y_mean, 2, rtol=0.1))
        self.assertTrue(np.allclose(np.mean(d.sim_data.y_std, 0), 0, rtol=0.1))
        self.assertTrue(np.allclose(np.std(d.sim_data.y_std, 0), 1, rtol=0.1))
        self.assertTrue(d.sim_data.y.shape == d.sim_data.y_std.shape)
        self.assertTrue(np.allclose(d.obs_data.orig_y_sd, 5, rtol=0.1))
        self.assertTrue(np.allclose(d.obs_data.orig_y_mean, 2, rtol=0.1))
        self.assertTrue(d.obs_data.y.shape == d.obs_data.y_std.shape)

        d.create_K_basis(10)
        d.create_D_basis()
Esempio n. 4
0
def setup_multi_sim_and_obs(m=100,
                            n=10,
                            nt_sim=20,
                            nt_obs=15,
                            noise_sd=0.1,
                            nx=5,
                            n_pc=10,
                            seed=42.,
                            n_lik=0,
                            n_mcmc=0,
                            n_pred=0,
                            fix_K=False):
    try:
        eng = matlab.engine.start_matlab()
        eng.cd(root_path)
        eng.addpath('matlab/', nargout=0)
        res = eng.setup_multi_sim_and_obs(m,
                                          n,
                                          nt_sim,
                                          nt_obs,
                                          noise_sd,
                                          nx,
                                          n_pc,
                                          seed,
                                          n_lik,
                                          n_mcmc,
                                          n_pred,
                                          nargout=1)
        eng.quit()
    except Exception as e:
        print(e)
        print(
            'Matlab error; make sure matlab.engine installed, check Matlab code for errors.'
        )
    y = np.array(res['y'], dtype=float)
    y_ind = np.array(res['y_ind'], dtype=float).squeeze()
    xt = np.array(res['xt'], dtype=float)
    y_obs = np.array(res['y_obs'], dtype=float)
    y_ind_obs = np.array(res['y_ind_obs'], dtype=float).squeeze()
    x_obs = np.array(res['x_obs'], dtype=float)
    data = SepiaData(x_sim=xt[:, 0][:, None],
                     t_sim=xt[:, 1:],
                     y_sim=y,
                     y_ind_sim=y_ind,
                     x_obs=x_obs,
                     y_obs=y_obs,
                     y_ind_obs=y_ind_obs)
    data.standardize_y()
    data.transform_xt()
    if fix_K:  # means use the K from matlab - avoid issues with positive/negative component ambiguity
        data.create_K_basis(n_pc, K=np.array(res['K']).T)
    else:
        data.create_K_basis(n_pc)
    data.create_D_basis('constant')
    print(data)
    model = SepiaModel(data)
    return model, res
Esempio n. 5
0
def create_test_case():
    n_obs = 2
    n_sim = 5
    p = 3
    q = 4
    ell_sim = 80
    ell_obs = 20
    t = np.random.uniform(0, 1, (n_sim, q))
    x = 0.5 * np.ones((n_sim, p))
    y_ind = np.linspace(0, 100, ell_sim)
    y = 10 * np.random.normal(
        0, 1,
        (n_sim, 1)) * (y_ind[None, :] - 50)**2 / 75. + 20 * np.random.normal(
            0, 1, (n_sim, 1)) * y_ind[None, :] + 20 * np.random.normal(
                0, 1, (n_sim, 1))

    x_obs = 0.5 * np.ones((n_obs, p))
    y_obs_ind = np.linspace(10, 85, ell_obs)
    y_obs = 10 * np.random.normal(0, 1, (n_obs, 1)) * (
        y_obs_ind[None, :] - 50)**2 / 75. + 20 * np.random.normal(
            0, 1, (n_obs, 1)) * y_obs_ind[None, :] + 20 * np.random.normal(
                0, 1, (n_obs, 1))

    data = SepiaData(x_sim=x,
                     t_sim=t,
                     y_sim=y,
                     y_ind_sim=y_ind,
                     x_obs=x_obs,
                     y_obs=y_obs,
                     y_ind_obs=y_obs_ind)
    data.standardize_y()
    data.transform_xt()
    data.create_K_basis(n_pc=3)
    data.create_D_basis('constant')

    # Save as matfile for testing in matlab
    savedict = {
        't': t,
        'y': y,
        'y_obs': y_obs,
        'D': data.obs_data.D,
        'Kobs': data.obs_data.K,
        'Ksim': data.sim_data.K,
        'y_obs_std': data.obs_data.y_std,
        'y_sim_std': data.sim_data.y_std,
        'y_sd': data.sim_data.orig_y_sd
    }
    scipy.io.savemat('data/test_case_matlab.mat', savedict)

    g = setup_model(data)

    # Save pickle file of results
    savedict = {'model': g, 'data': data}
    with open('data/test_case_python_model.pkl', 'wb') as f:
        pickle.dump(savedict, f)
Esempio n. 6
0
    def test_multivariate_sim_only_x_only(self):
        """
        Tests setup for multivariate sim only where we only use an x input, not t.
        """
        m = 700  # number of simulated observations
        p = 3  # dimension of x (simulation inputs)
        ell = 1000  # dimension of y output
        pu = 3  # number of PCs

        y_ind = np.linspace(0, 100, ell)
        K_true = np.vstack([
            0.5 * (np.sin(y_ind) + 1),
            np.square(-y_ind + 50) / 2500, y_ind / 100
        ])
        y = np.transpose(
            np.log(1 + y_ind)[:, None] + np.dot(
                K_true.T, 2 * np.array([1, 0.5, 0.2])[:, None] *
                np.random.normal(0, 1, (pu, m))))
        x = 0.5 * np.random.uniform(-1, 3, (m, p))
        d = SepiaData(x_sim=x, y_sim=y, t_sim=None, y_ind_sim=y_ind)

        print('Testing multivariate sim-only SepiaData...')
        print(d)
        self.assertTrue(d.obs_data is None)
        self.assertTrue(d.sim_only)
        self.assertTrue(not d.scalar_out)

        d.transform_xt()
        self.assertTrue(np.all(np.min(d.sim_data.x_trans, 0) == 0))
        self.assertTrue(np.all(np.max(d.sim_data.x_trans, 0) == 1))

        d.transform_xt(-10, 10)
        self.assertTrue(np.all(np.min(d.sim_data.x_trans, 0) == -10))
        self.assertTrue(np.all(np.max(d.sim_data.x_trans, 0) == 10))

        d.standardize_y(center=False, scale=False)
        self.assertEqual(d.sim_data.orig_y_sd, 1)
        self.assertEqual(d.sim_data.orig_y_mean, 0)
        self.assertTrue(np.allclose(d.sim_data.y, d.sim_data.y_std))

        d.standardize_y(scale='columnwise')
        self.assertTrue(
            np.allclose(d.sim_data.orig_y_mean,
                        np.log(1 + y_ind),
                        rtol=0.1,
                        atol=0.5))
        self.assertTrue(np.allclose(np.std(d.sim_data.y_std, 0), 1, rtol=0.1))
        self.assertTrue(np.allclose(np.mean(d.sim_data.y_std, 0), 0, rtol=0.1))
        self.assertTrue(d.sim_data.y.shape == d.sim_data.y_std.shape)

        d.create_K_basis(3)
        self.assertTrue(d.sim_data.K.shape == (pu, ell))
        d.create_D_basis()
        print(d)
Esempio n. 7
0
    def setUp(self, m=100, n=1, nt_sim=50, nt_obs=20, n_theta=3, n_basis=5, sig_n=0.1, seed=42):
        multi_data_dict = generate_data.generate_multi_sim_and_obs(m=m, n=n, nt_sim=nt_sim, nt_obs=nt_obs,
                                                                   n_theta=n_theta, n_basis=n_basis,
                                                                   sig_n=sig_n, seed=seed)
        univ_data_dict = generate_data.generate_univ_sim_and_obs(m=m, n=n, sig_n=sig_n, seed=seed)

        d = SepiaData(t_sim=univ_data_dict['t_sim'], y_sim=univ_data_dict['y_sim'])
        d.transform_xt()
        d.standardize_y()
        self.univ_sim_only_data = d

        d = SepiaData(t_sim=univ_data_dict['t_sim'], y_sim=univ_data_dict['y_sim'], y_obs=univ_data_dict['y_obs'])
        d.transform_xt()
        d.standardize_y()
        self.univ_sim_and_obs_data = d

        d = SepiaData(t_sim=multi_data_dict['t_sim'], y_sim=multi_data_dict['y_sim'],
                      y_ind_sim=multi_data_dict['y_ind_sim'])
        d.transform_xt()
        d.standardize_y()
        d.create_K_basis(5)
        self.multi_sim_only_data = d

        d = SepiaData(t_sim=multi_data_dict['t_sim'], y_sim=multi_data_dict['y_sim'],
                      y_ind_sim=multi_data_dict['y_ind_sim'], y_obs=multi_data_dict['y_obs'],
                      y_ind_obs=multi_data_dict['y_ind_obs'])
        d.transform_xt()
        d.standardize_y()
        d.create_K_basis(5)
        self.multi_sim_and_obs_noD_data = d

        d = SepiaData(t_sim=multi_data_dict['t_sim'], y_sim=multi_data_dict['y_sim'],
                      y_ind_sim=multi_data_dict['y_ind_sim'], y_obs=multi_data_dict['y_obs'],
                      y_ind_obs=multi_data_dict['y_ind_obs'])
        d.transform_xt()
        d.standardize_y()
        d.create_K_basis(5)
        d.create_D_basis('linear')
        self.multi_sim_and_obs_data = d
Esempio n. 8
0
def setup_neddermeyer(seed=42., n_mcmc=100, sens=1, n_burn=0, n_lev=0):
    try:
        eng = matlab.engine.start_matlab()
        eng.cd(root_path)
        eng.addpath('matlab/', nargout=0)
        #dataStruct = eng.neddeg(0, nargout=1)
        res = eng.setup_neddermeyer(seed, n_mcmc, sens, n_burn, n_lev)
        eng.quit()
    except Exception as e:
        print(e)
        print(
            'Matlab error; make sure matlab.engine installed, check Matlab code for errors.'
        )

    # get python model
    import pickle
    data_dict = pickle.load(
        open('../../examples/Neddermeyer/pkls/nedderDataDict.pkl', 'rb'))
    data = SepiaData(x_sim=data_dict['x_sim'],t_sim=data_dict['t_sim'],y_sim=data_dict['y_sim'],\
                 y_ind_sim=data_dict['y_ind_sim'],x_obs=data_dict['x_obs'],y_obs=data_dict['y_obs'],\
                 y_ind_obs=data_dict['y_ind_obs'])
    data.transform_xt()
    # set orig sim vals and Ksim
    data.sim_data.orig_y_mean = data_dict['sim_orig_y_mean']
    data.sim_data.orig_y_sd = data_dict['sim_orig_y_sd']
    data.sim_data.y_std = data_dict['sim_y_std']
    data.sim_data.K = data_dict['Ksim']
    # set orig obs vals and Kobs
    data.obs_data.orig_y_mean = data_dict['obs_orig_y_mean']
    data.obs_data.orig_y_sd = data_dict['obs_orig_y_sd']
    data.obs_data.y_std = data_dict['obs_orig_y_std']
    data.obs_data.K = data_dict['Kobs']
    # call create_D_basis
    data.create_D_basis(D_obs=data_dict['Dobs'], D_sim=data_dict['Dsim'])
    model = SepiaModel(data)

    return model, res
Esempio n. 9
0
    def test_multivariate_sim_and_obs_lik(self):
        """
        Tests log lik for multivariate sim and obs model
        """

        d = SepiaData(t_sim=self.multi_data_dict['t_sim'],
                      y_sim=self.multi_data_dict['y_sim'],
                      y_ind_sim=self.multi_data_dict['y_ind_sim'],
                      y_obs=self.multi_data_dict['y_obs'],
                      y_ind_obs=self.multi_data_dict['y_ind_obs'])
        print('Testing multivariate sim-only SepiaLogLik...', flush=True)
        print(d, flush=True)

        d.transform_xt()
        d.standardize_y()
        d.create_K_basis(5)
        d.create_D_basis('linear')
        model = setup_model(d)

        model.logLik()

        for param in model.params.mcmcList:
            for cindex in range(int(np.prod(param.val_shape))):
                model.logLik(cvar=param.name, cindex=cindex)
Esempio n. 10
0
    def test_multivariate_sim_and_obs_setup(self):
        """
        Tests setup for multivariate sim and obs model with D
        """

        d = SepiaData(t_sim=self.data_dict['t_sim'],
                      y_sim=self.data_dict['y_sim'],
                      y_ind_sim=self.data_dict['y_ind_sim'],
                      y_obs=self.data_dict['y_obs'],
                      y_ind_obs=self.data_dict['y_ind_obs'])
        print(
            'Testing multivariate sim and obs SepiaModelSetup with discrep...',
            flush=True)
        print(d, flush=True)

        # Try it without doing standardization/transform/pc basis to be sure it doesn't break
        model_notrans = setup_model(copy.deepcopy(d))

        # Do explicit transformation
        d.transform_xt()
        d.standardize_y()
        d.create_K_basis(n_pc=5)
        d.create_D_basis(type='constant')
        d.create_D_basis(type='linear')
        custom_D = np.vstack(
            [np.ones(d.obs_data.y.shape[1]), d.obs_data.y_ind])
        d.create_D_basis(D_obs=custom_D)
        model = setup_model(d)

        # Check that either way gives same transformation
        self.assertTrue(
            np.allclose(model_notrans.data.sim_data.orig_y_mean,
                        model.data.sim_data.orig_y_mean))
        self.assertTrue(
            np.allclose(model_notrans.data.sim_data.orig_y_sd,
                        model.data.sim_data.orig_y_sd))
        self.assertTrue(
            np.allclose(model_notrans.data.sim_data.y_std,
                        model.data.sim_data.y_std))
        self.assertTrue(
            np.allclose(model_notrans.data.sim_data.t_trans,
                        model.data.sim_data.t_trans))
        self.assertTrue(
            np.allclose(model_notrans.data.obs_data.orig_y_mean,
                        model.data.obs_data.orig_y_mean))
        self.assertTrue(
            np.allclose(model_notrans.data.obs_data.orig_y_sd,
                        model.data.obs_data.orig_y_sd))
        self.assertTrue(
            np.allclose(model_notrans.data.obs_data.y_std,
                        model.data.obs_data.y_std))

        # Check model components are set up as expected
        self.assertTrue(not model.num.scalar_out)
        self.assertTrue(not model.num.sim_only)
        self.assertTrue(model.num.m == 100)
        self.assertTrue(model.num.n == 1)
        self.assertTrue(model.num.p == 1)
        self.assertTrue(model.num.q == 3)
        self.assertTrue(model.num.pu == 5)
        self.assertTrue(model.num.pv == 2)
        #self.assertTrue(np.allclose(model.num.w, model.data.sim_data.y_std)) # TODO compute projection
        #self.assertTrue(np.allclose(model.num.u, model.data.obs_data.y_std)) # TODO compute projection
        # self.assertTrue(np.allclose(model.num.v, model.data.obs_data.y_std)) # TODO compute projection

        # Check parameter setup -- betaU
        betaU = model.params.betaU
        self.assertTrue(betaU.val_shape == (model.num.q + model.num.p,
                                            model.num.pu))
        self.assertTrue(betaU.prior.dist == 'Beta')
        self.assertTrue(betaU.mcmc.stepType == 'BetaRho')

        # Check parameter setup -- betaV
        betaV = model.params.betaV
        self.assertTrue(betaV.val_shape == (1, 1))
        self.assertTrue(betaV.prior.dist == 'Beta')
        self.assertTrue(betaV.mcmc.stepType == 'BetaRho')

        # Check parameter setup -- lamUz
        lamUz = model.params.lamUz
        self.assertTrue(lamUz.val_shape == (1, model.num.pu))
        self.assertTrue(lamUz.prior.dist == 'Gamma')
        self.assertTrue(lamUz.mcmc.stepType == 'PropMH')

        # Check parameter setup -- lamUz
        lamVz = model.params.lamVz
        self.assertTrue(lamVz.val_shape == (1, 1))
        self.assertTrue(lamVz.prior.dist == 'Gamma')
        self.assertTrue(lamVz.mcmc.stepType == 'PropMH')

        # Check parameter setup -- lamWOs
        lamWOs = model.params.lamWOs
        self.assertTrue(lamWOs.val_shape == (1, 1))
        self.assertTrue(lamWOs.prior.dist == 'Gamma')
        self.assertTrue(lamWOs.mcmc.stepType == 'PropMH')

        # Check parameter setup -- lamWs
        lamWs = model.params.lamWs
        self.assertTrue(lamWs.val_shape == (1, model.num.pu))
        self.assertTrue(lamWs.prior.dist == 'Gamma')
        self.assertTrue(lamWs.mcmc.stepType == 'PropMH')

        # Check parameter setup -- lamOs
        lamOs = model.params.lamOs
        self.assertTrue(lamOs.val_shape == (1, 1))
        self.assertTrue(lamOs.prior.dist == 'Gamma')
        self.assertTrue(lamOs.mcmc.stepType == 'PropMH')

        # Check parameter setup -- theta
        theta = model.params.theta
        self.assertTrue(theta.val_shape == (1, model.num.q))
        self.assertTrue(theta.prior.dist == 'Normal')
        self.assertTrue(theta.mcmc.stepType == 'Uniform')
        self.assertTrue(np.allclose(theta.orig_range[0], 0))
        self.assertTrue(np.allclose(theta.orig_range[1], 1))

        mcmc_list_names = [p.name for p in model.params.mcmcList]
        self.assertTrue(
            set(mcmc_list_names) == set([
                'betaU', 'betaV', 'lamUz', 'lamVz', 'lamWOs', 'lamWs', 'lamOs',
                'theta'
            ]))
data.standardize_y()
data.create_K_basis(2)

# Generate D matrix with normal kernels
D_grid = h_sim  # locations on which the kernels are centered
D_width = 1.5  # width of each kernel
pv = len(D_grid)
D_obs = np.zeros(shape=(data.obs_data.y_ind.shape[0], pv))
D_sim = np.zeros(shape=(data.sim_data.y_ind.shape[0], pv))
h_dense = data_dict['h_dense']
D_dense = np.zeros(shape=(h_dense.shape[0], pv))
for j in range(pv):
    D_obs[:, j] = norm.pdf(h_field, D_grid[j], D_width)
    D_sim[:, j] = norm.pdf(h_sim, D_grid[j], D_width)
    D_dense[:, j] = norm.pdf(h_dense, D_grid[j], D_width)
data.create_D_basis(D_obs=D_obs.T, D_sim=D_sim)
#
# Data setup completed
#

nmcmc = 5000
#
# Standard mcmc reference model setup and sampling
#
model_ref = SepiaModel(data)
model_ref.tune_step_sizes(50, 20, verbose=False)
# burn in the model. This is qualitative, and needs to be assessed on trace plots
# This model is actually OK, but do 10 samples for 'burn-in'
model_ref.do_mcmc(10, prog=False)
# and discard those samples
model_ref.clear_samples()
Esempio n. 12
0
D_obs = np.zeros(shape=(len(h_field), pv))
D_sim = np.zeros(shape=(len(h_sim), pv))
D_dense = np.zeros(shape=(len(h_dense), pv))
# create each kernel
for j in range(pv):
    # create kernel j for each experiment
    D_obs[:, j] = norm.pdf(h_field, D_grid[j], D_width)
    D_sim[:, j] = norm.pdf(h_sim, D_grid[j], D_width)
    D_dense[:, j] = norm.pdf(h_dense, D_grid[j], D_width)

# normalize D to match priors (not needed for D_obs, done in create_D_basis())
D_max = np.max(np.matmul(D_sim, D_sim.T))
D_sim = D_sim / np.sqrt(D_max)
D_dense = D_dense / np.sqrt(D_max)

data.create_D_basis(D_obs=D_obs.T)

plt.ylim(-.5, 1.5)
plt.xlim(0, 25)
plt.plot(h_dense, D_dense)
#plt.plot(h_field,D_obs)
plt.xlabel("Height (m)")
plt.ylabel("Basis elements d_i")
plt.title("D (dense grid)")
plt.show()

print(data)

#%% We can visually check that our principal component weights are reasonable.
# In an ideal setting, weights would follow a standard normal distribution.
data.plot_K_weights()
Esempio n. 13
0
    def test_predict_uv_from_multi_obs(self):

        show_figs = True
        exclude_burnin = True
        n_pc = 2
        seed = 42.
        lamWOs_init = 50000.  # use 0 to use default lamWOs initial value
        nsamp = 100
        nburn = 0
        # Open data from matlab
        script_path = os.path.dirname(os.path.realpath(__file__))
        mat_fn = '%s/data/multi_sim_and_obs_mcmc_test.mat' % script_path
        if os.path.isfile(mat_fn):
            # if the matlab data is already in place, just load that
            print(
                'Found matfile, loading from multi_sim_and_obs_mcmc_test.mat \n'
            )
            matfile = scipy.io.loadmat(mat_fn)
        else:
            print('Generating matfile multi_sim_and_obs_mcmc_test.mat \n')
            # Run matlab code, then open data from matlab
            script_path = os.path.dirname(os.path.realpath(__file__))

            # Run matlab code, then open data from matlab
            try:
                eng = matlab.engine.start_matlab()
                eng.cd(script_path)
                eng.addpath('matlab/', nargout=0)
                eng.multi_sim_and_obs_mcmc_test(nsamp,
                                                nburn,
                                                seed,
                                                lamWOs_init,
                                                n_pc,
                                                0,
                                                nargout=0)
                eng.quit()
                matfile = scipy.io.loadmat(
                    '%s/data/multi_sim_and_obs_mcmc_test.mat' % script_path)
            except Exception as e:
                print(e)
                print('make sure matlab.engine installed')

        nburn = int(matfile['nburn'])
        nsamp = int(matfile['nsamp'])

        y_sim = matfile['y'].T
        y_ind_sim = matfile['y_ind'].squeeze()
        xt_sim = matfile['x']
        y_obs = matfile['y_obs']
        y_ind_obs = matfile['y_ind_obs'].squeeze()
        x_obs = matfile['x_obs']
        data = SepiaData(x_sim=xt_sim[:, 0][:, None],
                         t_sim=xt_sim[:, 1][:, None],
                         y_sim=y_sim,
                         y_ind_sim=y_ind_sim,
                         x_obs=x_obs,
                         y_obs=y_obs,
                         y_ind_obs=y_ind_obs)
        data.standardize_y()
        data.transform_xt()
        data.create_K_basis(n_pc=n_pc)
        data.create_D_basis(D=matfile['Dobs'].T)
        print(data)

        np.random.seed(int(seed))
        model = setup_model(data)
        if lamWOs_init > 0:
            model.params.lamWOs.val = np.array([[lamWOs_init]])

        t_start = time()
        model.do_mcmc(nburn + nsamp)
        t_end = time()
        print('Python mcmc time %0.3g s' % (t_end - t_start))
        print('Matlab mcmc time %0.3g s' % matfile['mcmc_time'])

        np.random.seed(int(seed))
        psamps = model.get_samples(0, sampleset=[0, 4], flat=True)
        #pred = uvPred([0.5], psamps, model.num, model.data, returnMuSigma=True, useAltW=True)
        pred = uvPred([0.5], psamps, model.num, model.data, returnMuSigma=True)
        print('Samples of u are:')
        print(pred.u.squeeze())
        print('Matlab Samples of u are:')
        print(matfile['pred2_u'].squeeze())

        print('Samples of v are:')
        print(pred.v.squeeze())
        print('Matlab Samples of v are:')
        print(matfile['pred2_v'].squeeze())

        print('Mu are:')
        print(pred.mu.squeeze())
        print('Matlab Mu are:')
        print(matfile['pred2_Myhat'])

        print('Sigma are:')
        print(pred.sigma.squeeze().reshape(14, 7).T)
        print('Matlab Sigma are:')
        print(matfile['pred2_Syhat'].squeeze())

        print('Checking predicted realizations...')
        self.assertTrue(
            np.allclose(matfile['pred2_u'].squeeze(), pred.u.squeeze()))
        self.assertTrue(
            np.allclose(matfile['pred2_v'].squeeze(), pred.v.squeeze()))
        print('Checking predicted means...')
        self.assertTrue(
            np.allclose(matfile['pred2_Myhat'].squeeze(), pred.mu.squeeze()))
        print('Checking predicted sigmas...')
        self.assertTrue(
            np.allclose(matfile['pred2_Syhat'].squeeze(),
                        pred.sigma.squeeze().reshape(14, 7).T))

        print('Done.')
Esempio n. 14
0
print(data)

plt.plot(data.sim_data.y_ind, data.sim_data.y.T)
plt.plot(data.obs_data.y_ind, data.obs_data.y.T, 'k.', linewidth=3)
plt.title('Synthetic data (obs. in black)')
plt.xlabel('y index')
plt.ylabel('y')
plt.show()

#%%

data.transform_xt()
data.standardize_y('columnwise')
data.create_K_basis(5)
data.create_D_basis(type='linear')

print(data)

#%%

model = setup_model(data)

#%%

cachefile_name = 'multivariate_example_with_prediction.pkl'
import os.path
import pickle

use_save_file = False
y_ind_obs = matfile['y_ind_obs'].squeeze()

data = SepiaData(x_sim=x_sim[:, 0][:, None],
                 t_sim=x_sim[:, 1][:, None],
                 y_sim=y_sim,
                 y_ind_sim=y_ind_sim,
                 x_obs=x_obs,
                 y_obs=y_obs,
                 y_ind_obs=y_ind_obs)
print(data)
data.standardize_y()
assert np.allclose(data.sim_data.y_std, matfile['ystd'].T, rtol=0.01)
data.transform_xt()
data.create_K_basis(n_pc=2)
assert np.allclose(data.sim_data.K, matfile['Ksim'].T, rtol=0.01)
data.create_D_basis(D=matfile['Dsim'].T)

model = setup_model(data)

ll = model.logLik()

print('sepia log lik: %0.5g, gpmsa log lik: %0.5g' % (ll, matfile['ll']))

if (0):
    nsamp = 100
    model.do_mcmc(nsamp)
    # Creates dict with each sampled variable name as key, array of samples (nsamp, ...) as value
    samples_dict = {
        p.name: np.array(p.mcmc.draws)
        for p in model.params.mcmcList
    }
with open(datadir+'desNative80x4Cg.txt','r') as f:
    sim_data = np.loadtxt(f)
x_sim = sim_data[:,0:2] # x = {R, rho_ball}
t_sim = sim_data[:,2:4] # t = {C, g}
with open(datadir+'simHeights101x1','r') as f:
    h_sim = np.loadtxt(f)
with open(datadir+'sims101x80Cg.txt','r') as f:
    y_sim = np.loadtxt(f).T

# create sepia data object
data = SepiaData(x_sim = x_sim, t_sim = t_sim, y_ind_sim = h_sim, y_sim = y_sim,\
                 x_obs = x_obs, y_obs = y_obs, y_ind_obs = h_obs)
data.transform_xt()
data.standardize_y()
data.create_K_basis(3)
data.create_D_basis('linear')
print(data)
model = setup_model(data)

#%% Ragged data and model setup
y_obs_ragged = [np.array(field_data[0:3,4]),np.array(field_data[3:6,4]),\
         np.array(field_data[6:9,4]),np.array(field_data[9:,4])]
h_obs_ragged = [np.array(field_data[0:3,3]),np.array(field_data[3:6,3]),\
         np.array(field_data[6:9,3]),np.array(field_data[9:,3])]# observed heights

#y_obs = [np.array(field_data[0:3,4]),np.array(field_data[3:6,4]),\
#         np.array(field_data[[7,9,11],4]),np.array(field_data[12:,4])]
#h_obs = [np.array(field_data[0:3,3]),np.array(field_data[3:6,3]),\
#         np.array(field_data[[7,9,11],3]),np.array(field_data[12:,3])]# observed heights

print(y_obs)
Esempio n. 17
0
    def test_full_setup_LL_pred(self):
        # Set up and check calibration model
        x_obs = np.ones((3, 2)) * np.array([0.5, 0.75, 0.25]).reshape((-1, 1))
        y_obs = np.block([[-0.1, 0.1], [-0.2, 0.3], [0.1, 0]])

        # augment to also test more than scalar dimensions in x and t
        x_sim_cal = np.hstack((0.5 * np.ones(
            (self.x_sim.shape[0], 1)), self.x_sim[:, :1]))
        t_sim_cal = self.x_sim[:, 1:]
        xt_sim_sep = [np.array(0.5).reshape(1, 1)] + self.x_sim_kron

        y_sim_std = (self.y_sim - np.mean(self.y_sim, axis=0).reshape(
            1, -1)) / np.std(self.y_sim, axis=0, ddof=1).reshape(1, -1)

        dc = SepiaData(x_sim=x_sim_cal,
                       t_sim=t_sim_cal,
                       y_sim=y_sim_std,
                       x_obs=x_obs,
                       y_obs=y_obs,
                       y_ind_sim=self.y_ind_sim,
                       y_ind_obs=self.y_ind_sim)
        dc.create_K_basis(K=np.eye(2))
        dc.create_D_basis(D_sim=np.eye(2), D_obs=np.eye(2))
        dc.transform_xt(x_notrans=True, t_notrans=True)
        dc.standardize_y(y_mean=0, y_sd=1)
        print(dc)
        cmod = SepiaModel(dc)

        print('Calibration model LL=%f' % compute_log_lik(cmod))

        kdc = SepiaData(xt_sim_sep=xt_sim_sep,
                        y_sim=y_sim_std,
                        x_obs=x_obs,
                        y_obs=y_obs,
                        y_ind_sim=self.y_ind_sim,
                        y_ind_obs=self.y_ind_sim)
        kdc.create_K_basis(K=np.eye(2))
        kdc.create_D_basis(D_sim=np.eye(2), D_obs=np.eye(2))
        kdc.transform_xt(x_notrans=True, t_notrans=True)
        kdc.standardize_y(y_mean=0, y_sd=1)
        print(kdc)
        kcmod = SepiaModel(kdc)

        print('Calibration Sep model LL=%f' % compute_log_lik(kcmod))

        self.assertAlmostEqual(compute_log_lik(cmod),
                               compute_log_lik(kcmod),
                               places=5)

        print(
            'Running MCMC on Calibration model in Sep pred mode, regular design'
        )
        np.random.seed(42)
        t1 = time()
        cmod.do_mcmc(10)
        print('sampling time %f' % (time() - t1))
        csamp = cmod.get_samples(sampleset=[cmod.get_last_sample_ind()])
        cpred = SepiaFullPrediction(mode='Sep',
                                    model=cmod,
                                    samples=csamp,
                                    storeMuSigma=True,
                                    x_pred=np.array([0.5, 0.5]).reshape(
                                        (1, -1)))
        print(cpred.get_ysim())
        csm, css = cpred.get_mu_sigma()
        print(csm)
        print(css)

        print(
            'Running MCMC on Calibration model in Sep pred mode, separable design'
        )
        np.random.seed(42)
        t1 = time()
        kcmod.do_mcmc(10)
        print('sampling time %f' % (time() - t1))
        kcsamp = kcmod.get_samples(sampleset=[kcmod.get_last_sample_ind()])
        kcpred = SepiaFullPrediction(mode='Sep',
                                     model=kcmod,
                                     samples=kcsamp,
                                     storeMuSigma=True,
                                     x_pred=np.array([0.5, 0.5]).reshape(
                                         (1, -1)))
        print(kcpred.get_ysim())
        kcsm, kcss = kcpred.get_mu_sigma()
        print(kcsm)
        print(kcss)

        print('testing max difference which is %g' % np.max(abs(csm - kcsm)))
        self.assertAlmostEqual(0, np.max(abs(csm - kcsm)))

        print('testing max difference which is %g' % np.max(abs(css - kcss)))
        self.assertAlmostEqual(0, np.max(abs(css - kcss)))

        ###### Timing for predictions

        test_x_pred = np.random.rand(10, 2)

        csamp = cmod.get_samples()
        t1 = time()
        cpred0 = SepiaFullPrediction(mode='notSep',
                                     model=cmod,
                                     samples=csamp,
                                     storeMuSigma=True,
                                     x_pred=test_x_pred)
        print('predict time non-Sep in non-Sep mode %f' % (time() - t1))
        t1 = time()
        cpred = SepiaFullPrediction(mode='Sep',
                                    model=cmod,
                                    samples=csamp,
                                    storeMuSigma=True,
                                    x_pred=test_x_pred)
        print('predict time non-sep in Sep mode %f' % (time() - t1))

        kcsamp = kcmod.get_samples()
        t1 = time()
        kcpred = SepiaFullPrediction(mode='Sep',
                                     model=kcmod,
                                     samples=kcsamp,
                                     storeMuSigma=True,
                                     x_pred=test_x_pred)
        print('predict time Sep %f' % (time() - t1))

        pass
Esempio n. 18
0
    def test_multivariate_sim_and_obs_no_x(self):
        """
        Tests multivariate sim and obs where we pass in t but not x (x is a dummy variable).
        """
        m = 700  # number of simulated observations
        ell_sim = 1000  # dimension of y output sim
        ell_obs = 258  # dimension of y output obs
        pu = 3  # number of PCs
        q = 2  # dimension of t (extra sim inputs)
        n = 5  # number of observed observations

        y_ind_sim = np.linspace(0, 100, ell_sim)
        K_true_sim = np.vstack([
            0.5 * (np.sin(y_ind_sim) + 1),
            np.square(-y_ind_sim + 50) / 2500, y_ind_sim / 100
        ])
        y_sim = np.transpose(
            np.log(1 + y_ind_sim)[:, None] + np.dot(
                K_true_sim.T, 2 * np.array([1, 0.5, 0.2])[:, None] *
                np.random.normal(0, 1, (pu, m))))
        t = np.random.uniform(-10, 10, (m, q))

        y_ind_obs = np.linspace(0, 100, ell_obs) + np.random.uniform(
            -3, 3, ell_obs)
        y_ind_obs[y_ind_obs < 0] = 0
        K_true_obs = np.vstack([
            0.5 * (np.sin(y_ind_obs) + 1),
            np.square(-y_ind_obs + 50) / 2500, y_ind_obs / 100
        ])
        y_obs = 10 + np.transpose(
            np.log(1 + y_ind_obs)[:, None] + np.dot(
                K_true_obs.T, 2 * np.array([1, 0.5, 0.2])[:, None] *
                np.random.normal(0, 1, (pu, n))))

        d = SepiaData(y_sim=y_sim,
                      t_sim=t,
                      y_ind_sim=y_ind_sim,
                      y_obs=y_obs,
                      y_ind_obs=y_ind_obs)

        print('Testing multivariate sim and obs SepiaData...')
        print(d)
        self.assertTrue(d.obs_data is not None)
        self.assertTrue(not d.sim_only)
        self.assertTrue(not d.scalar_out)

        d.transform_xt()
        self.assertTrue(np.all(d.sim_data.x_trans == 0.5))
        self.assertTrue(np.all(d.obs_data.x_trans == 0.5))
        self.assertTrue(np.all(np.min(d.sim_data.t_trans, 0) == 0))
        self.assertTrue(np.all(np.max(d.sim_data.t_trans, 0) == 1))

        d.standardize_y(center=False, scale=False)
        self.assertEqual(d.sim_data.orig_y_sd, 1)
        self.assertEqual(d.sim_data.orig_y_mean, 0)
        self.assertTrue(np.allclose(d.sim_data.y, d.sim_data.y_std))
        self.assertEqual(d.obs_data.orig_y_sd, 1)
        self.assertEqual(d.obs_data.orig_y_mean, 0)
        self.assertTrue(np.allclose(d.obs_data.y, d.obs_data.y_std))

        d.standardize_y(scale='columnwise')
        self.assertTrue(
            np.allclose(d.sim_data.orig_y_mean,
                        np.log(1 + y_ind_sim),
                        rtol=0.1,
                        atol=0.5))
        self.assertTrue(np.allclose(np.mean(d.sim_data.y_std, 0), 0, rtol=0.1))
        self.assertTrue(np.allclose(np.std(d.sim_data.y_std, 0), 1, rtol=0.1))
        self.assertTrue(d.sim_data.y.shape == d.sim_data.y_std.shape)
        self.assertTrue(
            np.allclose(d.obs_data.orig_y_mean,
                        np.log(1 + y_ind_obs),
                        rtol=0.1,
                        atol=0.5))
        self.assertTrue(d.obs_data.y.shape == d.obs_data.y_std.shape)

        d.create_K_basis(3)
        self.assertTrue(d.sim_data.K.shape == (pu, ell_sim))
        self.assertTrue(d.obs_data.K.shape == (pu, ell_obs))
        d.create_D_basis()
        self.assertTrue(d.obs_data.D.shape == (1, ell_obs))
        print(d)
Esempio n. 19
0
    def test_multivariate_sim_and_obs_ragged(self):
        """
        Tests multivariate sim and obs where we pass in x and t but obs is ragged.
        """
        m = 700  # number of simulated observations
        p = 3  # dimension of x (simulation inputs)
        ell_sim = 1000  # dimension of y output sim
        pu = 3  # number of PCs
        q = 2  # dimension of t (extra sim inputs)
        n = 5  # number of observed observations

        ell_obs = np.random.randint(100, 600, n)

        y_ind_sim = np.linspace(0, 100, ell_sim)
        K_true_sim = np.vstack([
            0.5 * (np.sin(y_ind_sim) + 1),
            np.square(-y_ind_sim + 50) / 2500, y_ind_sim / 100
        ])
        y_sim = np.transpose(
            np.log(1 + y_ind_sim)[:, None] + np.dot(
                K_true_sim.T, 2 * np.array([1, 0.5, 0.2])[:, None] *
                np.random.normal(0, 1, (pu, m))))
        x_sim = 0.5 * np.random.uniform(-1, 3, (m, p))
        t = np.random.uniform(-10, 10, (m, q))

        y_ind_obs = [
            np.linspace(0, 100, ell_obs[i]) +
            np.random.uniform(-3, 3, ell_obs[i]) for i in range(len(ell_obs))
        ]
        for yi in y_ind_obs:
            yi[yi < 0] = 0
        K_true_obs = [
            np.vstack(
                [0.5 * (np.sin(yi) + 1),
                 np.square(-yi + 50) / 2500, yi / 100]) for yi in y_ind_obs
        ]
        y_obs = [
            10 + np.squeeze(
                np.log(1 + y_ind_obs[i])[:, None] + np.dot(
                    K_true_obs[i].T, 2 * np.array([1, 0.5, 0.2])[:, None] *
                    np.random.normal(0, 1, (pu, 1))))
            for i in range(len(y_ind_obs))
        ]
        x_obs = 0.5 * np.random.uniform(-1, 3, (n, p))

        d = SepiaData(x_sim=x_sim,
                      y_sim=y_sim,
                      t_sim=t,
                      y_ind_sim=y_ind_sim,
                      x_obs=x_obs,
                      y_obs=y_obs,
                      y_ind_obs=y_ind_obs)

        print('Testing multivariate sim and obs SepiaData...')
        print(d)
        self.assertTrue(d.obs_data is not None)
        self.assertTrue(not d.sim_only)
        self.assertTrue(not d.scalar_out)

        d.transform_xt()
        self.assertTrue(np.all(np.min(d.sim_data.x_trans, 0) == 0))
        self.assertTrue(np.all(np.max(d.sim_data.x_trans, 0) == 1))
        self.assertTrue(np.all(np.min(d.sim_data.t_trans, 0) == 0))
        self.assertTrue(np.all(np.max(d.sim_data.t_trans, 0) == 1))

        d.standardize_y(center=False, scale=False)
        self.assertEqual(d.sim_data.orig_y_sd, 1)
        self.assertEqual(d.sim_data.orig_y_mean, 0)
        self.assertTrue(np.allclose(d.sim_data.y, d.sim_data.y_std))
        #self.assertEqual(d.obs_data.orig_y_sd, 1)
        #self.assertEqual(d.obs_data.orig_y_mean, 0)
        #self.assertTrue(np.allclose(d.obs_data.y, d.obs_data.y_std))

        d.standardize_y(scale='columnwise')
        self.assertTrue(
            np.allclose(d.sim_data.orig_y_mean,
                        np.log(1 + y_ind_sim),
                        rtol=0.1,
                        atol=0.5))
        self.assertTrue(np.allclose(np.mean(d.sim_data.y_std, 0), 0, rtol=0.1))
        self.assertTrue(np.allclose(np.std(d.sim_data.y_std, 0), 1, rtol=0.1))
        self.assertTrue(d.sim_data.y.shape == d.sim_data.y_std.shape)

        d.create_K_basis(3)
        self.assertTrue(d.sim_data.K.shape == (pu, ell_sim))
        d.create_D_basis()
        print(d)
Esempio n. 20
0
y_ind_sim = matfile['y_ind'].squeeze()
xt_sim = matfile['x']
y_obs = matfile['y_obs']
y_ind_obs = matfile['y_ind_obs'].squeeze()
x_obs = matfile['x_obs']
data = SepiaData(x_sim=xt_sim[:, 0][:, None],
                 t_sim=xt_sim[:, 1][:, None],
                 y_sim=y_sim,
                 y_ind_sim=y_ind_sim,
                 x_obs=x_obs,
                 y_obs=y_obs,
                 y_ind_obs=y_ind_obs)
data.standardize_y()
data.transform_xt()
data.create_K_basis(n_pc=2)
data.create_D_basis(D_obs=matfile['Dobs'].T)
print(data)

model = setup_model(data)

nsamp = int(matfile['nsamp'])
nburn = int(matfile['nburn'])


@timeit
def run_mcmc():
    model.do_mcmc(nburn + nsamp)


print('Python mcmc time:')
run_mcmc()
Esempio n. 21
0
    def test_multivariate_sim_and_obs_lamVzGroups_setup(self):
        """
        Tests setup for multivariate sim and obs model with D and lamVzGroups
        """

        d = SepiaData(t_sim=self.data_dict['t_sim'],
                      y_sim=self.data_dict['y_sim'],
                      y_ind_sim=self.data_dict['y_ind_sim'],
                      y_obs=self.data_dict['y_obs'],
                      y_ind_obs=self.data_dict['y_ind_obs'])
        print(
            'Testing multivariate sim and obs SepiaModelSetup with discrep...',
            flush=True)
        print(d, flush=True)

        # Do explicit transformation
        d.transform_xt()
        d.standardize_y()
        d.create_K_basis(n_pc=5)
        custom_D = np.vstack([
            np.ones(d.obs_data.y.shape[1]), d.obs_data.y_ind,
            d.obs_data.y_ind**2
        ])
        d.create_D_basis(D_obs=custom_D)
        lamVzGroup = [0, 1, 1]
        model = setup_model(d, lamVzGroup=lamVzGroup)

        # Check model components are set up as expected
        self.assertTrue(not model.num.scalar_out)
        self.assertTrue(not model.num.sim_only)
        self.assertTrue(model.num.m == 100)
        self.assertTrue(model.num.n == 1)
        self.assertTrue(model.num.p == 1)
        self.assertTrue(model.num.q == 3)
        self.assertTrue(model.num.pu == 5)
        self.assertTrue(model.num.pv == 3)

        # Check parameter setup -- betaU
        betaU = model.params.betaU
        self.assertTrue(betaU.val_shape == (model.num.q + model.num.p,
                                            model.num.pu))
        self.assertTrue(betaU.prior.dist == 'Beta')
        self.assertTrue(betaU.mcmc.stepType == 'BetaRho')

        # Check parameter setup -- betaV
        betaV = model.params.betaV
        self.assertTrue(betaV.val_shape == (1, 2))
        self.assertTrue(betaV.prior.dist == 'Beta')
        self.assertTrue(betaV.mcmc.stepType == 'BetaRho')

        # Check parameter setup -- lamUz
        lamUz = model.params.lamUz
        self.assertTrue(lamUz.val_shape == (1, model.num.pu))
        self.assertTrue(lamUz.prior.dist == 'Gamma')
        self.assertTrue(lamUz.mcmc.stepType == 'PropMH')

        # Check parameter setup -- lamUz
        lamVz = model.params.lamVz
        self.assertTrue(lamVz.val_shape == (1, 2))
        self.assertTrue(lamVz.prior.dist == 'Gamma')
        self.assertTrue(lamVz.mcmc.stepType == 'PropMH')

        # Check parameter setup -- lamWOs
        lamWOs = model.params.lamWOs
        self.assertTrue(lamWOs.val_shape == (1, 1))
        self.assertTrue(lamWOs.prior.dist == 'Gamma')
        self.assertTrue(lamWOs.mcmc.stepType == 'PropMH')

        # Check parameter setup -- lamWs
        lamWs = model.params.lamWs
        self.assertTrue(lamWs.val_shape == (1, model.num.pu))
        self.assertTrue(lamWs.prior.dist == 'Gamma')
        self.assertTrue(lamWs.mcmc.stepType == 'PropMH')

        # Check parameter setup -- lamOs
        lamOs = model.params.lamOs
        self.assertTrue(lamOs.val_shape == (1, 1))
        self.assertTrue(lamOs.prior.dist == 'Gamma')
        self.assertTrue(lamOs.mcmc.stepType == 'PropMH')

        # Check parameter setup -- theta
        theta = model.params.theta
        self.assertTrue(theta.val_shape == (1, model.num.q))
        self.assertTrue(theta.prior.dist == 'Normal')
        self.assertTrue(theta.mcmc.stepType == 'Uniform')
        self.assertTrue(np.allclose(theta.orig_range[0], 0))
        self.assertTrue(np.allclose(theta.orig_range[1], 1))

        mcmc_list_names = [p.name for p in model.params.mcmcList]
        self.assertTrue(
            set(mcmc_list_names) == set([
                'betaU', 'betaV', 'lamUz', 'lamVz', 'lamWOs', 'lamWs', 'lamOs',
                'theta'
            ]))