Version 7.1

Released on 2026-10-16.

Version 7.1 is a significant release in the 7.x branch. It contains a number of new features, improvements, and bug fixes.

Highlights

  • New estimators and tests: IVJIVE, first-stage rank tests, a centered J test, the Hausman and Pesaran CD tests for panel models, and panel models that only have effects.

  • Many technical corrections change the numbers that that were produced in 7.0. The most important of these include changes to the default bandwidth of the kernel estimators of IVGMM, IVGMMCUE and IVSystemGMM, the Fama-MacBeth p-values and the weighted panel and system models. See Changes that alter results.

  • Increased reliability of weighted estimators including testing post-estimation statistics for correctness with weights.

  • Inputs with labels must have the same index as dependent (or as the first input with labels) in every estimator, and input of the wrong type now raises a clear TypeError or ValueError. See Backward-incompatible changes.

  • Python 3.15 is supported. 7.1 is the final release to support Python 3.10 and NumPy 1.x.

New features

  • Added IVJIVE, the jackknife IV estimator (JIVE1), with unadjusted, robust, kernel and one-way clustered covariances. The bandwidth of its kernel covariance is selected from the data, as in IV2SLS and IVLIML. Two-way clusters raise a ValueError. It can be imported from linearmodels (GH750, GH763, GH765).

  • Added the Cragg-Donald and Kleibergen-Paap tests of the rank of the first-stage coefficients, as properties of FirstStageResults and as functions that can be imported from linearmodels.iv (GH741, GH622, GH765).

  • Added centered_j_stat, a J test of the overidentifying restrictions that uses a centered moment covariance (GH749, GH763).

  • Added extra_df to the covariance estimators of linearmodels.iv.covariance and to the cov_config of IV2SLS.fit and IVLIML.fit. It is the number of degrees of freedom that the model uses in addition to its k regressors. With debiased=True the covariance is scaled by n / (n - k - extra_df), and a ValueError is raised if none are left (GH778, GH833).

  • Added hausman(), the Hausman test of random effects against fixed effects. It matches Stata and plm::phtest, returns HausmanTestResults, a named tuple of the statistic and the table of estimates, and raises a ValueError if the models differ in observations, dependent variable or weights (GH740, GH761).

  • Added pesaran_cd, the Pesaran CD test of cross-sectional dependence, a new NormalTestStatistic. It uses the idiosyncratic shocks, which for FirstDifferenceOLS are the residuals of the differenced equation (GH739, GH771).

  • pesaran_cd is an InapplicableTestStatistic for BetweenOLS, FamaMacBeth, models with time effects or other effects that change over time, and FirstDifferenceOLS with two periods. Time dummies among the regressors invalidate it and are not detected (GH761, GH771).

  • PanelOLS estimates models that only have effects, y = a_i + g_t + e, with an exog that has no columns or the formula "y ~ EntityEffects". These raised pandas’ “No objects to concatenate” (GH809).

  • A PeriodIndex of time labels is accepted by the panel models and converted to timestamps (GH810).

  • Lists, tuples and other array_like objects are accepted for every array_like parameter of the IV, absorbing, system, asset pricing and panel models, including clusters, weights and other_effects. 7.0 raised AttributeError: 'list' object has no attribute 'ndim' for many of them. dummy_matrix accepts lists and tuples of category codes (GH776).

  • 1-d arrays are accepted as the clusters and other_effects of the panel models, and as weights with a value for each row of an unbalanced panel. A one-column DataFrame of panel weights is accepted: with the default index it is read like an array, otherwise by its labels. BetweenOLS and FirstDifferenceOLS accept text and categorical clusters (GH776, GH825, GH833).

  • The names of options are not case sensitive: cov_type, weight_type and kernel in every model, the method of AbsorbingLS.fit, the group of PanelData and the drop of dummy_matrix. cov_type="Robust" and kernel="Bartlett" give the results of the lower case names. 7.0 used LSMR for method="HDFE" (GH783, GH833, GH836).

  • linearmodels.iv.common and linearmodels.iv.results define __all__, so that import * no longer imports the modules and functions that they import (GH765).

