Release 0.15.0#

Release summary#

This note covers all changes merged into main between the v0.15.0.dev0 tag (2023-05-05) and the v0.15.0 release (2026-08-27).

statsmodels is using github to store the updated documentation. Two versions are available:

Warning

API stability is not guaranteed for new features, although even in this case changes will be made in a backwards compatible way if possible. The stability of a new feature depends on how much time it was already in statsmodels main and how much usage it has already seen. If there are specific known problems or limitations, then they are mentioned in the docstrings.

Release Statistics#

  • Issues closed: 358

  • Pull requests merged: 655

  • Non-merge commits: 1740

  • Contributors (by git log author, unique names): 171

  • Time span: 2023-05-05 through 2026-08-27

The Highlights#

SPEC-007: consistent use of rng for randomness#

statsmodels is standardizing on a single rng keyword for supplying entropy (an integer seed, an array of integers, a NumPy Generator, or a RandomState) wherever a model, estimator, or plotting function needs randomness, in line with the community’s SPEC 007 convention. The older random_state and seed keywords are deprecated in favor of rng. Passing the old keyword still works and is transparently remapped to rng, but it now raises a FutureWarning and will be removed in a future release. This is one of the largest cross-cutting changes in this release and touches, among others:

  • State space models (MLEResults.simulate, simulation smoothers, impulse response simulation): random_state -> rng.

  • Distributions: copulas, BernsteinDistribution, DiscretizedCount, MixtureDistribution, and related rvs-style methods: random_state -> rng.

  • MixedLM, nonlinls, GAM cross-validation, and several sandbox distributions: random_state -> rng.

  • Nonparametric estimation (KDEMultivariate, KDEMultivariateConditional, KernelReg, KernelCensoredReg, TestRegCoefC/TestRegCoefD): seed -> rng.

  • VAR/SVAR/IRF simulation and Monte Carlo error bands (varsim, VAR.simulate_var, VAR.plotsim, VARResults.irf_errband_mc, VARResults.irf_resim, SVARResults.sirf_errband_mc, and the IRAnalysis.plot/plot_cum_effects/errband_mc/err_band_sz1/ err_band_sz2/err_band_sz3/cum_errband_mc family): seed -> rng.

  • ARDL.bounds_test, graphics.functional.hdrboxplot (seed and kernel_seed), and sandbox.panel.random_panel.PanelSample: seed -> rng.

  • The internal statsmodels.tools.rng_qrng.check_random_state helper (which also accepts scipy.stats.qmc.QMCEngine instances) is now used consistently across these code paths to turn whatever is passed via rng into an actual Generator/RandomState instance.

See Breaking Changes and Deprecations below for what this means for existing code. PR #9737, PR #9615, PR #9831, PR #9947, PR #9950

NamedTuple return values replace bare tuples#

Many statsmodels functions historically returned a plain tuple whose length depended on the arguments passed, so that adfuller(x) and adfuller(x, store=True) returned a different number of values. This makes results hard to unpack defensively, hard to document, and hard to type.

These functions now return purpose-built NamedTuple result classes with a fixed set of fields; fields that were not requested are None. Because a NamedTuple is a tuple, positional unpacking, indexing and comparison against plain tuples all continue to work, and field access such as res.pvalue becomes available.

The migration follows a single rule:

  • Where the NamedTuple unpacks exactly like the tuple it replaces, it is simply returned now, with no deprecation and no warning. This covers, among others, pacf/ccf/pccf with alpha set, lagmat with original="sep", kdensity/kdensityfft with the default retgrid=True, plot_partregress with ret_coords=True, and the store=True paths of the stats.diagnostic tests.

  • Where adopting it would change how many values are unpacked, the legacy tuple is still returned and a FutureWarning is raised. Pass result_object=True to opt in now, or result_object=False to keep the current behaviour and silence the warning. The default changes in 0.16.

Functions whose result shape never varied were converted outright, with no flag and no warning: block_jackknife, q_stat, pacf_burg, levinson_durbin, levinson_durbin_pacf, breakvar_heteroskedasticity_test, coint, cffilter, hpfilter, hamilton_filter, forecast_interval, the IRF/SIRF error-band methods, the ARIMA parameter estimators, and RegressionResults.compare_lr_test.

The migration was completed by converting the remaining Holder/ HolderTuple result objects across stats and robust (covariance and scale estimators, proportion, rates, nonparametric, multivariate, effect_size, oneway, and more) to documented NamedTuple classes, and HolderTuple itself is now deprecated (see Breaking Changes and Deprecations below). Where a converted class used to support unpacking into a short tuple like statistic, pvalue = result, a compat_2tuple_unpack decorator preserves that behaviour, with a FutureWarning, during the transition.

PR #10025, PR #10027, PR #10029, PR #10030, PR #10031, PR #10035, PR #10072

Formula engine: patsy is no longer the only option#

statsmodels now has an abstracted formula-handling layer (statsmodels.formula) that can use either patsy (the default engine when it is installed, for backward compatibility) or formulaic as the engine behind the formula interface (smf.ols("y ~ x", data=df), etc.). The engine can be selected explicitly with the SM_FORMULA_ENGINE environment variable ("patsy" or "formulaic"). formulaic is now a required runtime dependency (formulaic>=1.1.0) even when patsy continues to be used as the default engine. This lays the groundwork for statsmodels to move away from patsy, which has been in low-maintenance mode for several years. PR #9423, PR #9470

Build system: meson-python replaces setuptools#

statsmodels’ build backend switched from setuptools (with a custom setup.py) to meson-python. Anyone building statsmodels from source needs Meson/Ninja available and a build environment satisfying the new build requirements (numpy>=2.0, scipy>=1.13, cython>=3.0.13). This does not affect users installing prebuilt wheels from PyPI. PR #9634

Polars DataFrame support#

Models and the formula API now accept Polars DataFrame/Series objects wherever pandas objects are accepted. Polars input is converted to pandas at the data-entry point (handle_data, and the formula-handling layer), so all internal computation continues to use pandas/NumPy unchanged; column names, index information, and predictions with Polars exog are preserved. Polars is an optional dependency: code paths that do not receive Polars objects are unaffected, and the relevant tests are skipped when Polars is not installed. PR #9804

New robust estimation tools#

Several new robust estimators and supporting tools were added:

New models and statistical tests#

New and improved plots#

GLM and other model enhancements#

  • GLMResults.get_margeff (marginal effects for GLM). PR #8889

  • GLM models now preserve the names of input pandas Series. PR #9130

  • het_white gained an option to omit interaction (cross) terms. PR #9691

  • Faster computation of state space “news”/revision impacts, and a significant performance optimization of VECM to avoid an \(O(T^2)\) projection matrix. PR #8937, PR #9720

  • statsmodels.stats.stattools.medcouple gained an \(O(N \log N)\) algorithm (use_fast=True, the default), replacing the previous \(O(N^2)\) implementation, which remains available via use_fast=False. PR #9571

Platform and packaging compatibility#

  • Cython 3 compatibility, and compatibility of the tsa.statespace Cython code with SciPy ILP64 builds. PR #9078, PR #9798

  • Experimental Pyodide/WebAssembly support and CI jobs. PR #9270, PR #9343

  • Free-threaded (no-GIL) CPython compatibility work, including free-threading-compatible Cython modules and CI coverage. PR #9717

Stricter input validation for string-valued options#

