bayespecon.models.SLXPanelFE

class bayespecon.models.SLXPanelFE(formula=None, data=None, y=None, X=None, W=None, unit_col=None, time_col=None, N=None, T=None, model=0, priors=None, logdet_method=None, robust=False)[source]

Bayesian SLX panel regression.

Implements

\[\begin{split}y_{it} = x_{it}'\\beta + W x_{it}'\\theta + \\alpha_i + \\tau_t + \\varepsilon_{it}, \\qquad \\varepsilon_{it} \\sim \\mathcal{N}(0, \\sigma^2).\end{split}\]

There is no contemporaneous spatial lag on \(y\), so no Jacobian adjustment is required. The coefficient vector stacks the local and lagged-covariate blocks as \([\\beta, \\theta]\).

Parameters:
formula=None

data=None

y=None

X=None

W=None

unit_col=None

time_col=None

N=None

T=None

model=0

priors=None

:param : :param logdet_method: See SpatialPanelModel. :param **Robust regression**: :param When robust=True: :param the error distribution is changed from Normal: :param to Student-t: :param yielding a model that is robust to heavy-tailed outliers: :param .. math::: \varepsilon_{it} \sim t_\nu(0, \sigma^2) :param where \(\\nu \\sim \\mathrm{TruncExp}(\\lambda_\\nu: :param \\mathrm{lower}=2)\) with rate nu_lam (default 1/30).: :param The default nu_lam = 1/30 gives a prior mean of approximately 30: :param : :param favouring near-Normal tails. The lower bound of 2 ensures the: :param variance exists.:

__init__(formula=None, data=None, y=None, X=None, W=None, unit_col=None, time_col=None, N=None, T=None, model=0, priors=None, logdet_method=None, robust=False)[source]

Methods

__init__([formula, data, y, X, W, unit_col, ...])

fit([draws, tune, chains, target_accept, ...])

Sample the posterior for the panel model.

fitted_values()

Return fitted values at posterior mean parameters.

residuals()

Return transformed residuals y - fitted.

spatial_diagnostics()

Run Bayesian LM specification tests and return a summary table.

spatial_diagnostics_decision([alpha])

Return a model-selection decision from Bayesian LM test results.

spatial_effects([return_posterior_samples])

Compute Bayesian inference for direct, indirect, and total impacts.

summary([var_names])

Return posterior summary table.

Attributes

inference_data

Return the ArviZ InferenceData from the most recent fit.

pymc_model

Return the PyMC model object built for the most recent fit.

fit(draws=2000, tune=1000, chains=4, target_accept=0.9, random_seed=None, **sample_kwargs)[source]

Sample the posterior for the panel model.

Parameters:
draws : int, default=2000

Number of post-tuning draws per chain.

tune : int, default=1000

Number of tuning draws per chain.

chains : int, default=4

Number of chains.

target_accept : float, default=0.9

NUTS target acceptance probability.

random_seed : int, optional

Random seed used by PyMC.

**sample_kwargs

Extra keyword arguments forwarded to pymc.sample().

Returns:

Posterior samples and diagnostics.

Return type:

arviz.InferenceData

fitted_values()[source]

Return fitted values at posterior mean parameters.

Returns:

Fitted values on transformed panel scale.

Return type:

np.ndarray

property inference_data : arviz.data.inference_data.InferenceData | None[source]

Return the ArviZ InferenceData from the most recent fit.

Returns:

The inference data object, or None if the model has not been fit yet.

Return type:

arviz.InferenceData or None

property pymc_model : pymc.model.core.Model | None[source]

Return the PyMC model object built for the most recent fit.

Returns:

The model object used by fit(), or None if the instance has not been fit yet.

Return type:

pymc.Model or None

residuals()[source]

Return transformed residuals y - fitted.

Returns:

Residual vector on transformed panel scale.

Return type:

np.ndarray

spatial_diagnostics()[source]

Run Bayesian LM specification tests and return a summary table.

Iterates over the class-level _spatial_diagnostics_tests registry and calls each test function on this fitted model, collecting the results into a tidy DataFrame. The set of tests depends on the model type — for example, an OLSPanelFE model runs Panel-LM-Lag, Panel-LM-Error, Panel-LM-SDM-Joint, and Panel-LM-SLX-Error-Joint.

Requires the model to have been fit (.fit() called) and a spatial weights matrix W to have been supplied at construction time.

Returns:

DataFrame indexed by test name with columns:

Column

Description

statistic

Posterior mean of the LM statistic

median

Posterior median of the LM statistic

df

Degrees of freedom for the \(\chi^2\) reference

p_value

Bayesian p-value: 1 - chi2.cdf(mean, df)

ci_lower

Lower bound of 95% credible interval (2.5%)

ci_upper

Upper bound of 95% credible interval (97.5%)

The DataFrame has attrs["model_type"] (class name) and attrs["n_draws"] (total posterior draws) metadata.

Return type:

pandas.DataFrame

Raises:

RuntimeError – If the model has not been fit yet.

See also

spatial_diagnostics_decision

Model-selection decision based on the test results.

spatial_diagnostics_decision(alpha=0.05)[source]

Return a model-selection decision from Bayesian LM test results.

Implements the decision tree from Koley and Bera [2024] (the Bayesian analogue of the classical stge_kb procedure in Anselin et al. [1996]), adapted for panel models following Elhorst [2014].

Parameters:
alpha : float, default 0.05

Significance level for the Bayesian p-values.

Returns:

Recommended model name (e.g. "SARPanelFE", "SDMPanelFE").

Return type:

str

See also

spatial_diagnostics

Compute the Bayesian LM test statistics.

References

Koley and Bera [2024], Anselin et al. [1996], Elhorst [2014]

spatial_effects(return_posterior_samples=False)[source]

Compute Bayesian inference for direct, indirect, and total impacts.

Computes impact measures for each posterior draw, then summarises the posterior distribution with means, 95% credible intervals, and Bayesian p-values.

Parameters:
return_posterior_samples : bool, optional

If True, return a (DataFrame, dict) tuple where the dict contains the full posterior draws under keys "direct", "indirect", and "total". Default False.

Returns:

If return_posterior_samples is False (default), returns a DataFrame indexed by feature names with columns for posterior means, credible-interval bounds, and Bayesian p-values.

If return_posterior_samples is True, returns (DataFrame, dict) where the dict has keys "direct", "indirect", "total", each mapping to a (G, k) array of posterior draws.

Return type:

pd.DataFrame or tuple of (pd.DataFrame, dict)

summary(var_names=None, **kwargs)[source]

Return posterior summary table.

Parameters:
var_names : list, optional

Variable names to include.

**kwargs

Additional arguments passed to arviz.summary().

Returns:

Posterior summary table.

Return type:

pandas.DataFrame