Changes that alter results

  • durbin() and wu_hausman() of IV2SLS and IVLIML project the residuals on all of the instruments, as documented (GH725).

  • The specification tests of weighted IV models (sargan, basmann, durbin, wu_hausman, wooldridge_* and c_stat) use the weights, which 7.0 ignored (GH737).

  • c_stat() of overidentified IVGMM and IVGMMCUE models uses the correct moment conditions and the weight_type of the model. 7.0 ignored the weight type (GH744).

  • IVGMMCUE centers the moment conditions by default, as documented. With the new default bandwidth (below) the J statistic of the mroz example with kernel weights goes from 0.775 to 0.379 and the coefficient on educ from 0.0419 to 0.0637. Pass center=False and optimal_bw=False to get the 7.0 results (GH746).

  • The default bandwidth of the kernel estimators of IVGMM and IVGMMCUE is selected from the data. 7.0 used nobs - 2, and the 95% intervals covered 64% to 70% with a kernel covariance and 51% to 56% with kernel weights and covariance in a simulation (92% to 95% now). In the mroz example the bandwidth goes from 426 to 3 and the J statistic of IVGMM from 0.797 to 0.377 (GH794).

  • A model that uses the default bandwidth issues a DefaultBandwidthWarning. Pass optimal_bw=False (or bandwidth=nobs - 2) to get the 7.0 numbers, or optimal_bw=True to silence the warning. IVGMMCUE estimates the bandwidth once, from the first step residuals, so its results with optimal_bw=True change slightly (GH794).

  • The default bandwidth of the kernel weight matrix of IVSystemGMM is selected from the data, with the same warning and the same optimal_bw=False to restore nobs - 2. In a simulation with AR(1) errors the 5% J test never rejected valid instruments in 7.0, and rejects 2% to 5% of the time now (GH794).

  • IVGMM raises a ValueError when the covariance of the moment conditions is singular, which happens with too few clusters. 7.0 returned meaningless estimates. IVGMMCUE raises it instead of LinAlgError, and also for as many clusters as moment conditions with center=False. c_stat is an InvalidTestStatistic if its model has too few clusters (GH754, GH785).

  • IVGMMResults.weight_config is the dict of the weight configuration. 7.0 returned the name of the weight type, which is weight_type (GH747).

  • IVGMMCUE results report IV-GMM-CUE as the estimator (method, the summary and compare) instead of IV-GMM (GH753).

  • The weights of the IV models are scaled to a mean of 1 after the observations with missing values are dropped. resid_ss, s2, total_ss and wresids were off by the ratio of the means of the weights (1.0023 in a simulation). Only models with both weights and missing values change (GH776).

  • The Anderson-Rubin and Basmann F tests are an InvalidTestStatistic, and IVLIML raises, when kappa cannot be estimated from so few observations. 7.0 returned its rounding error (GH824).

  • Every R-squared is NaN, with no error or warning, if the total sum of squares of the dependent variable is zero, for example if it is constant. 7.0 raised a ZeroDivisionError, or returned -inf or rounding noise (GH814).

  • p-values use the survival function, so p-values below about 1e-16 are no longer 0. Tiny p-values print in scientific notation in first-stage summaries and compare() (GH742).

  • AbsorbingLS(debiased=True) counts the absorbed terms in the small-sample adjustment, as PanelOLS does. The standard errors are larger, by 7.7% for the Grunfeld data with firm and year effects. debiased=False is unchanged (GH778).

  • The regressors that the effects absorb in AbsorbingLS and PanelOLS are found with a relative tolerance of 1e-5. 7.0 kept some of them, with huge standard errors, and depended on the units. With a constant, drop_absorbed=True keeps the constant, and absorbed_effects is fitted_values - exog @ params (GH779, GH786).

  • AbsorbingLS(drop_absorbed=True) finds the constant among the regressors that it keeps. If a regressor before the constant was dropped, 7.0 took the wrong column as the constant, which gave a wrong absorbed_rsquared and F statistic (0.1662 and 61.13 instead of 0.5170 and 324.63 in an example), or a TypeError if the constant was last (GH779).

  • PanelOLS(drop_absorbed=True) with entity effects and a constant now drops the regressors if none of them varies within entities. 7.0 kept them (GH730).

  • Repeated calls to AbsorbingLS.fit no longer change df_model, df_resid and the adjusted R-squared of later fits, and use the method and absorb_options of each call (GH735, GH752).

  • FirstDifferenceOLS differences in time order and only adjacent periods. 7.0 differenced against non-adjacent periods if the first entity enters late or has a gap (GH726, GH813).

  • Weighted RandomEffects scales the entity means by the root weights, which changes its estimates, R-squared and F statistic (GH738).

  • The variance components of RandomEffects use the ranks of the within and between regressions as degrees of freedom, as plm and Stata do. Models with regressors that are constant within entities change slightly (theta 0.6429 instead of 0.6451 in the wage panel), and so does small_sample=True (GH798).

  • The classical F statistic of weighted panel models (and of RandomEffects on unbalanced panels) was wrong by a factor of about 4 in the wage panel with hours as weights. The fit measures of weighted FamaMacBeth no longer depend on the scale of the weights (R-squared -2183 instead of 0.0033) (GH797).

  • The log-likelihood of weighted panel models includes the term 0.5 sum(ln w), as statsmodels’ WLS does. It goes from -3065.75 to -3153.16 for PooledOLS in the wage panel with hours as weights (GH815). PanelOLS scales the weights after it drops singletons, which changes s2 only (GH833).

  • Panel weights given by period, by entity or as a table are placed by label. 7.0 used the wrong rows unless the data was sorted by entity and then by period. Clusters and other effects given as a table of time periods by entities are placed in the same way, and work on unbalanced panels (GH748, GH822).

  • The panel models can combine clusters without the labels of dependent with cluster_entity=True or cluster_time=True. 7.0 gave wrong standard errors without an error (GH776).

  • cov_type="ac" of the panel models sums the products of the scores over entities, as plm and statsmodels do, so unbalanced panels change (7% in an example). Entities that are shorter than the bandwidth keep the weights of the kernel (0.4% to 11% in a panel of short entities) (GH800, GH813).

  • PanelOLS with two cluster variables no longer depends on their order. The degrees of freedom are corrected if the effect is nested in the last variable but not the first (7% in an example) (GH795).

  • FamaMacBeth p-values and confidence intervals use a t distribution with T - 1 degrees of freedom, and df_resid is T - 1, where 7.0 used nobs - nvar for both (the p-value of union in the wage panel goes from 7e-20 to 4e-5). debiased=False is unchanged (GH772).

  • The f_statistic_robust of FamaMacBeth is Hotelling’s test, which rejected a true null 20% to 41% of the time in 7.0. It is an InvalidTestStatistic if the number of periods is not larger than the number of tested parameters, where 7.0 inverted a singular covariance (GH772, GH796).

  • Models fit with check_rank=False use the number of columns as the rank, and constants that are not columns (dummies that sum to one) are detected exactly. R-squared values were wrong (0.2942 instead of 0.1877 in one example). A column that varies by less than 1.5e-8 of its size is read as a constant (GH799, GH812).

  • Weighted SUR and IV3SLS with GLS use the weighted residuals in the robust, kernel and clustered covariances, which were wrong, mostly too small (by 5% to 10% in an example) (GH787).

  • Weighted SUR, IV3SLS and IVSystemGMM report resids that are always y - x b, and compute the R-squared, adjusted R-squared and system R-squared measures, breusch_pagan and likelihood_ratio from the weighted residuals, which 7.0 mixed with unweighted ones (GH784).

  • Weighted IV3SLS uses a weighted first stage, which changes its estimates. IVSystemGMM is unchanged (GH734). The default unadjusted covariance of SUR and IV3SLS with iterate=True uses the final residual covariance (GH736).

  • IV3SLS uses GLS (3SLS) when the equations have the same regressors but different instruments, where 7.0 used equation by equation 2SLS (GH793).

  • nobs of the results of SUR, IV3SLS and IVSystemGMM is the number of observations of each equation, not of all equations (360 for 3 equations with 120 observations). df_resid is unchanged (GH803).

  • The J statistic of LinearFactorModel uses the rank of the pricing errors, and rejected a correct model too often (12.5% at the 5% level in a simulation, 10% now) (GH805).

  • The standard errors of the alphas of LinearFactorModelGMM account for the estimation of the parameters and were up to 3 times too large. The risk premia block of cov of TradedFactorModel with debiased=True divides by nobs - 1 (GH805).

  • The t-statistic and p-value of an asset pricing parameter with a standard error of 0, such as the alphas of a just identified model, are NaN. 7.0 reported an infinite t-statistic and a p-value of 0 (GH805).

  • LinearFactorModelGMM reports the J statistic of the minimized CUE objective (0.5% to 8% smaller), and its std_errors table is laid out correctly: in 7.0 most cells held the standard error of another parameter (GH781, GH788).