Late in the release cycle, essentially every string-valued parameter that accepts a fixed set of options (method, alternative, trend, and similar) was audited and, where it wasn’t already, routed through statsmodels.tools.validation.string_like with an explicit options= tuple (PR #10161, plus follow-ups PR #10167, PR #10173). This is the largest single change in this release by number of call sites touched, and it changes behavior in two distinct ways:

  • Previously-silent bad input now raises a clean, documented ValueError. A number of functions had validation gaps where an unrecognized string either silently fell through to a default branch (for example VECM’s deterministic, seasonal_decompose’s model, and oneway’s use_var family) or produced a confusing KeyError/NameError instead of the documented error (for example validate_estimator). Code that was accidentally relying on one of these fallback paths, rather than passing a value from the documented {...} set, will now see a ValueError where it previously ran (possibly incorrectly) without complaint.

  • Undocumented short-form aliases now emit a FutureWarning instead of working silently. The most widespread example is the alternative parameter used throughout stats and tsa for hypothesis-test direction ("two-sided"/"larger"/"smaller", or "increasing"/"decreasing"/"two-sided" for heteroskedasticity tests): informal short forms such as "2s", "l", "s", "i", "inc", "d", "dec", or "2" were accepted but never documented. These still work in 0.15.0, but now raise a FutureWarning naming the documented spelling to switch to, and will stop being accepted after statsmodels 0.16 (PR #10170, PR #10180). This affects, among others, DescrStatsW/ CompareMeans and the module-level ztest/zconfint/ztost/ttest_ind/ttost_ind functions in statsmodels.stats.weightstats, het_goldfeldquandt, breakvar_heteroskedasticity_test (and the state space/ETS test_heteroskedasticity methods built on it), PredictionResults.t_test/PredictionResultsBase.t_test, most of statsmodels.stats.power, several functions in statsmodels.stats.proportion and statsmodels.stats.rates, confint_noncentrality, effectsize_2proportions (whose statistic parameter separately gained "rd"/"rr"/"or"/ "arcsine" as deprecated aliases for "diff"/"risk-ratio"/ "odds-ratio"/"arcsin"), and ksstat (whose alternative gained deprecated aliases for the scipy.stats.kstest-style spellings "two_sided"/"less"/"greater"). Pass the documented spelling to silence the warning; the deprecated forms will be removed, not just undocumented, starting after statsmodels 0.16.

A few consequential bug fixes#

A few of the more consequential correctness fixes in this release (see Notable Bug Fixes below for the full list):

  • families.Binomial.deriv() was missing a division by n and returned an incorrect value; it now correctly returns 1 - 2 * mu / n. PR #9862

  • The log-likelihood computation for ETSModel was corrected. PR #9400

  • A state space model transition-timing bug was fixed. PR #9688

  • anova_lm silently returned NaN p-values when models were passed in reverse order. PR #9852

  • Numerical instability in VIF was fixed by standardizing the design matrix before computing it. PR #9835

  • wald_test_terms reported the raw number of constraint rows as df_constraint, rather than the rank-adjusted degrees of freedom that wald_test itself already computes; this was wrong for rank-deficient models (e.g. incomplete factorial designs). PR #9907

  • The adjusted (unbiased) ccovf/acovf normalized by len(x) - k rather than by the actual number of overlapping observation pairs, which is only the same thing when the two series are equal length. PR #9916

  • breakvar_heteroskedasticity_test (and the state space/ETS test_heteroskedasticity methods built on it) referred the ratio of two sums of squares directly to F(numer_dof, denom_dof); that ratio is only F-distributed after rescaling by denom_dof / numer_dof, so p-values were wrong whenever missing observations left the two subsets with different numbers of usable residuals. Balanced samples were unaffected. PR #10171

  • Every TreatmentEffectResults produced by TreatmentEffect’s ra/aipw/aipw_wls/ipw_ra methods was labeled .method = "IPW", regardless of which method actually produced it. Each method now labels its own result correctly. PR #10164

  • BinomialBayesMixedGLM.fit/PoissonBayesMixedGLM.fit (documented as equivalent to fit_map) called fit_map and discarded its return value, so .fit() always returned None instead of the fitted results instance – any code using the documented .fit() entry point (rather than calling .fit_map() directly) could not get a usable result. PR #10195

  • The state space univariate filter/smoother (used for exact diffuse initialization, and as the automatic fallback whenever the multivariate filter hits a singular forecast-error covariance) computed the smoothed measurement disturbance in a whitened basis and never transformed it back, so smoothed_measurement_disturbance was wrong by an observation-dependent factor for any model that exercised this code path – off by as much as 124 in one of the affected test cases. The corresponding disturbance covariance cannot be recovered the same way from what the univariate recursions compute, so that quantity now raises a warning instead of silently returning a value in the wrong basis. PR #9979

  • GLS.hessian_factor returned incorrect values for both non-scalar sigma cases: for a 1-d (heteroskedastic-weights) sigma it returned the whitening factor 1 / sqrt(sigma) instead of the Hessian weight 1 / sigma (PR #10196), and for a full 2-d (non-diagonal) sigma its output does not correspond to the actual Hessian at all; rather than continue to return a plausible-looking but wrong answer, the 2-d case now raises NotImplementedError (PR #10203, see Breaking Changes and Deprecations below).

  • In the non-IRLS gradient-optimizer path of GLM.fit, the fallback that is supposed to reuse normalized_cov_params when the observed Hessian cannot be inverted was unreachable dead code, so bse/cov_params() silently came back as all-NaN any time the Hessian inversion failed, even though a usable covariance estimate from the optimizer was available. PR #9794

  • LikelihoodModel.fit(method="newton") used the opposite sign convention from every other optimizer for its internal score/Hessian closures. This made no difference to the Newton step itself, but it meant the ridge_factor Hessian regularization (used to stabilize the solve when the Hessian is poorly conditioned) was applied with the wrong sign – shrinking the regularized Hessian’s magnitude instead of increasing it, the opposite of what regularization is supposed to do. This is most consequential for models fit with a non-default ridge_factor or a near-singular Hessian. PR #10184

  • Tweedie GLM log-likelihood (1 < var_power < 2, the compound Poisson-Gamma case commonly used for claim-severity/insurance-style data) computed log(wright_bessel(...)), which overflows to inf before the log is taken for a range of realistic endog/mu/scale combinations, silently producing an infinite or garbage log-likelihood. Fixed by using scipy.special.log_wright_bessel directly, which does not have this overflow. Requires SciPy >= 1.14 to take effect; on older SciPy (or 32-bit platforms, where log_wright_bessel is not accurate enough) the previous, overflow-prone computation is still used. PR #10179, PR #10186, PR #10188

  • HurdleCountModel.fit passed its caller’s start_params unsplit to both of its two component models, so any start_params of the documented, whole-model length raised a shape-mismatch error from deep inside the optimizer instead of fitting. It is now split the same way fit_regularized already splits it. The same fix also makes fit_regularized report the joint refit’s own convergence flag (previously overwritten by the two component fits’ flags) and makes the L1-penalized solver’s Hessian-inversion fallback raise on a non-finite (rather than merely singular) Hessian instead of silently proceeding with a NaN covariance. PR #10205

  • ARDLResults.apply/append raised for a model that originally had no exog and was applied to a series with no exog either – a legitimate no-op round trip – and, separately, its two specific, documented exog-mismatch errors were unreachable for most of the mismatches they describe because model reconstruction failed first with an unrelated, confusing error. PR #10207

Breaking Changes and Deprecations#

Previously-silent wrong results now raise or warn#

A few of the correctness fixes described above change what a call does, not just the numbers it returns, because the previous behavior had no correct fallback:

  • GLS.hessian_factor (and anything built on it, e.g. GLS.hessian) raises NotImplementedError for a full 2-d (non-diagonal) sigma, instead of silently returning a value that does not correspond to the actual Hessian. The 1-d (heteroskedastic-weights) and scalar sigma cases are unaffected and continue to work. PR #10203

  • The state space simulation smoother’s smoothed measurement disturbance covariance (as opposed to the disturbance itself, which is now computed correctly, see above) cannot be recovered in the original basis from what the univariate filter/smoother computes, so requesting it now raises a warning instead of silently returning a value in the wrong basis. PR #9979

  • psturng (the studentized range p-value approximation underlying Tukey’s HSD and the Games-Howell test) raises ValueError for degrees of freedom 1 <= v < 2 combined with a very small p-value, instead of returning a fabricated 0.1. Neither R’s ptukey nor the literature this implementation follows supports a real computation in that region. PR #7327

  • MixedLM.fit’s warning for keyword arguments it does not recognize changed from RuntimeWarning to FutureWarning, and now states that a future version will raise instead of dropping the argument. Code that specifically filters RuntimeWarning to silence this message will need to filter FutureWarning instead. PR #9695

seed/random_state -> rng (SPEC-007)#

As described above, wherever a function or model previously accepted seed or random_state to control randomness, it now accepts rng instead. The old keyword names still work but emit a FutureWarning pointing at rng; they will be removed in a future release. If your code passes seed= or random_state= by keyword to statsmodels functions, you should switch to rng= to avoid the warning (and future breakage). Positional usage is unaffected in most cases since rng occupies the same position the old keyword did.

Variable-length tuple returns become NamedTuples#

As described above, functions that returned a tuple whose length depended on their arguments are moving to fixed-shape NamedTuple results. Where the NamedTuple unpacks exactly like the tuple it replaces there is nothing to do: existing code keeps working and no warning is raised.

Where adopting it would change how many values are unpacked, the affected call now emits a FutureWarning and continues to return the legacy tuple. This applies to:

Pass result_object=True to adopt the new result now, or result_object=False to keep the old return type and silence the warning. The default becomes the NamedTuple in 0.16.

RegressionResults.compare_lr_test always returned three values, so it was converted directly to a CompareLRTestResult with no deprecation period; it still unpacks as a three-tuple.

HolderTuple deprecated#

statsmodels.stats.base.HolderTuple, used internally as the return type for many statistical tests before the NamedTuple migration above, is now deprecated and will be removed after statsmodels 0.16. It is no longer constructed anywhere internally. Code that checked isinstance(result, HolderTuple) or relied on HolderTuple’s specific 2-tuple-unpacking behaviour should switch to the documented NamedTuple result class and named attribute access (e.g. result.statistic, result.pvalue) instead. PR #10072

Undocumented alternative short forms deprecated#

As described above (Stricter input validation for string-valued options), short, undocumented spellings of the alternative hypothesis-direction parameter ("2s", "l", "s", "i", "inc", "d", "dec", "2", and a few compare/statistic aliases in meta_analysis and _lilliefors) now raise a FutureWarning naming the documented replacement instead of working silently, and will be removed after statsmodels 0.16. PR #10170, PR #10173, PR #10180

Several previously-undocumented, silently-accepted string values elsewhere were similarly tightened to raise ValueError for anything outside the documented set – this is a validation fix, not a deprecation, so there is no warning period; code passing a value outside the documented {...} set needs to be corrected directly. PR #10161, PR #10167

Unused estimator classes deprecated#

The following classes and one function were found, during a systematic coverage audit, to have no callers anywhere in the codebase and no test coverage. They now raise a FutureWarning on construction/use and will be removed after statsmodels 0.16: NonlinearLS, MLEGLS, TSMLEModel, GLSHet, GLSHet2, TsaDescriptive, and the _Var class in tsa.varma_process (whose own docstring already called it “Obsolete”). nonparametric.smoothers_lowess_old.lowess gets the same treatment as a function – its own docstring examples already point at the actively maintained statsmodels.nonparametric.lowess. If you rely on any of these, please open an issue. PR #10156

FactorResults.uniq_stderr is now a method, not a property#

FactorResults.uniq_stderr previously accepted a documented kurt argument that could never actually be supplied, because the method was wrapped in @cache_readonly and so was only ever accessed as a bare attribute (result.uniq_stderr). The cache_readonly wrapper has been removed so kurt is usable as documented; this means existing code must change result.uniq_stderr to result.uniq_stderr(). There is no deprecation period for this one, since the old attribute-style access could never have supplied kurt correctly in the first place. PR #10175

Minimum dependency versions raised#

  • NumPy: 1.18 -> 1.23.5

  • SciPy: 1.4 -> 1.8

  • pandas: 1.0 -> 1.4

  • patsy: 0.5.2 -> 0.5.6

  • formulaic: new required runtime dependency, >=1.1.0

  • Building from source now requires NumPy >= 2.0, SciPy >= 1.13, and Cython >= 3.0.13 (see the meson-python migration above). This does not affect users installing wheels from PyPI.

Deprecated parameters removed entirely#

The following previously-deprecated (not previously-working) parameters and behaviors were removed as part of a general deprecation clean-up (PR #9936):

  • grangercausalitytests: the verbose parameter (deprecated since 0.14) has been removed. The function no longer prints results; use the returned dictionary as before.

  • AutoReg/ar_select_order: the old_names parameter (pre-0.12 variable naming, deprecated since 0.13) has been removed.

  • kpss: passing nlags=None now raises a ValueError instead of warning and silently falling back to 'auto'. Pass 'auto', 'legacy', or an explicit integer.

  • A number of internal compatibility shims for very old NumPy/SciPy/Python versions were removed from statsmodels.compat, including compat.numpy.lstsq, NP_LT_114, compat.python.asstr, asunicode, lfilter, and compat.scipy.SP_LT_16/SP_LT_17 (along with the vendored multivariate_t fallback they guarded). These were internal implementation details, not public API, but could have been imported directly.

Vendored pandas private APIs#

pandas has been privatizing or removing several small utilities that statsmodels relied on (cache_readonly, deprecate_kwarg, Appender, Substitution). statsmodels now vendors its own copies of these (in statsmodels.compat.pandas and statsmodels.tools.docstring_helpers) so behavior stays stable across pandas versions, including pandas 3. PR #9615, PR #9820, PR #9831

Other removals#

  • The long-empty statsmodels.interface package was removed. PR #9721

  • _lazywhere was removed in favor of apply_where. PR #9543

  • scipy.interpolate.interp2d (removed upstream in recent SciPy) is no longer relied on by TableDist. PR #9832

New Features and Enhancements#

Enhancements

  • Outlier-robust covariance estimation. PR #8129

  • ccf can optionally return confidence intervals. PR #8782

  • Plot cross-correlations and the auto/cross-correlation matrix. PR #8783

  • Plot the prediction curve over a scatter plot in GLMGamResults.plot_partial. PR #8881

  • Add get_margeff to GLM. PR #8889

  • Add MultivariateLS. PR #8919

  • Faster computation of state space revision impacts. PR #8937

  • Two-sample z-test, unequal-variances case. PR #8959

  • Improve lag selection in pacf. PR #9016

  • Add Cython 3 compatibility. PR #9078

  • GLM models now save the names of input pandas Series. PR #9130

  • Robust: additional tools and norms. PR #9186

  • Add CovDetMCD, CovDetMM, RLMDetSMM, and related estimators. PR #9227

  • Add a "one-sided" alternative for proportion_confint. PR #9249

  • Add an alternative option to confint_poisson. PR #9255

  • Add optional parameters to summary_col to indicate fixed effects. PR #9280

  • Ensure returned arrays are owned (not views). PR #9334

  • Improve precision of a diagnostic printout (mean_diff:.3g). PR #9388

  • Add the Leybourne-McCabe stationarity test. PR #9399

  • Add a sample-size calculation for Wilcoxon/Mann-Whitney tests. PR #9401

  • More reliable casting of pandas data. PR #9407

  • Add an abstracted formula engine supporting patsy and formulaic. PR #9423

  • Add ruff lint support. PR #9453

  • x13_arima_analysis can produce seasonality fit diagnostics. PR #9498

  • Allow the ARDL model to use a "ctt" trend. PR #9518

  • Add plot keyword arguments to qqplot_2samples. PR #9544

  • x13_arima_analysis gained an optional raw spec parameter. PR #9550

  • Support array-like and pandas-like data more broadly. PR #9582

  • Add a “no cross terms” option to White’s heteroscedasticity test. PR #9691

  • Add missing attributes to AutoReg. PR #9750

  • Add a seasonal diagnostic plot to graphics.tsaplots. PR #9787

  • Make tsa.statespace Cython usage compatible with SciPy ILP64 builds. PR #9798

  • Allow seasonal-differencing-only models with non-seasonal estimators. PR #9811

  • Add add_ellipse to graphics, and support passing x/y arrays. PR #9815

  • Add order validation to the Hannan-Rissanen estimator. PR #9819

  • Vendor Appender and Substitution docstring helpers from pandas. PR #9820

  • Vendor cache_readonly and deprecate_kwarg from pandas’ private API. PR #9831

  • Report the last root-finder value in the solve_power convergence warning. PR #9885

  • Consistently use rng to move towards SPEC-007. PR #9950

  • Add the partial cross-correlation function pccf and plot_pccf. PR #9802

  • Add the Hamilton filter. PR #9957

  • Add a delete-k (block) jackknife estimator. PR #10001

  • Allow pre-calculated error bands to be passed to the IRF plots. PR #9816

  • Support fixed_params in innovations_mle. PR #9845

  • Raise an informative error for impossible one-sided solve_power cases. PR #9895

  • Add a min_diag option to cov_nearest for zero or negative diagonal entries. PR #9898

  • acf/pacf accept a list of lags in addition to maxlag. PR #10016

  • Return NamedTuple results in place of variable-length tuples. PR #10025, PR #10027, PR #10029, PR #10030, PR #10035, PR #10072

  • Accept Polars DataFrame/Series input in models and the formula API. PR #9804

  • Add the Jonckheere-Terpstra ordered trend test. PR #9874

  • Add the Diebold-Mariano test of equal predictive accuracy. PR #10066

  • Add the Pesaran-Timmermann test of directional predictive accuracy. PR #10055

  • Add local false discovery rate estimation (local_fdr_correction). PR #10069

  • Add LocalProjections, a Jordà (2005) local-projections estimator for impulse response functions with Newey-West HAC standard errors. PR #9871

  • Implement an L1-penalized solver for GLM. PR #10101

  • Add CRV3 (cluster-jackknife) cluster-robust inference for OLS/ WLS. PR #10103

  • Warn when exog is (numerically) singular in the *LS model family, instead of silently returning an unreliable fit. PR #10140

  • Make the ndim check in array_like orthogonal to maxdim, so the two can be combined instead of one silently overriding the other. PR #10090

  • NominalGEE accepts non-numeric groups labels (for example strings), instead of failing to cast them to float64 internally. PR #10182

  • Robust linear model (RLM) scale-estimator callables passed via scale_est may now optionally accept the fitted model and residuals, in addition to the previously-supported single-argument (residuals only) form, which continues to work unchanged. PR #10191

  • Add fit_regularized to HurdleCountModel. PR #10204

  • MICEData is now iterable: each iteration step advances the chain by one update cycle and yields the current imputed dataset, so itertools.islice(mice_data, n) produces n successive imputed datasets. PR #10210

Performance

  • Optimize VECM memory/speed by avoiding an \(O(T^2)\) projection matrix. PR #9720

  • Improve the performance of ConditionalMNLogit. PR #9036

  • Add an \(O(N \log N)\) algorithm for medcouple. PR #9571

Notable Bug Fixes#

  • Fix a typo in the InfeasibleTestError exception string. PR #8878

  • Correct diagnostics for changes in pandas. PR #8887

  • MNLogit Wald tests: fix ravel, string cov_names. PR #8907

  • Fix writing a read-only array under pandas 2 copy-on-write. PR #8942

  • Fix an issue in seasonal.py. PR #9029

  • Ensure ARIMA simulation is reproducible. PR #9165

  • Fix scale.Huber and add a robust M-scale. PR #9210

  • Correct cov_kwargs -> cov_kwds. PR #9240

  • Ensure the Zivot-Andrews test does not overwrite its input. PR #9311

  • Avoid an in-place modification bug. PR #9385

  • Correct resid from UECM. PR #9390

  • Correct the x/y label location in qqplot_2sample. PR #9394

  • Remove an incorrect method assignment in GLM’s summary2. PR #9396

  • Ensure the Hessian is skipped where appropriate. PR #9398

  • Correct the log-likelihood computation for ETSModel. PR #9400

  • Ensure VAR can forecast with 0 lags. PR #9413

  • Correct DatetimeIndex handling. PR #9457

  • Correct handling of PeriodIndex in seasonal_decompose. PR #9461

  • SVAR: fix A/B dtype and a one-parameter score shape bug. PR #9468

  • Fix formula eval depth in model selection. PR #9471

  • Tukey’s HSD: fix an unused variance and add Games-Howell for the unequal-variance case. PR #9487

  • Fix a bug in Runs.runs_test for the case of a single run. PR #9524

  • Make the Binomial family more robust to the corner case mu=0, endog=0. PR #9581

  • Fix the add_trend error message to correctly identify constant columns. PR #9636

  • Fix conversion of 1-d arrays to scalars. PR #9673

  • Fix a state space model transition-timing bug. PR #9688

  • Pass alpha through to plot_predict. PR #9728

  • Fix an incorrect length comparison in endpoint transformation logic. PR #9729

  • Fix compilation errors in statespace/meson.build. PR #9738

  • Fix patsy eval_env handling in FormulaManager. PR #9739

  • Raise an error for invalid endog input in emplike.DescStat. PR #9747

  • Add an informative error message when Hessian inversion fails in fit_regularized. PR #9757

  • Replace bare except clauses with except Exception. PR #9758

  • Treat empty docstrings as None in the Docstring class. PR #9773

  • Fix use_boxcox control flow in ExponentialSmoothing.fit. PR #9797

  • Override the resid property in UECMResults. PR #9812

  • Avoid a division by zero in estimate_location. PR #9814

  • L-BFGS-B: respect disp=False instead of always printing output. PR #9823

  • Remove a dead assignment to cov_p in GLM’s fit. PR #9826

  • Fix the GLMInfluence.hat_matrix_diag method name. PR #9830

  • Fix VIF numerical instability by standardizing the design matrix. PR #9835

  • Skip summary diagnostics when slim=True. PR #9844

  • Fix anova_lm silently returning NaN p-values when models are passed in reverse order. PR #9852

  • Set k_exog_user on SVARResults so summary() works. PR #9853

  • Fix Binomial.deriv() to correctly return 1 - 2*mu/n (it was missing the division by n). PR #9862

  • Record the robust scale in RLM.fit_history. PR #9866

  • Fix the NegativeBinomial check for the optional alpha parameter. PR #9877

  • Return nan from Power.solve_power when it fails to converge, rather than a misleading value. PR #9884

  • Correct several parameter names in docstrings (prob_infl, bin_edges, pred_kwds, param_nums, mu1_low). PR #9886

  • Fix DiscreteResults crashing with full_output=0. PR #9887

  • Fix an ccovf shape mismatch for arrays of different lengths. PR #9888

  • describe/Description now handle a 0-row (empty) input gracefully. PR #9899

  • Fix an issue with random generation. PR #9901

  • Attach mlefit attributes to the results instance so they appear in dir(). PR #9902

  • Do not pass hess to L-BFGS-B/TNC in _fit_minimize, which do not accept it. PR #9908

  • Read the entropy integration limits from the kernel. PR #9919

  • Populate _retain_cols in out_of_sample without requiring a prior in_sample call. PR #9920

  • Correct a test that relied on the removed random-state singleton. PR #9924

  • Fix an import failure when matplotlib is not installed. PR #9925

  • Unify group_sums orientation and fix group_demean. PR #9933

  • Fix the scale attribute and resid_pearson for a fixed-scale cov_type. PR #9824

  • Pass ax through to dot_plot in CombineResults.plot_forest. PR #9829

  • Filter unsupported keyword arguments in MixedLM.fit instead of raising an AttributeError. PR #9906

  • Fix a Sison-Glaz confidence-interval failure for small or sparse counts. PR #9909

  • Fix the removal of the compat lstsq shim. PR #9958

  • Raise on non-2x2 tables in stats.mcnemar. PR #9974

  • Respect caller warning filters in the discrete fit_regularized (l1) path. PR #9976

  • Reject None in string_like and array_like unless optional=True. PR #9985, PR #9987

  • Do not re-validate the specification when extending SARIMAX results, so an exog constant column no longer blocks extend. PR #9992

  • score_test returns a documented NamedTuple result rather than a plain tuple (see the NamedTuple return values highlight above). PR #9993, PR #10072

  • Select the correct axis in drop_missing. PR #9994

  • Ensure AutoReg (and other) summary() calls still work after remove_data(). PR #10002, PR #10009

  • Report the correct accepted types in dict_like. PR #10005

  • Clip Wilson proportion_confint bounds to [0, 1]. PR #10010

  • Give sign_test a clear error when every observation ties with mu0. PR #10012

  • multipletests no longer raises ZeroDivisionError on an empty p-value array. PR #10013

  • maxabs and iqr no longer raise on empty input, matching the other eval_measures. PR #10014

  • Use the non-missing sample size for the acf confidence interval and Q-statistic when NaNs are handled. PR #10017

  • Raise an explicit error rather than dividing by zero in acf/acovf. PR #10020

  • linear_rainbow(..., use_distance=True) now centers on the exog centroid, so the result no longer depends on the arbitrary order observations happen to be stored in. PR #9903

  • ARDLResults.apply/append lost the per-variable exog lag order, because they inherited AutoRegResults.apply, which always reconstructs the cloned model as a plain AutoReg. PR #9915

  • The adjusted ccovf divided by len(x) - k instead of the actual number of overlapping observation pairs. PR #9916

  • wald_test_terms now reports the rank-adjusted degrees of freedom for rank-deficient models instead of the raw constraint-matrix row count. PR #9907

  • Cast the np.repeat argument to platform intp size in the Jonckheere-Terpstra test so it works on 32-bit platforms (Pyodide). PR #10075

  • breakvar_heteroskedasticity_test (and the state space and ETS test_heteroskedasticity methods built on it) referred the raw ratio of the two sums of squares to F(numer_dof, denom_dof). The ratio of sums is that F only after rescaling by denom_dof / numer_dof, so the p-values were wrong whenever missing observations left the two subsets with different numbers of usable residuals – for example a multivariate state space model with a ragged edge. The use_f=False variant had its multiplier and its degrees of freedom interchanged, and the decreasing alternative did not swap the degrees of freedom when it inverted the statistic. Balanced samples, which is the usual case, are unaffected.

  • Fix edge cases in the \(O(N \log N)\) medcouple path. PR #10084

  • Check the sign of the smallest eigenvalue before taking its square root when forming a condition number, instead of letting a tiny negative value (floating-point noise) raise. PR #10088

  • Fix MNLogit.resid_response raising ValueError instead of returning residuals. PR #10089

  • Forward a kwarg that MixedLM.from_formula was silently dropping instead of passing to the superclass constructor. PR #10105

  • Pivot the QR factorization used in tools.matrix_rank, so rank is computed correctly for matrices that need pivoting for numerical stability. PR #10106

  • Fix numerous small bugs in robust.norms, RLM, and stats.stattools. PR #10113

  • Add a missing self in an ETSModel update path. PR #10120

  • Correct the distargs usage in robust.scale.scale_trimmed. PR #10130

  • Fix a line-style bug in the Bland-Altman agreement plot. PR #10131

  • Enable the percentile option in _select_sigma for kernel bandwidth selection. PR #10132

  • Fix a sign/orientation bug (factor.py reversed the intended direction). PR #10133

  • Only initialize the trend component in exponential smoothing when the model actually has one. PR #10134

  • Correct the Hessian choice in othermod.betareg. PR #10135

  • Ensure the bar gap size is computed correctly in mosaic_plot. PR #10136

  • Ensure SVAR raises for options it does not actually implement, instead of silently ignoring them. PR #10137

  • Fix several bugs found in a systematic full-codebase scan, including in MixedLM and stats.multivariate_tools. PR #10139

  • Fix additional small bugs, including in iolib.table. PR #10141

  • Correct the shape of the values returned by CanCorr. PR #10143

  • Fix OLSInfluence._ols_xnoti crashing on every call. PR #10152

  • Fix RLMDetSMM.fit crashing with its own documented h=None default. PR #10154

  • Fix MICEData using the observed-row index instead of the full index when building predict_miss_kwds. PR #10163

  • Guard against zero_kwds=None in effectsize_2proportions. PR #10165

  • Fix a crash in SARIMAX time-varying regression when the state vector also includes differencing. PR #10172

  • Coerce the offset argument with array_like in PoissonZiGMLE, instead of failing on plain Python sequences. PR #10174

  • Coerce cov_null with array_like in stats.multivariate instead of requiring a NumPy array. PR #10176

  • get_prediction for GLM-like models now always has a linear predictor available when one is requested. PR #10178

  • Correct the knot-centering computation in get_knots_bsplines for splines with few interior knots, where it previously produced incorrect (non-equally-spaced) knots or raised. PR #10177

  • Pass transformed through to the likelihood when computing the MarkovSwitching Hessian, matching score. PR #10187, Issue #10148

  • wald_test (chi-square path, the default) raised AttributeError for any results class without a df_resid attribute, such as MarkovRegressionResults/MarkovAutoregressionResults, even though df_resid is only needed for the F-test (use_f=True) path. PR #9297

  • BinomialBayesMixedGLM.fit/PoissonBayesMixedGLM.fit always returned None instead of the fitted results instance (see Breaking Changes and Deprecations above). VariedCovStruct.summary() (in genmod.cov_struct) printed directly instead of returning a string like the other covariance-structure summary() methods. PR #10195

  • GLS.hessian_factor was wrong for both non-scalar sigma cases, and ProcessMLE.covariance() omitted the exp() link transform on the scale/smoothing parameters for models not built from a formula, silently producing wrong (and sometimes NaN, through a negative variance) covariance matrices. PR #10196; see also PR #10203 and Breaking Changes and Deprecations above.

  • In the non-IRLS gradient-optimizer path of GLM.fit, a valid normalized_cov_params fallback was discarded whenever the observed Hessian could not be inverted, so bse came back all-NaN even though a usable covariance estimate existed. PR #9794

  • The ridge_factor Hessian regularization in LikelihoodModel.fit(method="newton") was applied with the wrong sign for the “newton” branch specifically. PR #10184

  • Fix the Tweedie GLM log-likelihood overflowing to inf for 1 < var_power < 2 by using scipy.special.log_wright_bessel (SciPy >= 1.14). PR #10179, PR #10186, PR #10188

  • psturng/Tukey’s HSD/Games-Howell: raise a clear error instead of returning a fabricated p-value for degrees of freedom 1 <= v < 2 with an extreme statistic; also fixes wording in related error messages. PR #7327

  • MNLogit.score_test(exog_extra=...) crashed with AttributeError because MNLogit did not implement score_factor/ hessian_factor. PR #10185

  • emplikeAFT.predict used endog where it meant exog, so passing new data to predict from raised or produced nonsensical output. PR #10197

  • Two contour-plotting bugs in emplike descriptive statistics: DescStatUV.plot_contour’s default levels were in decreasing order, which recent Matplotlib rejects outright, and DescStatMV.mv_mean_contour contoured the unbounded -2 log log-likelihood ratio against levels documented as significance levels instead of the already-computed p-value, making the plotted region degenerate. PR #10197

  • rvs_kernel’s Beta-kernel perturbation step ignored the rng argument and always drew from SciPy’s global default state, so two calls with identically-seeded generators did not reproduce the same output. PR #10198

  • Representation.initialize_components raised TypeError on every call (missing the required k_states argument in its internal Initialization.from_components call). PR #10200

  • miso_lfilter selected the wrong output column for any number of input variables other than 2 or 3 (an IndexError for 1 variable, silently wrong output with no error for 4 or more). PR #10201

  • HurdleCountModel.fit now splits start_params between its zero and main components instead of passing the full vector to both, and fit_regularized reports the joint refit’s own convergence flag; the L1-penalized solver also raises on a non-finite Hessian instead of silently returning a NaN covariance. PR #10205

  • ARDLResults.apply/append no longer raises on a legitimate no-exog-to-no-exog round trip, and its exog-mismatch error messages are now actually reachable. PR #10207

Build, Packaging, and Infrastructure#

  • Migrate the build backend from setuptools/setup.py to meson-python. PR #9634

  • Update minimum dependency versions (multiple passes). PR #9110, PR #9112

  • Add experimental Pyodide/WebAssembly support and CI jobs, including fixing an OpenBLAS symbol error under Emscripten. PR #9270, PR #9343

  • Avoid non-deterministic ordering in include_dirs lists (reproducible builds). PR #9296

  • Further clean-up of the build configuration. PR #9632

  • Generate free-threading (no-GIL) compatible Cython modules. PR #9717

  • Ensure the libm C math library is linked for all build targets. PR #9778

  • Remove the oldest-supported-numpy build workaround now that NumPy 2 is the floor for building from source. PR #9312

  • CI: add Python 3.13/3.14 (including free-threaded 3.14t) jobs, drop active Python 3.9 testing, and pin GitHub Actions to full commit SHAs for supply chain hardening. PR #9547, PR #9656, PR #9709, PR #9913, PR #9843

  • Routine dependency updates for GitHub Actions were kept current via dependabot throughout the release cycle (actions/checkout, actions/setup-python, actions/setup-node, github/codeql-action, pypa/cibuildwheel, r-lib/actions/setup-pandoc, and ts-graphviz/setup-graphviz) across roughly two dozen pull requests not individually itemized here.

  • Improve the documentation-build requirements. PR #9949

  • Improve notebook generation. PR #9990

  • Add a CI run for the X-13ARIMA-SEATS tests. PR #10021

  • Add a lint-only CI workflow (ruff + flake8). PR #10064

  • Improve the documentation-generation CI job, and switch the X-13ARIMA-SEATS CI job to build with coverage and use a different binary installation method. PR #10052, PR #10048, PR #10051

  • Remove the coveralls integration. PR #10080

  • Routine dependabot bumps for pypa/cibuildwheel and actions/github-script. PR #10070, PR #10071

  • Also look for .exe-suffixed binaries when locating the X-13ARIMA-SEATS executable on Windows. PR #10087

Documentation#

In addition to numerous individual typo, notebook, and docstring corrections, this release cycle included a large, systematic effort to bring docstrings across the codebase in line with the numpydoc standard (module by module: discrete, genmod, stats, tsa/ statespace, base/compat/datasets, graphics, imputation/multivariate/nonparametric, emplike/duration, treatment/gam, tools, othermod/regression/robust, and more), plus a documentation theme change to pydata-sphinx-theme and a pass over example notebooks to fix formatting and broken links. A second, final pass in the closing weeks of the cycle brought the remaining modules up to the same standard and fixed up the stragglers it turned up along the way: tools (PR #10107), robust (PR #10108), stats (PR #10110), othermod/treatment/multivariate (PR #10111), base/datasets/compat (PR #10112), regression (PR #10114), formula/graphics/imputation (PR #10116), core tsa routines (PR #10117), discrete/duration/gam/genmod (PR #10119), distributions/emplike/iolib/miscmodels (PR #10121), nonparametric (PR #10123), vector_ar (PR #10124), statespace (PR #10127), and dataset docstrings (PR #10128), plus general clean-up of numpy/ pandas usage (PR #10115), rng parameter docstrings (PR #10145), and the AGENTS.md guidance used to drive this pass (PR #10125).

Testing, Linting, and Maintenance#

A substantial amount of routine maintenance went into keeping the test suite green against upstream changes in NumPy, SciPy, and pandas (including pandas copy-on-write and preparation for pandas 3), adopting ruff for linting in addition to flake8, running isort/pyupgrade across the codebase, relaxing overly tight test tolerances, and improving thread safety of the test suite ahead of free-threaded CPython support.

In the final weeks of the cycle, a systematic coverage audit went through results-class attributes and methods, computational code paths, and summary/table content that had no test asserting on it, adding regression tests and turning up several of the bug fixes listed above. PR #10150, PR #10151, PR #10153, PR #10155

Selected items:

  • Reduce direct use of the global np.random state in the library and in tests. PR #9878, PR #9879, PR #9737

  • Prepare for pandas 3 (string dtype changes, removed features). PR #9245, PR #9247, PR #9602, PR #9689, PR #9722

  • Adopt ruff for linting. PR #9453, PR #9642, PR #9643, PR #9650

  • Run isort across the codebase. PR #9855

  • Remove the obsolete, empty statsmodels.interface package. PR #9721

  • Improve thread safety of the test suite. PR #9742, PR #9904, PR #9910

  • Add CI coverage for Python 3.13/3.14 and free-threaded CPython. PR #9547, PR #9656, PR #9709

  • Move from isort to ruff for import sorting. PR #9981

  • Reduce mutation of model state inside fit() methods. PR #9972

  • Remove long-standing anti-patterns across genmod, multivariate, robust, tsa, stats and tools, and extend the same conventions to the remaining modules. PR #9973, PR #9977, PR #9978, PR #9980, PR #9984

  • Use pathlib in place of os.path. PR #9988

  • Remove unproductive if __name__ == "__main__" blocks, converting the useful ones into tests. PR #10023

  • Archive unused statsmodels.sandbox files and remove leftover debug code. PR #10018, PR #10019

  • Remove further deprecations and outdated compatibility code. PR #10015, PR #10026

  • Raise the declared Python floor to the actual minimum of 3.10, and improve the formula-engine specification. PR #9953, PR #9995

  • Add tests for the summary()-after-remove_data() pattern across models. PR #10003, PR #10007, PR #10008

  • Add a marker for joblib-dependent tests and fix a test on older SciPy. PR #9948, PR #10022

  • Clean up the examples and assorted lint. PR #9959, PR #9989

  • Update the declared NumPy minimum to reflect the version actually required, and remove the legacy NumPy code it made unreachable. PR #10032

  • Reduce warning noise in the test suite (new filterwarnings entries and pytest.warns wrappers for warnings introduced by the NamedTuple migration). PR #10068

  • Remove the now-redundant method validation in yule_walker (already performed by string_like). PR #10077

  • Rename misleadingly-named WLS equivalence tests, and clean up remaining small issues and lint. PR #10039, PR #10062, PR #10082

  • Prefer pandas.read_csv over numpy.genfromtxt for reading example data. PR #10054

  • Protect against pandas 4 changes. PR #10058, PR #10065

  • Improve the issue and pull-request templates. PR #10050, PR #10060

  • Assorted small maintenance ahead of the release. PR #10056

  • Test the remaining edge cases in the Jonckheere-Terpstra test. PR #10083

  • Move the NamedTuple result classes away from a shared limited-iteration mixin, standardize field names, and simplify the mix of NamedTuple and dataclass usage introduced earlier in the cycle. PR #10093, PR #10095, PR #10096, PR #10098

  • Restore a behavior change that had been introduced accidentally. PR #10094

  • Improve import performance in some cases. PR #10102

  • Move non-core code out of the main package. PR #10168

  • Re-enable a previously-skipped test, and change the warning class expected from fit_collinear and from tests running under WASM. PR #10138, PR #10142, PR #10144

  • Silence expected-but-noisy singularity warnings in the test suite. PR #10146

  • Add tests for the rng argument selector. PR #10147

  • Add a marker for matplotlib-dependent tests. PR #10166

  • CI: work around a Cython/conda incompatibility that intermittently broke the legacy conda test job. PR #10158, PR #10160, PR #10162

  • Add tools/check_public_api_coverage.py and tools/class_coverage_report.py, AST-based scripts that find public API surface and estimation-class code with no test coverage, plus a CI job that runs them with a baseline so the zero-coverage set cannot grow; this tooling drove much of the coverage-motivated bug-hunting elsewhere in this release. PR #10189

  • Standardize fully on ruff for linting and drop flake8 from CI and pre-commit, now that ruff covers the rules previously split across both tools. PR #10192, PR #10193

  • Add further regression tests from the public-API coverage audit for statsmodels.test, docstring_helpers, eval_measures.stde, moment_helpers.mnc2mvsk, gof.gof_chisquare_discrete/ gof_binning_discrete, RegressionFDR.threshold, weightstats.DescrStatsW.ttost_mean/CompareMeans.ztost_ind, datasets.utils.clear_data_home, iolib.table.SimpleTable.pad, GenericLikelihoodModel.reduceparams/nloglike, and DistributedModel.fit_joblib/DistributedResults.predict, each checked against an independent reference rather than only asserting no exception is raised. PR #10194

  • Add coverage for VARProcess/VARResults autocorrelation methods. PR #10199

  • Reduce the number of Linux CI jobs to speed up completion. PR #10181

  • Further pandas-compatibility maintenance (factor.py, grouputils.py, an x13 test). PR #10206

  • Skip a test requiring an exact LinAlgError message on WASM/Pyodide. PR #10202

Major Bugs Fixed#

See github issues for a list of bug fixes included in this release

Development summary and credits#

Thanks to everyone who contributed code, documentation, bug reports, and review to this release cycle. The following list of contributors is generated from git log between v0.15.0.dev0 and the v0.15.0 release, and may not be complete or fully deduplicated across differently-configured git identities:

Achraf Ez, Aditi Juneja, Adrian Ross, Agriya Khetarpal, Alex Alborghetti, Alexander Fischer, Andrés, Andrés López, Anh Trinh, Aniket, Aniket Singh Yadav, Anselm Hahn, Antoine Mayerowitz, Anton Karpov, Anuraag Pandhi, Artem Glebov, Ayush Gupta, Ben, Benjamin Leff, Bortlesboat, Caleb Lindgren, Chad Fulton, Christine P. Chai, Clément Fauchereau, Daan Knoope, David Ivanov, Deshan, Dhairya Motta, Dhruvil Darji, Eden Rochman, Elton Chang, Erich Morisse, Eugen Goebel, Evan Lyall, Evgeni Burovski, FuturMix, Hadi Dayekh, Harish Bhavandla, Hood Chatham, IsaacP, IntegralIndefinida, Illia Polovnikov, Iman, Jake Soloff, Jesse W. Collins, Jim Varanelli, Joey Scanga, Josef Perktold, Joshua Markovic, Justin Mahlik, Kaif, Kakarot35, Kayvan Zahiri, Kevin Sheppard, Kevin Gregory, Kumar Aditya, Lakshmi786, Loi Nguyen, Luke J, Maciej Skorski, Manlai Amar, Marc Bresson, Mathias Hauser, Maxime Gourguechon, Melissa Wu, Michał Górny, Michel de Ruiter, Naimish Machchhar, Panzerkampfwagen-del, Pranav Achar, Puneet Dixit, Rahul Rathnavel K, Ralf Gommers, Rebecca N. Palmer, Ritika shrestha, RoyS, Seaic Mac Murchadha, Sebastian Pölsterl, Shamus, Solaris-star, Sreekant Baheti, Tartopohm, Vedant Madane, Vikram Kumar, Viktor, Vitaliy, Vladimir Saraikin, Wali Reheman, Will Tirone, YangWu1227, Zbigniew Jędrzejewski-Szmek, Zhang Hong, Zhengbo Wang, adarshsm, alekracicot, camaramm, chuenchen309, cjck944084735-dot, genrichez, hass-nation, lev, libokai, louisabraham, mkzung, star1327p, uttam12331, whn, and many others.

These lists are automatically generated based on git log and may not be complete.

Merged Pull Requests#

The following Pull Requests were merged since the last release:

  • PR #4216: DOC: Added explanation of fdr_bh to docstring of fdrcorrection

  • PR #7326: BUG: Fix libsturng issue #7324

  • PR #7568: MAINT: Fix incorrect submodule name (statsmodels.family -> sm.families)

  • PR #8129: ENH: Outlier robust covariance - rebased

  • PR #8782: ENH/TST: ccf to optionally return confidence intervals

  • PR #8783: ENH: Plot cross-correlations and auto/cross-correlation matrix

  • PR #8865: MAINT: Move from Styler.applymap to map

  • PR #8866: DOC: Add admonitions for changes and deprecations

  • PR #8867: DEV: Start of 0.15 branch

  • PR #8870: TST: install missing *.csv files needed by tsa.stl tests

  • PR #8872: MAINT: Add CI for install and sdist install

  • PR #8874: Backport of #8870 and #8872

  • PR #8875: TST: Relax tolerance on overly tight test

  • PR #8876: TST: Relax tolerance on overly tight test

  • PR #8878: BUG Fix typo in InfeasibleTestError exception string

  • PR #8881: ENH: plot prediction curve over scatter in GLMGamResults.plot_partial

  • PR #8886: DOC: Correct links to notebooks

  • PR #8887: BUG: Correct diagnostics for changes in pandas

  • PR #8889: ENH: add get_margeff to GLM

  • PR #8897: MAINT: Update for future pandas changes

  • PR #8900: DOC: correct typo in WLS.loglike docstring

  • PR #8907: BUG: mnlogit wald tests, ravel, string cov_names

  • PR #8919: ENH: add MultivariateLS

  • PR #8930: MAINT: Remove deprecated utility

  • PR #8932: CLN: Fix typos

  • PR #8937: ENH/PERF: faster computation of revision impacts

  • PR #8939: MAINT: Update nightly location

  • PR #8940: MAINT: Make changes for deprecations

  • PR #8941: DOC: Add install instructions for nightly

  • PR #8942: BUG: Writing read-only arry on pandas 2/CoW

  • PR #8946: DOC: correct signature of CopulaDistribution

  • PR #8948: DOC: fix inconsistency in var_model.py

  • PR #8959: ENH: 2-sample z-test unequal variances case

  • PR #8963: DOC: Fix inclusion of plots

  • PR #8974: DOC: Include correct plot in scatter_ellipse

  • PR #8975: DOC: docstrings in robust.norms, improve, reorganize

  • PR #8988: STY: Switch from == to is for type comparrison

  • PR #8989: MAINT: Insert some initial NumPy caps

  • PR #8990: MAINT: Block pandas 2.1.0

  • PR #8992: Bump actions/checkout from 3 to 4

  • PR #9011: DOC: fix small typo

  • PR #9016: ENH: Improve lag selection in pacf

  • PR #9029: Update seasonal.py

  • PR #9036: ENH: Improved performance of the ConditionalMNLogit class

  • PR #9041: Backport 0.14.1

  • PR #9046: Forward port

  • PR #9059: TST: Ensure value is float

  • PR #9078: ENH: Add compatability with Cython 3

  • PR #9082: DOC: fix typo

  • PR #9083: CI: Ensure non-zero exit fails

  • PR #9086: Bump actions/setup-python from 4 to 5

  • PR #9087: MAINT: Use RandomState in-place of np.random.seed

  • PR #9088: MAINT: Protect against future pandas changes to merge/sorting

  • PR #9089: MAINT: Use modern freq names

  • PR #9092: Backport 0.14.1

  • PR #9098: Bump github/codeql-action from 2 to 3

  • PR #9101: refactor code to drop constant columns

  • PR #9106: MAINT: Explore NumPy 2 compatability

  • PR #9110: BLD: Update minimums

  • PR #9111: MAINT: Fix future issues in pandas

  • PR #9112: Update mins v2

  • PR #9113: MAINT: Remove conditions producing warnings

  • PR #9115: MAINT: Clean up and silence some warnings

  • PR #9116: CI: Update pip pre to 3.12

  • PR #9117: edited requirements.txt

  • PR #9124: MAINT: Fix future issues due to array shapes

  • PR #9126: MAINT: Fixes for pre-release testing

  • PR #9130: ENH: GLM models now save the names of input Pandas Series

  • PR #9142: Fix linting error

  • PR #9143: Fix string formatting

  • PR #9144: MAINT: Replace quarterly string identified

  • PR #9149: Bump ts-graphviz/setup-graphviz from 1 to 2

  • PR #9150: MAINT: Fixes for future changes

  • PR #9158: DOC: Fix broken in linear_regression_diagnostics_plots

  • PR #9165: BUG: Ensure ARIMA simulation is reproducable

  • PR #9186: ENH: robust: tools and more norms

  • PR #9192: DOC: fixed boxpierece typos

  • PR #9195: MAINT: Make compatability with NumPy 2

  • PR #9200: Cherry pick commits from 0.15 for 0.14.3

  • PR #9203: DOC: Add release note

  • PR #9208: DOC: fixed typos init_training_endog

  • PR #9210: BUG/ENH: fix scale.Huber and add robust MScale

  • PR #9212: DOC: Final docs for 0.14.2

  • PR #9213: DOC: Final docs for 0.14.2

  • PR #9216: DOC: Fix interactions notebook

  • PR #9218: DOC: Fix multiple issues in notebooks

  • PR #9226: DOC: Update pvalue description in weightstats.py of ztest and ztest_mean

  • PR #9227: ENH: add CovDetMCD and det for regression

  • PR #9230: DOC: Improve docs of regression_diagnostics.html, stats.html, summary

  • PR #9240: BUG: Correct cov_kwargs -> cov_kwds

  • PR #9245: MAINT: Fix issues with pandas 3

  • PR #9247: MAINT: Additional fixes for pandas 3

  • PR #9249: added “one-sided” alternative for proportion_confint

  • PR #9255: ENH: add alternative option to confint_poisson

  • PR #9262: MAINT: Change future keyword argument

  • PR #9270: Add Pyodide support and CI jobs for statsmodels

  • PR #9280: ENH: Add optional parameters for summary_col to indicate FEs (rebased)

  • PR #9285: DOC: Replace postive by positive

  • PR #9291: REF: Remove numpy testing import from test runner

  • PR #9292: MAINT: Update requirements

  • PR #9296: Avoid random ordering in include_dirs lists

  • PR #9299: DOC: Generate docs for plot_ccf and plot_accf_grid

  • PR #9309: DOC: Add explanation of typ I II III of anova_lm

  • PR #9310: DOC: Fix documentation of statsmodels.tsa.ar_model.AutoReg

  • PR #9311: BUG: Ensure ZA does not overwrite

  • PR #9312: MAINT: Remove oldest-supported-numpy

  • PR #9334: ENH/BUG: Ensure array is owned

  • PR #9336: MAINT: Change how indices are compared

  • PR #9341: Bump actions/setup-node from 4.0.2 to 4.0.3

  • PR #9343: Fix OpenBLAS pow_dd unresolved symbol error, update Emscripten CI testing

  • PR #9346: DOC: Add citation file

  • PR #9348: DOC: Improve documentation of acf and plot_acf

  • PR #9351: STY: Accept 88 characters in linting

  • PR #9354: MAINT: Simplify and standardize setup

  • PR #9356: MAINT: Backport changes needed for 0.14.3 release

  • PR #9358: TST: Relax tolerance on test that fails for dynamic factor

  • PR #9359: MAINT: Run pyupgrade on 0.14 branch

  • PR #9360: MAINT: Run pyupgrade on main branch

  • PR #9361: adjusting notation of error term in regression docs

  • PR #9363: DOC: Add release note for 0.14.3

  • PR #9364: DOC: Spelling

  • PR #9365: Backport of #9270: add Pyodide support and CI jobs for v0.14.x

  • PR #9370: Bump actions/setup-node from 4.0.3 to 4.0.4

  • PR #9372: Fix docstring formula display in SVAR class

  • PR #9377: DOC: Add release note for 0.14.4

  • PR #9379: DOC: Fix version number

  • PR #9385: BUG: Avoid modification in place

  • PR #9386: MAINT: Fix scalar assignment

  • PR #9388: ENH: changed np.round(mean_dff,2) -> mean_diff:.3g

  • PR #9389: feature/wilcoxon mann whitney sample size

  • PR #9390: BUG: Corect resid from UECM

  • PR #9391: DOC: Imroves docs for exponentialsmoothing and other places

  • PR #9394: BUG: Correct x and y label location in qqplot_2sample

  • PR #9395: MAINT: Replace deprecated Pandas append with concat in dynamic_factor_mq

  • PR #9396: BUG: Remove method setting in summary2 of genmod

  • PR #9397: DOC: Fix typo in previous fix

  • PR #9398: BUG: Ensure hessian is skipped

  • PR #9399: ENH: Add leybourne-mccabe test

  • PR #9400: BUG: Correct LLF for ETSModel

  • PR #9401: Feature/wilcoxon mann whitney sample size squashed

  • PR #9407: ENH: more reliable casting of pandas data

  • PR #9411: Bump actions/setup-node from 4.0.4 to 4.1.0

  • PR #9413: BUG: Ensure VAR can forecast with 0 lags

  • PR #9422: DOC: updated mediation tutorial documentation

  • PR #9423: ENH: Abstract formula engine

  • PR #9424: TST: Make test more resiliant

  • PR #9439: Dependencies consistency

  • PR #9449: CI: Update permissions

  • PR #9453: ENH: Add ruff support

  • PR #9457: BUG: Correct DatetimeIndex use

  • PR #9458: TST: Restore skip when no x13 available

  • PR #9461: BUG: Correct handleing of PeriodIndex in seasonal_decompose

  • PR #9462: DOC: Corrected a typo in chi^2

  • PR #9467: Update conf.py year

  • PR #9468: BUG: svar, A,B dtype, one parameter score shape, closes #9302

  • PR #9470: MAINT: Bump formulaic to 1.1.0

  • PR #9471: Fix formula eval depth in select models

  • PR #9477: DOC: Corrected typos in the Hurdle Count Model example

  • PR #9483: DOC: remove empty cell in tsa_arma_0.ipyb file

  • PR #9484: DOC: fixed ETS simple exponential smoothing equations

  • PR #9487: BUG/ENH: Tukeyhsd, fix unused variance, add Games-Howell

  • PR #9492: Bump actions/setup-node from 4.1.0 to 4.2.0

  • PR #9498: Modify x13_arima_analysis to produce seasonality fit diagnostics

  • PR #9503: TST: Relax tolerance on overly tight test

  • PR #9510: fix doc for extrapolate_trend and allow period as well

  • PR #9518: [ENH] Allow ARDL model trend ‘ctt’

  • PR #9524: BUG: Fix bug in Runs.runs_test for the case of a single run yielding …

  • PR #9532: DOC: fix duplicate words in weightstats

  • PR #9535: Bump actions/setup-node from 4.2.0 to 4.3.0

  • PR #9541: BUG: Correct spelling of pytest fixture

  • PR #9543: MAINT: Remove _lazywhere in favor of apply_where

  • PR #9544: ENH: add plotkwargs for qqplot_2samples()

  • PR #9545: MAINT: Improve handeling of missing mvndst

  • PR #9546: STY: Remove unused import

  • PR #9547: CI: Fix flaky test and add 3.13 jobs

  • PR #9550: Add optional raw spec parameter for x13_arima_analysis()

  • PR #9551: DOC: Check, fix and format some notebooks

  • PR #9552: DOC: Check, fix and format some notebooks

  • PR #9553: DOC: Fix statespace local linear

  • PR #9554: DOC: Format and fix up notebooks

  • PR #9557: Bump actions/setup-node from 4.3.0 to 4.4.0

  • PR #9558: DOC: Fixed typo in VARResults Attribute docstring : params -> coefs.

  • PR #9561: Fix Broken Link to Citation Paper of 2010 Conference

  • PR #9568: MAINT: Convert decimal for float to avoid future issue

  • PR #9571: ENH: medcouple n log n (see #9570)

  • PR #9581: BUG: make Binomial family more robust to corner case mu=0 , endog=0

  • PR #9582: ENH: Support for array-like and pandas-like data

  • PR #9586: MAINT: Remove lazywhere

  • PR #9588: DOC: Update supported Python versions

  • PR #9591: Rls 0 14 5 notes

  • PR #9594: MAINT: Forward port changes to Holt-Winters

  • PR #9595: TST: Fix warning catching

  • PR #9596: Xfail regularized problems

  • PR #9597: STY: Fix linting fails

  • PR #9598: Future fixes

  • PR #9602: MAINT: Prepare for pandas 3 strings

  • PR #9607: Commit (statsmodels/statsmodels#9606)

  • PR #9615: MAINT: Wrap pandas deprecate_kwarg

  • PR #9616: Bump actions/checkout from 4 to 5

  • PR #9617: DOC: Fix minor issues in notebooks

  • PR #9618: Update pytest

  • PR #9621: DOC: Fix minor issues in notebooks and RST

  • PR #9622: Fix redundant heading in docs/README.md

  • PR #9624: Bump actions/setup-python from 5 to 6

  • PR #9625: Bump actions/setup-node from 4.4.0 to 5.0.0

  • PR #9626: DOC: Fix typo in maintainer_notes.rst (get → git)

  • PR #9630: MAINT: Fix for deprecation warnings

  • PR #9631: MAINT: Remove dependence on npymath

  • PR #9632: SETUP: Further clean up on setup

  • PR #9633: MAINT: Update for recent changes

  • PR #9634: BLD: Explore using meson

  • PR #9636: Fix ‘add_trend’ error message to correctly specify which columns are constant.

  • PR #9637: TST: Report xfail for flaky test

  • PR #9638: CI: Close figures at the end of tests

  • PR #9639: TST: Fix test that fails in prerelease testing

  • PR #9640: Assert rasies

  • PR #9641: MAINT: Remove unused import

  • PR #9642: CL:N: Add Stacklevel and other quality issues

  • PR #9643: CLN: Implement rules that are close to passing

  • PR #9644: CLN: Remove some additional formatting issues

  • PR #9646: Fix import error

  • PR #9647: CLN: Remove some additional formatting issues

  • PR #9648: MAINT: Remove panding deprecation matrix usage

  • PR #9649: MAINT: Remove panding deprecation matrix usage

  • PR #9650: CLN: Fix linting for bugbear

  • PR #9651: Ruff tests

  • PR #9652: Bump pypa/cibuildwheel from 3.1.4 to 3.2.0

  • PR #9656: CI: Add 3.14 in GH actions

  • PR #9660: DOC: Fix Gamma loglike_obs docstring and clarify weights parameteriza…

  • PR #9668: Bump github/codeql-action from 3 to 4

  • PR #9669: Bump pypa/cibuildwheel from 3.2.0 to 3.2.1

  • PR #9673: BUG: Fix conversion of 1-d arrays to scalars

  • PR #9683: DOC: Fix issues affecting notebooks

  • PR #9688: BUG/DOC: fix state space model transition timing

  • PR #9689: MAINT: Remove feature deprecated in Pandas 3

  • PR #9691: ENH: Add no cross terms option to White’s test for heteroscedasticity

  • PR #9692: Bump pypa/cibuildwheel from 3.2.1 to 3.3.0

  • PR #9698: Bump actions/checkout from 5 to 6

  • PR #9700: MAINT: Improve compatability with recent NumPy

  • PR #9701: DOC: Release note for 0.14.6

  • PR #9709: CI: add CPython 3.14t CI

  • PR #9710: STY: Use del obj.attr rather than delattr(obj, “attr”)

  • PR #9712: MAINT: Obscure cow changes

  • PR #9716: TST: run nonparametric tests in parallel on CI

  • PR #9717: BLD: generate free-threading compatible cython modules

  • PR #9718: DOC: fix typo in example notebook

  • PR #9720: PERF: Optimize VECM memory/speed by avoiding O(T^2) projection matrix

  • PR #9721: MAINT: remove obsolete statsmodels.interface package (empty)

  • PR #9722: MAINT: lazy_apply patsy/pandas compatibility

  • PR #9724: Fixed some spelling, grammar, and punctuation on the theta model example notebook

  • PR #9726: TST: Add marker for high memory tests

  • PR #9728: BUG: Pass alpha to plot_predict

  • PR #9729: FIX: incorrect length comparison in endpoint transformation logic

  • PR #9732: CLN: Removed unused _partial_regression function Fixes #9731 The _par…

  • PR #9735: Bump pypa/cibuildwheel from 3.3.0 to 3.3.1

  • PR #9736: TST: Xfail test on Windows due to SciPy changes

  • PR #9737: REF: Remove dependence on global RandomState

  • PR #9738: BUG: FIX compilation errors in statespace/meson.build #9733

  • PR #9739: BUG: Fix patsy eval_env handling in FormulaManager and add parametrized re…

  • PR #9742: TST: Enable thread safe tests

  • PR #9747: BUG: raise error for invalid endog input in emplike.DescStat

  • PR #9749: docs: fix broken academic reference in anova.py

  • PR #9750: ENH: Add missing attributes from AutoReg

  • PR #9755: DOC: fixed import statement in api-structure page

  • PR #9757: fix: add informative error message when Hessian inversion fails in fit_regularized

  • PR #9758: fix: replace 4 bare except clauses with except Exception

  • PR #9759: Bump pypa/cibuildwheel from 3.3.1 to 3.4.0

  • PR #9760: Relax overly tight test tol

  • PR #9761: TST: Xfail bad test

  • PR #9762: CI: Add jinja2 for testing

  • PR #9763: MAINT: fix compat.scipy.apply_where for scipy-internal change

  • PR #9764: TST: Remove valid cases from exception check

  • PR #9766: DOC: improve docstrings in robust.norms

  • PR #9767: MAINT: use get_lapack_funcs for low-level LAPACK functions

  • PR #9769: CLN: Fix lint issues

  • PR #9770: TST: Attempt to isolate OSX failure

  • PR #9771: STY: Fix flake8 error

  • PR #9772: MAINT: Check that returned eigenvalues are real

  • PR #9773: BUG: Treat empty docstrings as None in Docstring class

  • PR #9775: TST: Skip failing tests on Win ARM64

  • PR #9778: BLD: ensure the libm C math library gets linked for all targets

  • PR #9781: Bump pypa/cibuildwheel from 3.4.0 to 3.4.1

  • PR #9782: CI: Remove joblib from freethreaded run

  • PR #9783: CI: Use site packages for free threaded tests

  • PR #9784: DOC: Fix Python interpreter example backslash newlines that rendered improperly

  • PR #9786: MAINT: Refactor monkey patch for patsy

  • PR #9787: ENH Added Seasonal-Diagnostic Plot to graphics.tsaplots

  • PR #9788: DOC: Add seasonal diagnostic plot to docs

  • PR #9789: TST: Relax tolerance and problematic test

  • PR #9792: ENH: Add ARIMA tutorial notebook example

  • PR #9798: ENH: make tsa/statespace Cython usage compatible with SciPy ILP64 builds

  • PR #9800: BUG: fix use_boxcox control flow in ExponentialSmoothing.fit (fixes #9797)

  • PR #9802: ENH: Add partial cross-correlation function (pccf)

  • PR #9804: ENH: Add Polars DataFrame support (Issue #9744)

  • PR #9805: BUG: honor MixedLM summary title

  • PR #9809: Rename README_l1.txt to L1_ADDITION.txt

  • PR #9811: ENH: Allow seasonal-differencing-only models with non-seasonal estimators (Issue #6159)

  • PR #9812: {BUG} Fix Issue #9793: Override resid property in UECMResults

  • PR #9813: DOC: correct PredictionResults.conf_int docstring

  • PR #9814: fix: avoid division by zero in estimate_location

  • PR #9815: ENH: graphics: Add add_ellipse and support passing x, y arrays to add…

  • PR #9816: ENH: tsa/vector_ar: Allow passing pre-calculated error bands to IRF plots

  • PR #9819: Enh/hannan rissanen order validation

  • PR #9820: ENH: Vendor Appender and Substitution docstring helpers from pandas

  • PR #9822: Update test notes with virtual environment activation steps

  • PR #9823: BUG: L-BFGS-B optimizer ignores disp=False, prints output unconditionally

  • PR #9824: BUG: Fix scale attribute and resid_pearson for fixed scale cov_type (#8190)

  • PR #9825: MAINT: Remove iprint for SciPy 1.18+

  • PR #9826: BUG/CLN: remove dead assignment to cov_p in GLM fit

  • PR #9829: BUG: pass ax parameter through to dot_plot in CombineResults.plot_forest

  • PR #9830: Fix GLMInfluence.hat_matrix_diag method name

  • PR #9831: ENH: Vendor cache_readonly and deprecate_kwarg from pandas private API

  • PR #9832: MAINT: drop removed scipy interp2d from TableDist (closes #8909)

  • PR #9833: MAINT: Future fixes

  • PR #9834: MAINT: Reduce future warnings

  • PR #9835: BUG: Fix VIF numerical instability by standardizing design matrix

  • PR #9836: DOC: Improve docstrings

  • PR #9837: MAINt: Update CIBW to 4.1.0

  • PR #9838: DOC: fix incorrect parameter names in deconvolve, powerdiscrepancy and VECMResults.predict docstrings

  • PR #9839: DOC: fix freeman_tukey formula rendering in powerdiscrepancy docstring

  • PR #9840: Improve text formatting for macOS

  • PR #9842: TST: ATtempt to avoid rare failures in thread-safe

  • PR #9843: CI : Pin github actions to full commit sha

  • PR #9844: BUG: skip summary diagnostics when slim=True

  • PR #9845: ENH: add fixed_params support to innovations_mle (Issue#6159)

  • PR #9848: DOC: fix typo

  • PR #9849: TST: Mark test as unsafe

  • PR #9850: DOC: fix typos

  • PR #9852: FIX: anova_lm silently returns NaN p-values when models are passed in reverse order

  • PR #9853: BUG: set k_exog_user on SVARResults so summary() works (GH#8025)

  • PR #9854: Improve test_family documentation

  • PR #9855: MAINT: run isort on codebase

  • PR #9857: TST: Relax tol on test that frequenctly fails

  • PR #9858: CI: Reduce the number of runs to improve performance in CI

  • PR #9859: Bump actions/checkout from 6 to 7

  • PR #9861: DOC: Change to pydata theme

  • PR #9862: BUG: fix Binomial.deriv() to return 1 - 2*mu/n (missing division by n)

  • PR #9863: DOC: Shorten word in title

  • PR #9864: DOC: Fix URL and notebooks

  • PR #9865: DOC: Fix origin in conf

  • PR #9866: BUG: record robust scale in RLM fit_history

  • PR #9867: MAINT: fix import sorting in test_weights

  • PR #9870: MAINT: link validation logic in Family._setlink

  • PR #9873: Fix typos in test_chisquare_prob docstring

  • PR #9874: [ENH] Add Jonckheere-Terpstra ordered trend test

  • PR #9876: DOC: improve math formulas in robust.norms docstrings

  • PR #9877: BUG: fix NegativeBinomial check for optional alpha

  • PR #9878: MAINT: Reduce direct use of np.random.func

  • PR #9879: MAINT: Remove direct use of np.random

  • PR #9881: [codex] DOC: document GLS other_results

  • PR #9883: MAINT: adapt to upcoming change in pd.freq

  • PR #9884: BUG: return nan from Power.solve_power when it fails to converge

  • PR #9885: ENH: report the last root-finder value in the solve_power ConvergenceWarning

  • PR #9886: fix: correct parameter names in docstrings (prob_infl, bin_edges, pred_kwds, param_nums, mu1_low)

  • PR #9887: fix DiscreteResults crash with full_output=0

  • PR #9888: BUG: Fix ccovf shape mismatch for different length arrays

  • PR #9890: DOC: fix Negative Binomial cumulant function in GLM families table

  • PR #9892: DOC: Following NumPy-style doc for Gamma log-likelihood

  • PR #9893: DOC: fix Gamma distribution notation in GLM families table

  • PR #9894: MAINT: fix typos in docstrings and comments

  • PR #9895: ENH: raise informative error for impossible one-sided solve_power cases

  • PR #9896: DOC: Fix failure in docs due to warning

  • PR #9898: ENH/BUG: add min_diag option to cov_nearest for zero or negative diagonal

  • PR #9899: BUG: describe/Description handles 0-row (empty) input gracefully (#9891)

  • PR #9901: Fix up random generation

  • PR #9902: BUG: Attach mlefit attributes to the results instance so they appear in dir()

  • PR #9903: BUG: Use exog centroid as center in rainbow test use_distance (#9103)

  • PR #9904: TST: Improve tests for thread safety

  • PR #9905: Fix a small issue in statsmodels (#9869)

  • PR #9906: BUG: filter unsupported kwargs in MixedLM.fit to prevent AttributeError

  • PR #9907: BUG: use rank-adjusted df in wald_test_terms for rank-deficient models

  • PR #9908: BUG: Do not pass hess to L-BFGS-B and TNC in _fit_minimize

  • PR #9909: BUG: Fix sison-glaz confint failure for small or sparse counts

  • PR #9910: TST: Improve thread safety of tests

  • PR #9912: CLN: Fix CodeQL detected minor issues

  • PR #9913: CI: Drop support for Python 3.9 in CI

  • PR #9914: DOC: add missing PoissonResults and NegativeBinomialPResults to discretemod autosummary (closes #9022)

  • PR #9915: BUG: ARDLResults.apply/append loses exog lag order

  • PR #9916: BUG: divide adjusted ccovf by the overlapping count, not len(x) - k

  • PR #9919: BUG: read the entropy integration limits from the kernel

  • PR #9920: BUG: populate _retain_cols in out_of_sample without a prior in_sample call

  • PR #9923: TST: Fix threaded failing test

  • PR #9924: BUG: Correct test to not use the singleton

  • PR #9925: BUG: Fix import when MPL not installed

  • PR #9926: Bump r-lib/actions/setup-pandoc from 2.12.0 to 2.12.1

  • PR #9927: Bump actions/setup-python from 6.2.0 to 7.0.0

  • PR #9928: Bump pypa/cibuildwheel from a0a973acdc9e7b7f8b04ac5c80e6883a5a102615 to 294735312765b09d24a2fbec22660ce817587d55

  • PR #9929: DOC: Fix many docstring issues in discrete

  • PR #9930: DOC: Fix many docstring issues in genmod

  • PR #9931: DOC: Fix many docstring issues in stats

  • PR #9932: CLN: Fix import order using isort

  • PR #9933: fix(grouputils): unify group_sums orientation and fix group_demean

  • PR #9934: DOC: Improve tsa docstrings ex. statespace

  • PR #9935: DOC: Improve base, compat and dataset docstrings

  • PR #9936: MAINT: Remove deprecations

  • PR #9937: DOC: Improve graphics docstrings

  • PR #9938: DOC: Improve imputation, multivariate and non-parametric docstrings

  • PR #9939: DOC: Update notebooks for deprecations

  • PR #9940: DOC Improve docstrings othermode, regression and robust

  • PR #9941: DOC: fix typos in docstrings, comments, and messages

  • PR #9942: DOC: Fix small issues found in docbuild

  • PR #9943: DOC: Fix emplike and duration

  • PR #9944: DOC: Fix treatment and gam docstrings

  • PR #9945: DOC: Fix docstring issues in tools

  • PR #9946: DOC: Fix some issues in statespace docstrings

  • PR #9947: REF: Move from random_state to rng

  • PR #9948: TST: Add marker for joblib

  • PR #9949: CI: Improve doc build reqs

  • PR #9950: ENH: Consistently use rng to move towards SPEC-007

  • PR #9951: DOC: Start release note for 0.15.0

  • PR #9952: DOC: SMall fixes for docs

  • PR #9953: MAINT: Bump to the actual minimum of 3.10

  • PR #9954: DOC: Final pass at doc fixes

  • PR #9955: DOC: Fix notebook and allow all to run

  • PR #9957: ENH: Add Hamilton filter (continued from 9872)

  • PR #9958: BUG: Fix removal of compat lstsq

  • PR #9959: CLN: Fix small lint issue in test

  • PR #9960: More doc fixes

  • PR #9961: DOC: Small doc fixes

  • PR #9962: DOC: Fix NegativeBinomialP.fit docstring

  • PR #9963: DOC: Fix title level in notebook and move ref

  • PR #9967: DOC: document that exog is matched by position for non-formula models

  • PR #9969: DOC: Remove sections from docstrings that do not render correctly

  • PR #9972: REF: Reduce mutability of models fit() methods

  • PR #9973: REF: Reduce genmod use of del

  • PR #9974: BUG: raise on non-2x2 tables in stats.mcnemar (#9485)

  • PR #9976: BUG: respect caller warning filters in discrete l1 fit_regularized (#9179)

  • PR #9977: REF: Remvoe anti-patterns in multivariate and robust

  • PR #9978: REF: Remove anti-patterns in tsa

  • PR #9980: REF: Remove anti-pattern use in stats and tools

  • PR #9981: MAINT: Move from isort to ruff

  • PR #9982: Bump actions/checkout from 7.0.0 to 7.0.1

  • PR #9983: Bump pypa/cibuildwheel from 4.1.0 to 4.1.1

  • PR #9984: REF: Extend the best practices to additional files

  • PR #9985: BUG: Reject None in string_like unless optional is True

  • PR #9987: BUG: Reject None in array_like unless optional is True

  • PR #9988: REF: Make use of pathlib

  • PR #9989: CLN: Clean examples

  • PR #9990: ENH: Improve nbgeneration

  • PR #9991: DOC: Add plot for hamilton_filter

  • PR #9992: BUG: Don’t validate the specification when extending SARIMAX results

  • PR #9993: BUG: Fix score_test to return HolderTuple instead of plain tuple #9785

  • PR #9994: BUG: Select the correct axis in drop_missing

  • PR #9995: MAINT: Improve formula engine specification

  • PR #9996: docs: use HTTPS for MixedLM reference

  • PR #9997: DOC clarify add_constant prepend default

  • PR #9998: DOC clarify GLMGam out-of-sample prediction

  • PR #9999: DOC fix ANOVA example link

  • PR #10000: DOC list all GEE covariance structures

  • PR #10001: ENH: Add block jackknife estimator (addresses #9752)

  • PR #10002: BUG: Ensure AutoReg summary can run after calling remove data

  • PR #10003: TST: Add tests for summary-remove-data pattern

  • PR #10005: BUG: Report the correct accepted types in dict_like

  • PR #10006: DOC: Correct the recipr0 summary line

  • PR #10007: TST: Add tests for summary-remove-data pattern in regression

  • PR #10008: TST: Add tests for summary-remove-data pattern

  • PR #10009: Statespace summary remove data

  • PR #10010: BUG: clip wilson proportion_confint bounds to [0, 1]

  • PR #10011: DOC: fix discrete results parameters

  • PR #10012: BUG: sign_test raises an opaque error when all observations tie with mu0

  • PR #10013: BUG: multipletests raises ZeroDivisionError on an empty p-value array

  • PR #10014: BUG: maxabs and iqr raise on an empty input, unlike the other eval_measures

  • PR #10015: MAINT: Remove Deprecations and outdated code

  • PR #10016: ENH: Allow list of lags additional to maxlag

  • PR #10017: BUG: use the non-missing sample size for acf confint/qstat when NaNs are handled

  • PR #10018: MAINT: Remove debug code

  • PR #10019: MAINT: Archive unused statsmodels.sandbox files

  • PR #10020: BUG: Avoid divide by 0 in acf/acovf with explicit error

  • PR #10021: TST: Add test run for x13

  • PR #10022: MAINT: COrrect test on older SciPy

  • PR #10023: CLN: Remove unproductive __name__ == “__main__” code

  • PR #10025: ENH: Reduce variable output returns

  • PR #10026: MAINT: Address deprecations

  • PR #10027: More named tuple

  • PR #10028: DOC: Remove five documented parameters that are not in the signature

  • PR #10029: REF: Move variable return to NamedTuple

  • PR #10030: ENH: Add NamedTuples to remaining fixed-arity tsa.stattools functions

  • PR #10031: DOC: Add numpydoc parameters sections to NamedTuple result classes

  • PR #10032: MAINT: Small jobs prior to release

  • PR #10033: DOC: Improve docstrings and css

  • PR #10034: DOC: Update release note

  • PR #10035: ENH: More use of NamedTuple

  • PR #10036: DOC: Fix rst errors and update notebooks

  • PR #10037: DOC: General fixes

  • PR #10038: DOC: Fix minor typo (“Destribution” -> “Distribution”)

  • PR #10039: TST: rename misleading WLS equivalence tests

  • PR #10040: DOC: General fixes

  • PR #10041: DOC: fix two defaults that the code does not have

  • PR #10042: Use self._ntop instead of literal 5 for categorical frequencies in Description

  • PR #10043: Fix smal bugs

  • PR #10044: Fix more small bugs

  • PR #10045: DOC: Add AI policy

  • PR #10046: DOC: fix typo in GLS example

  • PR #10047: DOC: clarify GLSAR rho argument

  • PR #10048: CI: Switch build that tests x13 to have coverage

  • PR #10049: ENH/TST: Deprecate parameter and test edge cases

  • PR #10050: MAINT: Improve issue and PR templates

  • PR #10051: CI: Change x13 binary installation

  • PR #10052: CI: Improve documentation generation

  • PR #10053: DOC: Add newly introduced functions to docs

  • PR #10054: CLN: Move to read_csv from genfromtxt

  • PR #10055: [ENH] Add Pesaran-Timmermann directional accuracy test

  • PR #10056: Fixups

  • PR #10057: DOC: add AR(p) notation to GLSAR.whiten

  • PR #10058: MAINT: Protect against pandas 4 changes

  • PR #10060: MAINT: Update PR template

  • PR #10061: DOC: Updates for recent robust norm docstrings

  • PR #10062: CLN: Remove whitespace

  • PR #10063: DOC: Standardized docstring changes

  • PR #10064: CI: Add lint-only GitHub workflow (ruff + flake8, Linux, Python 3.14)

  • PR #10065: More pandas 4 fixes

  • PR #10066: ENH: implementation of DM test

  • PR #10067: CLN: Fix small issues in jonckheere-terpstra

  • PR #10068: CLN: Fix lint issues

  • PR #10069: ENH: add p-value adjustments based on local false discovery rate

  • PR #10070: Bump actions/github-script from d746ffe35508b1917358783b479e04febd2b8f71 to 3a2844b7e9c422d3c10d287c895573f7108da1b3

  • PR #10071: Bump pypa/cibuildwheel from 4.1.1 to 4.2.0

  • PR #10072: MAINT/CLN: Remove Holder/HolderTuple in favor of documented classes

  • PR #10074: DOC: Remove warning from docs

  • PR #10075: BUG: Fix Jonckheere-Terpstra on Pyodide by casting np.repeat arg to intp size

  • PR #10077: MAINT: remove reduntant method validation in yule_walker

  • PR #10078: DOC: Add AGENTS.md and update CONTRIBUTING

  • PR #10079: Move README

  • PR #10080: DOC: Remove coveralls

  • PR #10081: BUG: Finish move from README.rst to README.md

  • PR #10082: CLN: Fix lint issues

  • PR #9956: docs(stats): clarify TukeyHSD reject and pvalues access

  • PR #10076: DOC: Improve documentation for yule_walker

  • PR #10083: TST: Test remaining edge cases in jonckheere_terpstra

  • PR #10084: BUG: Correct edge cases in n log n medcouple path

  • PR #10085: DOC: Update release note

  • PR #10087: ENH: Also check binaries with .exe

  • PR #10088: BUG: Check for positivity of eigval in condition number

  • PR #10089: BUG: fix MNLogit resid_response raising ValueError (closes #7096)

  • PR #10090: ENH: Make ndim more orthogonal to maxdim

  • PR #10091: Add LocalProjections estimator for impulse response functions (Jordà…)

  • PR #10092: ENH: Modify the approach to use dataclasses to limit unpack

  • PR #10093: REF: Move away from limited iter NamedTuple

  • PR #10094: MAINT: Restore accidental behavior change

  • PR #10095: TST: Add tests for limited iteration superclass

  • PR #10096: CLN: Standardize names in new objects

  • PR #10097: DOC: Reduce reference noise in sphinx

  • PR #10098: CLN/DOC: Simplify NamedTuple and dataclasses

  • PR #10099: DOC: Fix typo in WLS example notebook row labels

  • PR #10100: REF: Remove unused scipy import and cell from wls.ipynb

  • PR #10101: ENH: Implement L1 solver for GLM Extended #9430

  • PR #10102: PERF: Improve import performan in some cases

  • PR #10103: ENH: add crv3 cluster robust inference via the cluster jackknife for OLS/WLS

  • PR #10104: Docstring types regression

  • PR #10105: BUG: Forward missing kwarg from MixedLM.from_formula to superclass

  • PR #10106: BUG: Pivot the QR factorization in tools.matrix_rank

  • PR #10107: DOC: Standardized docstrings in tools

  • PR #10108: DOC: Standardized docstrings in robust

  • PR #10110: DOC: Standardized docstrings in stats

  • PR #10111: DOC: Standardized docstrings in othermod, treatment and multivariate

  • PR #10112: DOC: Standardized docstrings in base, datasets and compat

  • PR #10113: BUG: Fix numerous small bugs

  • PR #10114: DOC: Fix small remaining issues in regression

  • PR #10115: DOC: Fix small remaining issues around use of np and pd

  • PR #10116: DOC: Documentation cleaning pass for formula, graphics and imputation

  • PR #10117: DOC: Documentation cleaning pass core routines in tsa

  • PR #10118: DOC: Fix UECM

  • PR #10119: DOC: Clean docstrings in discrete, duration gam and genmod

  • PR #10120: BUG: Add missing self to update

  • PR #10121: DOC: Docstring clean in dist, emplike, iolib and mismodel

  • PR #10122: DOC: Replace broken OECD glossary links in endog_exog docs

  • PR #10123: DOC: Docstring clean in nonparametric

  • PR #10124: DOC: Docstring clean in vector_ar

  • PR #10125: DOC: Update agents to improve docstrings

  • PR #10127: DOC: Clean docstrings in statespace

  • PR #10128: DOC: Improve dataset docstrings

  • PR #10129: BUG: Rename variable to SUNACTIVITY

  • PR #10130: BUG: Correct distargs usage in scale_trimmed

  • PR #10131: BUG: Fix bug in line-style application

  • PR #10132: BUG: Enable percentile in _select_sigma

  • PR #10133: BUG: Fix factor reverse intent

  • PR #10134: BUG: Only initialize trend when required

  • PR #10135: BUG: Correct hess choice in betareg

  • PR #10136: BUG: Ensure gap size is correct in mosaic_plot

  • PR #10137: BUG: Ensure not implemented options raise

  • PR #10138: TST: Re-enable test

  • PR #10139: BUG: Fix bugs found in full scan

  • PR #10140: ENH: Warn users if exog is singular in *LS

  • PR #10141: BUG: Fix small bugs

  • PR #10142: TST: Change warning class on fit_collinear

  • PR #10143: BUG: Correct size of cancorr returns

  • PR #10144: TST: Change warning on WASM

  • PR #10145: DOC: Standard docstrings for rng

  • PR #10146: TST: Silence singular warnings

  • PR #10147: TST: Add tests for rng selector

  • PR #10150: TST: Cover results-class surface gaps

  • PR #10151: TST: Cover dead computational methods on live estimators

  • PR #10152: BUG: Fix OLSInfluence._ols_xnoti crashing on every call

  • PR #10153: TST: Cover margins and diagnostics gaps

  • PR #10154: BUG: Fix RLMDetSMM.fit crashing with its documented h=None default

  • PR #10155: TST: Verify NewsResults summary content, not just non-emptiness (Phase…)

  • PR #10156: MAINT: Deprecate estimator classes with no callers and no test coverage

  • PR #10158: CI: Disable failing conda run

  • PR #10160: CI: Re-enable conda with different cython

  • PR #10161: ENH: Enforce string like validation

  • PR #10162: CI: Revery cython for legacy conda test

  • PR #10163: BUG: Fix MICEData using observed-row index for predict_miss_kwds

  • PR #10164: BUG: Fix TreatmentEffectResults mislabeling every method as IPW

  • PR #10165: BUG: Guard against None zero_kwds in effectsize_2proportions

  • PR #10166: TST: Add marker for matplotlib tests

  • PR #10167: ENH: Add validation to from_string methods

  • PR #10168: CLN: Move non-core code our of package

  • PR #10169: DOC: Improve docstring for pacf

  • PR #10170: ENH: Simplify aliases

  • PR #10171: REF: Delegate ETS breakvar test to the shared implementation

  • PR #10172: BUG: fix SARIMAX time-varying regression with differencing in the state vector

  • PR #10173: ENH: Improve string checking

  • PR #10174: BUG: Add array_like for offset

  • PR #10175: BUG: Remove cache_readonly the presented parameter

  • PR #10176: BUG: Ensure array_like covnull is coerced

  • PR #10177: BUG: Correct bug in knot centereing

  • PR #10178: BUG: Ensure linepred is always available

  • PR #7327: BUG: Fix libsturng issue #6541

  • PR #9297: Update model.py –corrected wald test error for RegimeSwitchingmodels

  • PR #9695: Fix: cov_type in MixedLM.fit

  • PR #9794: fix: use normalized_cov_params as fallback when hessian inversion fails in GLM.fit

  • PR #9979: BUG: back-transform the univariate smoothed measurement disturbance

  • PR #10179: ENH/BUG: Use scipy.special.log_wright_bessel for the Tweedie log-likelihood

  • PR #10180: ENH: Add explicit target for removal of string aliases

  • PR #10181: CI: Reduce Linux jobs to speed up completion

  • PR #10182: ENH: Allow string type for groups in NominalGEE

  • PR #10183: DOC: Update the release notes

  • PR #10184: MAINT: Fix the sign when using Newton’s method

  • PR #10185: BUG: Fix MNLogit score_test crash with exog_extra (GH#9273)

  • PR #10186: MAINT: Add scipy version check

  • PR #10187: BUG: pass transformed through to MarkovSwitching.hessian

  • PR #10188: TST: Avoid test where log_wright_bessel is not available

  • PR #10189: MAINT: Add coverage analysis tooling for the estimation API

  • PR #10190: BUG: Fix bad merge

  • PR #10191: BUG: support model-aware RLM scale callbacks

  • PR #10192: MAINT: Standardize on ruff

  • PR #10193: MAINT: Increase rule use from ruff

  • PR #10194: TST: Cover public API coverage gaps (batch: tools/stats/base/iolib)

  • PR #10195: BUG: Fix _BayesMixedGLM.fit silently returning None

  • PR #10196: BUG: Fix GLS.hessian_factor for 1d (heteroskedastic) sigma

  • PR #10197: BUG: Fix emplikeAFT.predict using endog instead of exog

  • PR #10198: BUG: Fix rvs_kernel ignoring rng for the Beta-kernel draws

  • PR #10199: TST: Add coverage for VARProcess/VARResults acorr methods

  • PR #10200: BUG: Fix Representation.initialize_components missing k_states arg

  • PR #10201: BUG: Fix miso_lfilter column selection for nvars != 2, 3

  • PR #10202: TST: Add skip on WASM for linalg error

  • PR #10203: BUG: Return NotImplementedError rather than wrong result in GLS.hessian_factor

  • PR #10204: ENH: Add fit_regularized to HurdleCountModel

  • PR #10205: BUG: Split start_params across HurdleCountModel.fit’s two components

  • PR #10206: MAINT: Address future changes in pandas

  • PR #10207: BUG: Validate exog before reconstructing the model in ARDLResults.apply

  • PR #10208: DOC: Update release notes

  • PR #10209: DOC: clarify VARResults.df_model counts parameters per equation

  • PR #10210: ENH: make MICEData iterable, yielding successive imputed datasets

  • PR #8712: STY: change nobs2 to nobs0 for consistency/style