arviz.from_pyjags() ValueError:需要解包的值太多(预计为 3 个)

问题描述 投票:0回答:1

当我使用

az.from_pyjags
时,它引发了错误。

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/home/anaconda/workspace/group_code/long_rt/simulation1/jags_test.ipynb Cell 12' in <cell line: 1>()
----> 1 az.from_pyjags(tr)
File ~/anaconda3/envs/mcmc/lib/python3.10/site-packages/arviz/data/io_pyjags.py:374, in from_pyjags(posterior, prior, log_likelihood, coords, dims, save_warmup, warmup_iterations)
    313 def from_pyjags(
    314     posterior: tp.Optional[tp.Mapping[str, np.ndarray]] = None,
    315     prior: tp.Optional[tp.Mapping[str, np.ndarray]] = None,
   (...)
    320     warmup_iterations: int = 0,
    321 ) -> InferenceData:
    322     """
    323     Convert PyJAGS posterior samples to an ArviZ inference data object.
    324 
   (...)
    364     InferenceData
    365     """
    366     return PyJAGSConverter(
    367         posterior=posterior,
    368         prior=prior,
    369         log_likelihood=log_likelihood,
    370         dims=dims,
    371         coords=coords,
    372         save_warmup=save_warmup,
    373         warmup_iterations=warmup_iterations,
--> 374     ).to_inference_data()
File ~/anaconda3/envs/mcmc/lib/python3.10/site-packages/arviz/data/io_pyjags.py:107, in PyJAGSConverter.to_inference_data(self)
    103 save_warmup = self.save_warmup and self.warmup_iterations > 0
    104 # self.posterior is not None
    106 idata_dict = {
--> 107     "posterior": self.posterior_to_xarray(),
    108     "prior": self.prior_to_xarray(),
    109     "log_likelihood": self.log_likelihood_to_xarray(),
    110     "save_warmup": save_warmup,
    111 }
    113 return InferenceData(**idata_dict)
File ~/anaconda3/envs/mcmc/lib/python3.10/site-packages/arviz/data/io_pyjags.py:83, in PyJAGSConverter.posterior_to_xarray(self)
     80 if self.posterior is None:
     81     return None
---> 83 return self._pyjags_samples_to_xarray(self.posterior)
File ~/anaconda3/envs/mcmc/lib/python3.10/site-packages/arviz/data/io_pyjags.py:62, in PyJAGSConverter._pyjags_samples_to_xarray(self, pyjags_samples)
     59 def _pyjags_samples_to_xarray(
     60     self, pyjags_samples: tp.Mapping[str, np.ndarray]
     61 ) -> tp.Tuple[xarray.Dataset, xarray.Dataset]:
---> 62     data, data_warmup = get_draws(
     63         pyjags_samples=pyjags_samples,
     64         warmup_iterations=self.warmup_iterations,
     65         warmup=self.save_warmup,
     66     )
     68     return (
     69         dict_to_dataset(data, library=self.pyjags, coords=self.coords, dims=self.dims),
     70         dict_to_dataset(
   (...)
     75         ),
     76     )
File ~/anaconda3/envs/mcmc/lib/python3.10/site-packages/arviz/data/io_pyjags.py:165, in get_draws(pyjags_samples, variables, warmup, warmup_iterations)
    161         data_warmup = _convert_pyjags_dict_to_arviz_dict(
    162             samples=warmup_samples, variable_names=variables
    163         )
    164 else:
--> 165     data = _convert_pyjags_dict_to_arviz_dict(samples=pyjags_samples, variable_names=variables)
    167 return data, data_warmup
File ~/anaconda3/envs/mcmc/lib/python3.10/site-packages/arviz/data/io_pyjags.py:238, in _convert_pyjags_dict_to_arviz_dict(samples, variable_names)
    236 for variable_name, chains in samples.items():
    237     if variable_name in variable_names:
--> 238         parameter_dimension, _, _ = chains.shape
    239         if parameter_dimension == 1:
    240             variable_name_to_samples_map[variable_name] = chains[0, :, :].transpose()
ValueError: too many values to unpack (expected 3)

如果变量超过二维,则会出错。我该如何解决这个错误?`

python mcmc
1个回答
0
投票

我们可以更改部分源代码

io_pyjags.py.
更具体地说,我们修改了函数
_convert_pyjags_dict_to_arviz_dict
如下:

def _convert_pyjags_dict_to_arviz_dict(
    samples: tp.Mapping[str, np.ndarray],
    variable_names: tp.Optional[tp.Tuple[str, ...]] = None,
    ) -> tp.Mapping[str, np.ndarray]:
    """
    Convert a PyJAGS dictionary to an ArviZ dictionary.

    Takes a python dictionary of samples that has been generated by the sample
    method of a model instance and returns a dictionary of samples in ArviZ
    format.

    Parameters
    ----------
    samples: a dictionary mapping variable names to P arrays with shape
             (parameter_dimension, chain_length, number_of_chains)

    Returns
    -------
    a dictionary mapping variable names to NumPy arrays with shape
             (number_of_chains, chain_length, parameter_dimension)
    """
    # pyjags returns a dictionary of NumPy arrays with shape
    #         (parameter_dimension, chain_length, number_of_chains)
    # but arviz expects samples with shape
    #         (number_of_chains, chain_length, parameter_dimension)

    variable_name_to_samples_map = {}

    if variable_names is None:
        variable_names = tuple(samples.keys())

    for variable_name, chains in samples.items():
        if variable_name in variable_names:
            sample_dimension = len(chains.shape)
            var_shape = chains.shape
            transpose_idx = tuple(np.arange(len(var_shape))[-2:][::-1]) + tuple(np.arange(len(var_shape))[:-2])
            variable_name_to_samples_map[variable_name] = chains.transpose(transpose_idx)

    return variable_name_to_samples_map
© www.soinside.com 2019 - 2024. All rights reserved.