Backward-incompatible changes

  • Inputs with labels, such as a pandas Series or DataFrame with an index, must have the same index as dependent in every IV, absorbing, system, asset pricing and panel model. If dependent has no labels, the first input with labels is the reference. 7.0 paired inputs with different labels by position without an error (GH748, GH756, GH776).

  • Inputs whose labels do not match raise a ValueError: reindex the input, or use .to_numpy() to pair by position. NumPy arrays and pandas objects with the default index 0, 1, ..., n-1 have no labels and are still paired by position. The same dates stored at different resolutions are the same labels (GH820).

  • A system of equations whose equations have different numbers of observations raises a ValueError when the model is created (GH756).

  • Input that cannot be used raises a TypeError or ValueError that names the input: complex values (7.0 dropped the imaginary part with a ComplexWarning), text that is not a number, objects that are not array_like, and a panel dependent or exog that is not a pandas, xarray or NumPy panel object, such as a list (GH776).

  • clusters with 3 or more columns raise a ValueError in IV2SLS, IVLIML and AbsorbingLS, which ignored the others, and IVGMM and IVGMMCUE accept a single column. Weights given as the name of a column to from_formula raise a TypeError. Text columns of absorb and interactions of AbsorbingLS raise a TypeError (GH259, GH776).

  • The weights of the from_formula of the system models must be dictionary-like, such as a dict or a DataFrame, with the equation labels as keys. 7.0 ignored other containers with a warning (GH776).

  • Weights that are zero, negative or infinite raise a ValueError in every model (the system models name the equation). 7.0 accepted zero weights in AbsorbingLS and the system models, and failed with unclear errors for negative weights there and for infinite weights in every model. A missing weight still drops the observation (GH776, GH792, GH799, GH811).

  • Options are checked at the start of fit, and kernels when the model is created. A keyword argument that cov_type does not accept raises one ValueError in every model with **cov_config (7.0 raised TypeError in IV, absorbing and system models; asset pricing ignored it). An unknown group of PanelData and a panel predict without exog or data raise too (GH822, GH833).

  • dummy_matrix raises a ValueError for a drop other than "first" or "last". It treated any other value as "last" (GH835, GH836).

  • Panel models raise a ValueError for duplicated (entity, time) rows, which 7.0 treated as separate observations, and a ValueError if the bandwidth of a Driscoll-Kraay or Fama-MacBeth kernel covariance is not below the number of periods. The quadratic spectral kernel returned standard errors that were too small instead (GH810, GH813).

  • Kernel estimators that select the bandwidth from the data need at least 4 observations (Bartlett), 5 (Parzen) or 6 (quadratic spectral), and raise a ValueError with fewer. 7.0 returned a bandwidth of T - 1 or an OverflowError. This includes IVGMM with its new default bandwidth (GH821).

  • IVLIML raises “Unable to estimate kappa” when there are too few observations for the cross product that LIML inverts. 7.0 returned the rounding error as kappa (for example 0.8125 instead of 1 with 3 observations) (GH824).

  • AbsorbingLS.fit raises a ValueError for a method other than "auto", "hdfe" and "lsmr", which used LSMR, for absorb_options that belong to the other algorithm, and for lsmr_options with method="hdfe" (7.0: TypeError or RuntimeError). The FutureWarning for lsmr_options now says to use absorb_options with method="lsmr" (GH752, GH783).

  • A debiased AbsorbingLS covariance raises a ValueError if the regressors and the absorbed terms leave no degrees of freedom (GH778).

  • Panel models raise a ValueError that says why when they cannot be estimated, where 7.0 raised ZeroDivisionError or LinAlgError: no residual degrees of freedom and a BetweenOLS with regressors that are collinear in the entity means (GH799).

  • IV, system and panel models raise a ValueError if the cluster ids are a single group or have missing values. 7.0 returned a wrong covariance or raised ZeroDivisionError, and panel models made the missing ids a cluster of their own. The ids of observations that are dropped for other missing values may be missing (GH789, GH845).

  • LinearFactorModelGMM raises a ValueError when the model is created if there are not more observations than moment conditions. A sigma of LinearFactorModel that is not symmetric and positive definite, and a saturated debiased asset pricing model, raise a ValueError (GH802, GH807).

  • The default eval_env of predict of the IV models is 2, the frame that calls it, where 7.0 used 4. A helper function that relied on the old default to reach the frame above it needs eval_env=3 (GH774).

  • With SciPy 2, the sparse helpers (Interaction.sparse, dummy_matrix and others) return sparse arrays, where * is elementwise. Use @ for matrix products (GH733).

