diff --git a/src/stan/analyze/mcmc/check_chains.hpp b/src/stan/analyze/mcmc/check_chains.hpp index 6f816982b3f..2c3144a1c3f 100644 --- a/src/stan/analyze/mcmc/check_chains.hpp +++ b/src/stan/analyze/mcmc/check_chains.hpp @@ -17,9 +17,12 @@ namespace analyze { * @param chains matrix of draws, one column per chain * @return bool true if OK, false otherwise */ -inline bool is_finite_and_varies(const Eigen::MatrixXd chains) { +inline bool is_finite_and_varies(const Eigen::MatrixXd& chains) { size_t num_chains = chains.cols(); size_t num_samples = chains.rows(); + if (num_samples < 2) { + return false; + } Eigen::VectorXd first_draws = Eigen::VectorXd::Zero(num_chains); for (std::size_t i = 0; i < num_chains; ++i) { first_draws(i) = chains.col(i)(0); diff --git a/src/stan/analyze/mcmc/ess.hpp b/src/stan/analyze/mcmc/ess.hpp index 33342ce68a8..56490919624 100644 --- a/src/stan/analyze/mcmc/ess.hpp +++ b/src/stan/analyze/mcmc/ess.hpp @@ -28,6 +28,10 @@ namespace analyze { double ess(const Eigen::MatrixXd& chains) { const Eigen::Index num_chains = chains.cols(); const Eigen::Index draws_per_chain = chains.rows(); + if (draws_per_chain < 4) { + return std::numeric_limits::quiet_NaN(); + } + Eigen::MatrixXd acov(draws_per_chain, num_chains); Eigen::VectorXd chain_mean(num_chains); Eigen::VectorXd chain_var(num_chains); diff --git a/src/stan/analyze/mcmc/mcse.hpp b/src/stan/analyze/mcmc/mcse.hpp index b859cfa32c4..9bcfafc868a 100644 --- a/src/stan/analyze/mcmc/mcse.hpp +++ b/src/stan/analyze/mcmc/mcse.hpp @@ -39,9 +39,9 @@ inline double mcse_mean(const Eigen::MatrixXd& chains) { * @return mcse */ inline double mcse_sd(const Eigen::MatrixXd& chains) { - if (chains.rows() < 4 || !is_finite_and_varies(chains)) + if (chains.rows() < 8 || !is_finite_and_varies(chains)) { return std::numeric_limits::quiet_NaN(); - + } // center the data, take abs value Eigen::MatrixXd draws_ctr = (chains.array() - chains.mean()).abs().matrix();