bayespecon.models.OLSPanelFE¶
-
class bayespecon.models.OLSPanelFE(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, w_vars=None, backend=None)[source]¶ Bayesian pooled and fixed-effects linear panel regression.
Implements the Gaussian panel model
\[y_{it} = x_{it}'\beta + \alpha_i + \tau_t + \varepsilon_{it}, \qquad \varepsilon_{it} \sim \mathcal{N}(0, \sigma^2),\]where the included effects depend on
model:0pooled,1unit effects,2time effects,3two-way effects. The within transformation is handled bySpatialPanelModelbefore the likelihood is evaluated.- Parameters:¶
- formula : str, optional¶
Wilkinson-style formula, e.g.
"y ~ x1 + x2". Requiresdata,unit_col, andtime_col.- data : pandas.DataFrame, optional¶
Long-format panel data when using formula mode.
- y : array-like, optional¶
Stacked response of shape
(N*T,)in unit-major order. Required in matrix mode.- X : array-like or pandas.DataFrame, optional¶
Stacked design matrix of shape
(N*T, k). Required in matrix mode. DataFrame columns are preserved as feature names.- W : libpysal.graph.Graph or scipy.sparse matrix¶
Spatial weights of shape
(N, N)(preferred) or(N*T, N*T)block-diagonal. Accepted for API consistency with the other panel models but does not enter the OLS likelihood; required if downstream Bayesian LM diagnostics will be run.- unit_col : str, optional¶
Column in
dataidentifying the cross-sectional unit. Required in formula mode.- time_col : str, optional¶
Column in
dataidentifying the time period. Required in formula mode.- N : int, optional¶
Number of cross-sectional units. Required in matrix mode if not inferable.
- T : int, optional¶
Number of time periods. Required in matrix mode if not inferable.
- model : int, default 0¶
Fixed-effects specification:
0pooled,1unit FE,2time FE,3two-way FE.- priors : dict, optional¶
Override default priors. Supported keys:
beta_mu(float, default 0.0): Normal prior mean for \(\beta\).beta_sigma(float, default 1e6): Normal prior std for \(\beta\).sigma_sigma(float, default 10.0): HalfNormal prior std for \(\sigma\).nu_lam(float, default 1/30): Rate of TruncExp(lower=2) prior on \(\nu\) (only used whenrobust=True).
- logdet_method : str, optional¶
Accepted for API consistency; unused in OLSPanelFE (no spatial Jacobian).
- robust : bool, default False¶
If True, replace the Normal error with Student-t. See Robust regression below.
Notes
This is the aspatial baseline for panel LM diagnostics and panel model comparison. The spatial weights object
Wis accepted for API consistency but does not enter the likelihood.Robust regression
When
robust=True, the error distribution is changed from Normal to Student-t, yielding a model that is robust to heavy-tailed outliers:\[\varepsilon_{it} \sim t_\nu(0, \sigma^2)\]where \(\nu \sim \mathrm{TruncExp}(\lambda_\nu, \mathrm{lower}=2)\) with rate
nu_lam(default 1/30). The defaultnu_lam = 1/30gives a prior mean of approximately 30, favouring near-Normal tails. The lower bound of 2 ensures the 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, w_vars=None, backend=None)[source]¶
Methods
__init__([formula, data, y, X, W, unit_col, ...])fit([draws, tune, chains, target_accept, ...])Draw samples from the posterior.
Return fitted values at posterior mean parameters.
Return residuals on the observed (or transformed-panel) scale.
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
Return the ArviZ InferenceData from the most recent fit.
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]¶ Draw samples from the posterior.
- Parameters:¶
- draws : int¶
Number of posterior samples per chain (after tuning).
- tune : int¶
Number of tuning (burn-in) steps per chain.
- chains : int¶
Number of parallel chains.
- target_accept : float¶
Target acceptance rate for NUTS.
- random_seed : int, optional¶
Seed for reproducibility.
- **sample_kwargs¶
Additional keyword arguments forwarded to
pm.sample. Passnuts_sampler="blackjax"(or"numpyro","nutpie") to select an alternative NUTS backend; defaults to PyMC’s built-in sampler.
- Return type:¶
arviz.InferenceData
- property inference_data : arviz.data.inference_data.InferenceData | None[source]¶
Return the ArviZ InferenceData from the most recent fit.
- property pymc_model : pymc.model.core.Model | None[source]¶
Return the PyMC model object built for the most recent fit.
- spatial_diagnostics()[source]¶
Run Bayesian LM specification tests and return a summary table.
Iterates over the class-level
_spatial_diagnostics_testsregistry 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.Requires the model to have been fit (
.fit()called). For cross-sectional models a spatial weights matrixWmust also have been supplied at construction time.- Returns:¶
DataFrame indexed by test name with columns
statistic(posterior mean),median,df(degrees of freedom for the \(\chi^2\) reference),p_value(Bayesian p-value1 - chi2.cdf(mean, df)), andci_lower/ci_upper(95% credible interval). The DataFrame carriesattrs["model_type"]andattrs["n_draws"]metadata.- Return type:¶
pandas.DataFrame
- Raises:¶
RuntimeError – If the model has not been fit yet.
ValueError – If a cross-sectional model was constructed without
W.
See also
spatial_diagnostics_decisionModel-selection decision based on the test results.
spatial_effectsPosterior inference for direct/indirect/total impacts.
-
spatial_diagnostics_decision(alpha=
0.05, format='graphviz', theme='default')[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_kbprocedure in Anselin et al. [1996]), adapted for panel models following Elhorst [2014] when invoked on a panel subclass. See the cross-sectional / panel-specific docstrings on the leaf classes for the full set of branches consulted.- Parameters:¶
- alpha : float, default 0.05¶
Significance level for the Bayesian p-values.
- format : {"graphviz", "ascii", "model"}, default "graphviz"¶
Output format.
"model"returns the recommended-model name string."ascii"returns an indented box-drawing rendering of the full decision tree with the chosen path highlighted."graphviz"returns agraphviz.Digraphobject that renders inline in Jupyter; if the optionalgraphvizpackage is not installed aUserWarningis issued and the ASCII rendering is returned instead.
- Returns:¶
Recommended model name when
format="model", an ASCII tree string whenformat="ascii", or agraphviz.Digraphwhenformat="graphviz"(with ASCII fallback on missing dep).- Return type:¶
str or graphviz.Digraph
See also
spatial_diagnosticsCompute the Bayesian LM test statistics.
-
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. This is the fully Bayesian analog of the simulation-based approach in LeSage and Pace [2009] and the asymptotic variance formulas in Arbia et al. [2020].
Models without a spatial lag on y do not exhibit global feedback propagation through \((I-\rho W)^{-1}\). However, models with spatially lagged covariates (SLX, SDEM) can still have non-zero neighbour spillovers captured in the indirect term.
- Parameters:¶
- 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:¶