Bug fixes

  • Fixed predict() for models without exogenous or without endogenous regressors (GH677).

  • A missing value in the entity or time index of a panel raises a clear ValueError in every panel model and in the group methods of PanelData. 7.0 raised a LinAlgError or returned NaN or wrong data (GH614, GH716, GH764).

  • Fixed AbsorbingLS with missing values, which raised a ValueError in every release since 4.13. The incomplete observations are now dropped with a MissingValueWarning. With clustered covariances, clusters must have one row for each remaining observation (GH766).

  • Fixed AbsorbingLS with an Interaction in which only cat or cont has labels, AbsorbingLS.fit adding drop_singletons to the absorb_options that were passed to it, and fit with the deprecated lsmr_options and the default method, which raised a TypeError when pyhdfe is used (GH752, GH756).

  • Fixed Interaction.nobs, which kept the number of observations before Interaction.drop, and the cache of AbsorbingLS, which gave a model the residuals of another model that was fit with different LSMR absorb_options (GH752, GH783).

  • quadratic_form_test raises a TypeError instead of an AssertionError if formula is used with params that is not a Series (GH690).

  • A cov_type, weight_type or kernel that is not supported raises an UnknownOptionError (both a ValueError and a KeyError) that suggests the closest name and lists the supported names, in every model. 7.0 raised a bare KeyError in many (GH808).

  • The predict method of the IV models with data evaluates the formula in the frame that calls it, and works at the top level of a script. Missing values in the dependent variable, the endogenous regressors or the instruments of an IV or system formula are dropped with a warning (GH774).

  • from_formula of the asset pricing models evaluates the formulas in the namespace of the caller, and drops the observations with missing values. multivariate_iv accepts endog and instruments without exog (GH777, GH801, GH804).

  • Fixed LinearFactorModelGMM ignoring opt_options after the first step, the OverflowError of summaries with an infinite t-statistic, such as that of a system whose equation fits exactly (an asset pricing t-statistic is NaN where the standard error is 0), and the RuntimeWarning of the asset pricing models for variances that are zero up to rounding (GH788, GH802, GH805).

  • The adjusted R-squared of an IV model with as many parameters as observations is NaN, and the pooled F of PanelOLS with a zero residual sum of squares and the F statistic with a singular covariance are an InvalidTestStatistic. These raised errors. Weights of any finite size are scaled without overflow (GH811, GH814).

  • PanelOLS(singletons=False) with clustered covariances, RandomEffects with arrays, FirstDifferenceOLS with array clusters and PanelOLS with entity and time effects for a single entity no longer fail with IndexError, KeyError or a misleading ValueError. A missing value in other_effects drops the observation (GH776, GH795, GH799, GH810).

  • The df_model of BetweenOLS results is an int, where 7.0 returned the tuple (k,) (GH799).

  • Fixed the time labels of a 3-d xarray.DataArray with datetime64[ns] coordinates, which were integers such as 946684800000000000, and the SettingWithCopyWarning of pandas 2 in the clusters of PanelOLS (GH809, GH822).

  • IVSystemGMM(weight_type="kernel").fit(iter_limit=1) no longer raises an AssertionError, generate_panel_data accepts a NumPy Generator and returns clusters with one row for each observation, and the helpers has_constant, get_float and get_bool accept several constant columns, NumPy integers and NumPy booleans (GH775, GH794, GH799).

  • The Fama-MacBeth error for a panel that cannot be estimated says what a cross-section needs, and its kernel covariance no longer issues a RuntimeWarning before the ValueError for an estimate that does not vary (GH772, GH826).

  • Fixed the LaTeX output of Summary, which did not escape special characters such as underscores in the extra text (GH791).

  • Fixed the dev extra, which listed pandas-stubsl, and added xarray to the test extra (GH757).

Documentation and maintenance

  • Corrected the Driscoll-Kraay index in the math documentation, fixed typos and improved the type annotations (GH704, GH697, GH721). Added a security policy (SECURITY.md) (GH757).

  • The docstrings follow the numpydoc rules, which are checked by a lint, and say which option names are accepted, that they are not case sensitive, and where extra_df is accepted. The panel fit examples run as they are, and the documentation builds without warnings (GH759, GH767, GH828, GH829, GH830, GH833, GH834).

  • New and extended pages of the user guide: aligning inputs, the mathematics of IVJIVE, the J and C statistics and the specification tests, the panel specification tests, small-sample adjustments, estimated effects and WARN_ON_MISSING, which turns off the MissingValueWarning (GH531, GH773, GH782).

  • The IV and panel example notebooks show the new features and the corrected statements (GH770, GH790).

  • The tests do not leak warnings with any supported combination of versions, and the minimum versions of statsmodels (0.14.6) and pyhdfe (0.2.0) were raised for this (GH751, GH826).

  • The tests compare floating-point results with a tolerance, since their last digits differ between platforms, and the CI also tests a wheel on Intel macOS (GH846).

  • The type annotations describe what the code accepts and returns: ArrayLike includes lists and tuples, and fitted_values, estimated_effects and idiosyncratic of the panel results are DataFrame. A GitHub workflow runs mypy, for information only (GH842, GH843).

Compatibility

  • Python 3.10 to 3.15, NumPy 1.23.5 and later including NumPy 2, and pandas 1.4.0 and later including pandas 3 are supported (GH757).

  • 7.1 was tested on Linux, macOS and Windows, from Python 3.10 with the minimum versions (NumPy 1.23.5, SciPy 1.8.0, pandas 1.4.0, statsmodels 0.14.6) to Python 3.15 with NumPy 2.5.4, SciPy 1.18.1, pandas 3.0.6 and statsmodels 0.15.0, and with the development versions of NumPy, SciPy, pandas and statsmodels.

  • Wheels are built for CPython 3.10 to 3.15 on manylinux (x86-64 and aarch64), musllinux (x86-64), Windows (AMD64) and macOS (x86-64 and arm64). There are no wheels for the free-threaded builds (3.14t and 3.15t) or Windows ARM64. Wheels are built against NumPy 2 and run with NumPy 1.23.5 or later.

  • Ready for SciPy 2 and pandas 4: the deprecation warnings that 7.0 gave with their development versions are gone (GH733).

  • The tests of the oldest supported versions now install them (GH751).

Deprecations and future changes

  • 7.1 is the last release to support Python 3.10 and NumPy 1.x. Later releases will raise the minimum versions of Python, NumPy and the other dependencies.

  • The lsmr_options argument of fit() and the linearmodels.__future__.ordering module will be removed in 8.0. Importing the module now emits a FutureWarning (GH752).

  • DROP_MISSING and the environment variable LINEARMODELS_DROP_MISSING have never had an effect, since observations with missing values are always dropped. Reading DROP_MISSING, or importing linearmodels with the variable set, emits a FutureWarning, and both will be removed in 8.0. Use WARN_ON_MISSING to turn off the MissingValueWarning (GH531, GH782).

  • DROP_MISSING is no longer in linearmodels.__all__, so import * does not bind it (GH782).

  • DefaultBandwidthWarning, which IVGMM, IVGMMCUE and IVSystemGMM issue when a kernel estimator uses the default bandwidth, which changed in 7.1, will be removed in 8.0. Passing bandwidth or optimal_bw silences it (GH794).

Minimum versions

  • Unchanged (Python 3.10, SciPy 1.8.0, pandas 1.4.0, formulaic 1.2.1) except NumPy, which moved from 1.22.3 to 1.23.5, statsmodels, which moved from 0.13.0 to 0.14.6, the first release that imports with pandas 3, and pyhdfe, which moved from 0.1 to 0.2.0 (0.1.0 and 0.1.1 fail on NumPy 1.24 to 1.26). The 7.0 notes listed NumPy 1.23.5 and formulaic 1.0.0, but 7.0 required 1.22.3 and 1.2.1 (GH776, GH826).

  • packaging is now a declared dependency. Building from source requires Cython 3.1.0, and running the tests requires pytest 9 and xarray (GH757).

  • The doc and dev extras require numpydoc 1.10, and the doc extra NumPy 1.23.5 and statsmodels 0.14.6. The doc extra no longer pins pandas~=2.3.3 or lists patsy and oldest-supported-numpy (GH757, GH826, GH838).

Contributors

Version 7.0

  • Increased minimums:

    • Python: 3.10

    • formulaic: 1.0.0

    • NumPy: 1.23.5

    • SciPy: 1.8.0

    • pandas: 1.4.0

    • statsmodels: 0.13.0

  • Corrected name of clustered covariance to "clustered" from "cluster".

  • Fixed an issue sparse matrix behavior changed in SciPy.

  • Switched to meson build system.

  • Improved compatibility with future NumPy (2.4+) and pandas (3+) changes.

  • Fixed a bug that affected estimation of SUR models with constraints of the form R beta = q where q was not 0.