pyfgls — Feasible GLS for Python
pyfgls implements the feasible generalized least squares (FGLS) estimators of
- [PG26] Perron, P. and González-Coya, E. (2026). Feasible GLS for time series regression. Journal of Econometrics 258, 106346 — serially correlated errors;
- [GP24] González-Coya, E. and Perron, P. (2024). Estimation in the presence of heteroskedasticity of unknown form: a Lasso-based approach. Journal of Econometric Methods 13(1), 29–48 — heteroskedasticity of unknown form;
and their combination for time series with both problems ([PG26] Supplement S-4).
The message of both papers is the same: GLS is not a fragile luxury. Done the way they
propose, it is consistent in situations where OLS is not, it is (essentially) never less
precise than OLS, it is often far more precise, and its confidence intervals have
accurate coverage and are shorter. pyfgls packages those procedures with
statsmodels-style results, pandas support and the papers' simulation designs.
import pyfgls as pf
res = pf.FGLS(y, X).fit() # time series: serial correlation + heteroskedasticity
print(res.summary())
Contents
- Install
- Which estimator should I use?
- Guidance for practitioners
- Quick examples
- Full functionality and usage
- What the estimators do
- Replication of the papers
- Implementation choices and open items
- Citing
Install
pip install pyfgls # once released on PyPI
pip install "pyfgls[formula,plot]" # + formula interface and diagnostic plots
pip install -e ".[dev]" # development install from a clone
Python ≥ 3.10. Core dependencies: NumPy, SciPy, pandas, scikit-learn, joblib. Optional:
formulaic (formula extra), matplotlib (plot extra), statsmodels (only used in the
test suite).
Which estimator should I use?
| Your data | Problem | Use | Paper |
|---|---|---|---|
| Time series, stationary | Serially correlated errors | SerialFGLS(y, X) |
[PG26] |
| Time series, stationary | Serial correlation and heteroskedastic innovations | FGLS(y, X) (F-CH) |
[PG26] Suppl. S-4 |
| Cross section (random sample) | Heteroskedasticity of unknown form | LassoFGLS(y, X) |
[GP24] |
Time series with lags of y as regressors |
Serial correlation | SerialFGLS(y, X, lagged_dep_vars=[...]) |
[PG26] §4.2 |
| Errors known to be MA(1), e.g. 2-step-ahead forecast errors | MA(1) with large negative θ | SerialFGLS(y, X, ma1=True) (GMA) |
[PG26] §5 |
| Many stochastic regressors in a time series | Lag selection | add ic_penalty="params" |
see Implementation choices below |
| You only want robust standard errors for OLS | — | pf.benchmarks.ols(y, X, cov_type="HAC") / "HC3" |
— |
FGLS is the general class: serial=None turns off the serial-correlation correction
and hetero=None the heteroskedasticity correction, so FGLS(y, X, hetero=None) is the
same estimator as SerialFGLS(y, X) and FGLS(y, X, serial=None) the same as
LassoFGLS(y, X).
Guidance for practitioners
Time-series regressions with serially correlated errors ([PG26], Section 6)
The concluding remarks of [PG26] translate into the following recommendations.
- Use FGLS as the default. In a linear time-series regression with stationary
errors, estimate by FGLS with the AR order chosen by BIC and build confidence
intervals with the exogeneity-robust variance of eq. (29) —
SerialFGLS(y, X).fit()does exactly this. If the regressors happen to be exogenous, the robust correction vanishes asymptotically, so nothing is lost; if they are not, it is what makes the intervals reliable. OLS, by contrast, is generally inconsistent when the regressors react to past shocks, and Cochrane–Orcutt inherits that inconsistency. - Check that the regressors are pre-determined. FGLS needs the regressors to be
uncorrelated with current and future innovations (not with past ones). Use the
variable-addition LM test of Remark 9,
pf.diagnostics.test_predetermined(y, X). If it rejects, add lags of the relevant regressors to the model and refit; if the problem comes from omitted variables that are not observed, an instrumental-variables procedure is needed instead (outside the scope of this package). - Large negative moving-average components need care. When the errors may contain an
MA term with a large negative coefficient (typical of multi-step forecast errors), a
finite autoregression approximates them poorly and BIC may stop too early, which shows
up as intervals that under-cover. If you know the MA structure, use a tailored
transformation such as the GMA estimator (
SerialFGLS(..., ma1=True)). - Lagged dependent variables. With lags of
yamong the regressors, OLS is inconsistent under serial correlation; declare them (lagged_dep_vars=["ylag"]) so the AR filter is recovered from the lagged regressors (Section 4.2). - Multi-step predictive regressions. Under rational expectations the h-step forecast errors are MA(h−1) and both OLS and FGLS are consistent; FGLS is more efficient as long as the implied MA process is invertible. If it may be non-invertible, FGLS is only consistent with exogenous regressors — be cautious.
- Know your maintained assumptions. The advantages of GLS over OLS with HAC standard
errors rest on stationarity, invertibility of the error process and pre-determined
regressors. When these are plausible — as they usually are — the gains in precision
and in the reliability of inference are substantial. Use
check_stationarity=Trueto screen for unit roots, and watch forNonStationaryWarning(an estimated AR filter with a root near the unit circle). - Heteroskedastic innovations ([PG26] Remark 12). Either keep FGLS for the serial
correlation and make the variance heteroskedasticity-robust (
cov_type="HC3"), or — recommended — add the Lasso-based weighting of [GP24]:FGLS(y, X)(F-CH). With homoskedastic innovations F-CH is equivalent to correcting for serial correlation only, so there is no cost.
How much does nonexogeneity_share matter? It reports how large the eq. (29) correction
is relative to the textbook GLS variance: near 0 the regressors behave as exogenous; large
values mean the naive interval would under-cover.
Cross sections with heteroskedasticity of unknown form ([GP24], Section 6)
- Lasso-FGLS is a safe replacement for OLS + robust standard errors. In all the designs of [GP24] it was never noticeably worse than OLS (at most a few percent of MSE when there is no heteroskedasticity, because the Lasso then selects nothing and the weights are constant), and it is markedly better when heteroskedasticity is present.
- You do not need to know the variance function. It is enough that the candidate
covariates
zinclude at least one variable correlated with what drives the variance, plus some non-linear transforms. The Lasso picks what fits the variance pattern in the sample; it need not pick the "true" form, and it does not need to. - Prefer many variables and few transforms. Adding many candidate variables works
well; adding many functional forms of the same variable creates near-collinearity and
helps little. Trigonometric terms (
cos w,cos 2w, i.e. Chebyshev-type terms) are a good flexible choice:LassoFGLS(y, X, transforms=("linear", "trig"))or build your ownzwithpyfgls.hetero.make_dictionary. The default dictionary{x, x², log x, (log x)², cos x, cos 2x}per regressor follows the paper's simulations. - Always use the bias-corrected robust variance (the default, eq. (8)). The fitted variance function is an approximation, so model-based standard errors are not reliable; the corrected sandwich gives close-to-nominal coverage with intervals that are much shorter than OLS-HC intervals under heteroskedasticity.
- Avoid unrestricted parametric WLS when the variance driver is uncertain. The
Romano–Wolf WLS estimators (
skedastic="wls_s1","wls_s2") can be much worse than OLS when the true driver is not among their covariates; SVR ("svr") is competitive in MSE but tends to give less accurate coverage. The adaptive Lasso dominates both.
Quick examples
1. Serial correlation with a non-exogenous regressor
The [PG26] Table 1 design: AR(1) errors with ρ = 0.8 and a regressor w_t = v_t + e_{t−1}
that responds to last period's shock.
import pyfgls as pf
from pyfgls.simulate import serial_dgp
sim = serial_dgp(500, random_state=0)
res = pf.SerialFGLS(sim.y, sim.X).fit()
print(res.summary())
print(res.compare_ols())
==============================================================================
FGLS Regression Results
==============================================================================
Dep. variable: y Inference: normal
Method: FGLS (serial) AR order k*: 1 [BIC (kmax=15)]
Observations: 500 AR coefs rho: 0.7668
Effective obs.: 499 Non-exog. share: 0.015
Covariance: robust
------------------------------------------------------------------------------
coef std err z P>|z| 0.025 0.975
------------------------------------------------------------------------------
const 0.8768 0.1951 4.495 0.000 0.4945 1.2591
x1 0.9927 0.0258 38.449 0.000 0.9421 1.0433
==============================================================================
Notes:
[1] Covariance: [PG26] eq. (29), robust to non-exogenous (pre-determined) regressors.
[2] Collinear lagged columns dropped from the Durbin regression: L1.const
OLS FGLS (serial)
const coef 0.9132 0.8768
std err 0.1315 0.1951
CI width 0.5154 0.7646
x1 coef 1.4125 0.9927
std err 0.0676 0.0258
CI width 0.2650 0.1012
The true slope is 1: OLS is off by 0.41 (it is inconsistent here), FGLS is on target with an interval less than half as wide.
2. Heteroskedasticity of unknown form
from pyfgls.simulate import hetero_dgp
sim = hetero_dgp(400, skedastic="x2", random_state=1) # Var(u | x) = x²
res = pf.LassoFGLS(sim.y, sim.X, random_state=0).fit()
print(res.summary())
==============================================================================
FGLS Regression Results
==============================================================================
Dep. variable: y Inference: normal
Method: FGLS (hetero) Skedastic fit: lasso
Observations: 400 Selected z: x1^2, log(x1)
Effective obs.: 400 df_hat: 3
Covariance: robust Var. ratio max/min: 20.1
------------------------------------------------------------------------------
coef std err z P>|z| 0.025 0.975
------------------------------------------------------------------------------
const 1.3531 0.2825 4.790 0.000 0.7995 1.9068
x1 0.7736 0.1455 5.317 0.000 0.4884 1.0588
==============================================================================
Notes:
[1] Covariance: [GP24] eqs. (6)+(8), sandwich with bias correction.
3. Both problems
from pyfgls.simulate import combined_dgp
sim = combined_dgp(300, ar=(0.5,), skedastic="x2", random_state=2)
res = pf.FGLS(sim.y, sim.X, random_state=0).fit()
print(res.compare_stages()) # F-C: serial correction only; F-CH: both
F-C (serial) F-CH (serial+hetero)
const coef 0.8496 0.7168
std err 0.3644 0.2998
CI width 1.4285 1.1750
x1 coef 1.0020 1.0441
std err 0.1683 0.1335
CI width 0.6596 0.5234
Persistent AR(2) errors, T = 200: the OLS-HAC interval is centred far from the truth and is about three times as wide as the FGLS interval.
Full functionality and usage
Input data
y,Xmay be NumPy arrays, lists, pandasSeries/DataFrame; names and the index are carried into the results. Include a column of ones for an intercept (a warning is issued if there is none; implicit intercepts such as a full set of dummies are recognised).- Time order matters for serial-correlation corrections. A pandas index must be sorted
and unique; a
DatetimeIndex/PeriodIndexwith gaps raisesTimeIndexErrorunlessallow_gaps=True(lags are then positional, e.g. trading days). Panels (MultiIndex) are not supported. - Missing values raise
MissingDataErrorby default;missing="drop"drops leading/trailing rows for time series (interior gaps would corrupt the lags) and any incomplete row for cross sections. Infinite values always raise. - Rank-deficient
XraisesCollinearityErrornaming the offending columns. Lagged constants, trends and seasonal dummies in the Durbin regression are dropped automatically. - Formulas (needs
formulaic):pf.FGLS.from_formula("y ~ x1 + np.log(x2) + lag(x1)", data=df, missing="drop"); the intercept is namedconst.
SerialFGLS — serial correlation ([PG26])
pf.SerialFGLS(
y,
X,
ar_order=None,
ic="bic",
kmax=None,
min_lags=None,
ic_penalty="order",
lagged_dep_vars=None,
wallis_regressor="auto",
exog="predetermined",
ma1=False,
missing="raise",
allow_gaps=False,
check_stationarity=False,
).fit(cov_type="robust", use_t=False)
| Option | Meaning |
|---|---|
ar_order |
Fix the AR order instead of selecting it. |
ic |
"bic" (default, as in [PG26]) or "aic". |
kmax |
Largest order considered: default int(12·(T/200)^¼) (12 at T = 200); "theory" = ⌊(T/ln T)^⅓⌋; or an int. Capped so the Durbin regression uses ≤ 50% of the sample as regressors. |
min_lags |
Lower bound on the order; "adjusted" = ⌈(ln T)^1.5⌉ (Suppl. Lemma A.2). |
ic_penalty |
"order" (paper: penalise the AR order) or "params" (penalise every coefficient a lag adds — use it with several stochastic regressors). |
lagged_dep_vars |
Names/positions of regressors that are lags of y (Wallis recovery, §4.2). |
wallis_regressor |
"auto" (largest |t|), "median", or a regressor name. |
exog |
Your assumption; only affects notes and the default first-stage correction of FGLS. |
ma1 |
GMA estimator for MA(1) errors (§5). |
cov_type |
"robust" (eq. 29, default), "naive" (eq. 27, exogenous regressors only), "HC0"–"HC3" (eq. 29 with heteroskedasticity weights), "bootstrap" (sieve). |
LassoFGLS — heteroskedasticity ([GP24])
pf.LassoFGLS(
y,
X,
z="auto",
skedastic="lasso",
variance=None,
delta=0.1,
delta_scale=False,
cv_folds=10,
psi_grid=(0, 0.25, 0.5, 0.75, 1, 2),
lambda_rule="min",
fold_scheme="random",
cv_weights="fold",
weight_clip=None,
transforms=("linear", "poly2", "log", "trig"),
random_state=None,
n_jobs=None,
missing="raise",
).fit(cov_type="robust")
| Option | Meaning |
|---|---|
z |
Candidate covariates: "auto" (dictionary from the regressors), a list of regressor names, or your own matrix/DataFrame (any number of columns, even more than observations). |
skedastic |
"lasso" (adaptive Lasso, default), "svr", "wls_s1", "wls_s2" (Romano–Wolf), "none" (OLS + HC3), "known" or an array/callable of known variances (infeasible GLS). |
delta, delta_scale |
Floor in log(max(û², δ²)); δ = 0.1 in the units of y (paper), or delta_scale=True for δ·σ̂_OLS. |
cv_folds, psi_grid, lambda_rule |
10-fold CV over (λ, ψ) with common folds; penalty at the CV minimum ("min", paper) or "1se". |
fold_scheme |
"random" (paper) or "blocked" (dependent data). |
cv_weights |
Re-estimate the ridge weights within each fold ("fold", default) or once ("full"). |
weight_clip |
Optional quantile winsorisation of the fitted log-variance. |
cov_type |
"robust" (eq. 8 for Lasso/SVR, eq. 7 for WLS, HC3 otherwise), "nonrobust", "HC0"–"HC3", "bootstrap" (wild). |
FGLS — both, and the general interface
pf.FGLS(y, X, serial="auto", hetero="lasso", z="auto", first_stage_correction=None, ...)
serial ∈ {"auto", "fixed", "ma1", None}, hetero ∈ {"lasso", "svr", "wls_s1", "wls_s2", "known", None}; all SerialFGLS and LassoFGLS options are accepted. The combined fit
(F-CH) applies the [GP24] weights to the quasi-differenced regression, with candidate
covariates built from the unfiltered regressors. first_stage_correction (default on
for pre-determined regressors) adds the eq. (29)-type term for the estimated AR filter to
the sandwich variance; in our simulations with non-exogenous regressors it raises the
coverage of 95% intervals from 0.78 to 0.94. cov_type: "robust", "HC0", "HC3",
"bootstrap".
Results (FGLSResults)
| Attribute / method | Content |
|---|---|
params, bse, tvalues, pvalues |
pandas Series labelled by regressor |
conf_int(alpha), cov_params() |
intervals and covariance (normal, or Student-t with use_t=True) |
summary(), to_frame(), to_dict(), to_json() |
formatted output |
resid, fittedvalues, resid_final, predict(X_new) |
full-sample residuals, final-stage (filtered/weighted) residuals, predictions |
wald_test("x1 = x2, x3 = 0") |
Wald test of linear restrictions (strings or (R, r)) |
compare_ols(), compare_stages(), pf.compare([...]) |
side-by-side tables |
ar_order, rho, ar_roots, bic_path, nonexogeneity_share |
serial block (res.serial) |
selected_z, skedastic_coef, weights, df_hat |
heteroskedasticity block (res.hetero) |
stage_serial, stage_hetero |
F-C and F-CH fits of a combined estimate |
plot_diagnostics() |
residuals, their ACF, BIC path / fitted variance, coefficients vs OLS |
Diagnostics
from pyfgls import diagnostics
diagnostics.test_predetermined(y, X, max_lag=4) # [PG26] Remark 9 (experimental)
diagnostics.check_stationarity(res.data) # ADF screening (warnings)
diagnostics.weight_diagnostics(res) # concentration of the FGLS weights
Benchmarks, bootstrap, simulation designs
pf.benchmarks.ols(y, X, cov_type="HAC") # Andrews QS kernel, automatic bandwidth
pf.benchmarks.ols(y, X, cov_type="NW") # Newey–West
pf.benchmarks.cochrane_orcutt(y, X) # two-step CO (invalid if not exogenous)
pf.benchmarks.durbin(y, X) # beta^D from the Durbin regression
pf.benchmarks.infeasible_gls(y, X, rho=[0.8]) # known AR coefficients (or omega=)
pf.benchmarks.hybrid_gls(y, X) # [PG26] Suppl. S-1, exogenous only
res = pf.SerialFGLS(y, X).fit(cov_type="bootstrap", n_boot=999, boot_random_state=1)
from pyfgls.simulate import serial_dgp, hetero_dgp, combined_dgp, predictive_dgp
scikit-learn
from pyfgls.sklearn import FGLSRegressor
from sklearn.model_selection import TimeSeriesSplit, cross_val_score
cross_val_score(FGLSRegressor(hetero=None), X_features, y, cv=TimeSeriesSplit(5))
Warnings and errors
All warnings derive from pyfgls.exceptions.PyFGLSWarning (NonStationaryWarning,
CollinearityWarning, SampleSizeWarning, SpecificationWarning,
LaggedDependentWarning, WeightWarning, ConvergenceWarning, ExperimentalWarning)
and all errors from PyFGLSError (InputError, MissingDataError, TimeIndexError,
CollinearityError, InsufficientDataError).
Performance
python benchmarks/performance.py (T = 10,000, 10 regressors, 100 candidate covariates,
one core): serial FGLS ≈ 2 s, Lasso-FGLS ≈ 3 s, combined ≈ 5 s. n_jobs parallelises the
cross-validation folds and the bootstrap.
What the estimators do
Serial correlation ([PG26]). The errors are approximated by an AR(k) process. Its
coefficients come from the Durbin regression of y_t on its own lags, x_t and the lags
of x_t (eq. 14) — every regressor there is uncorrelated with the current innovation, so
the estimates are consistent whether or not the regressors are exogenous (unlike
Cochrane–Orcutt, which uses OLS residuals). The order k* minimises BIC with all orders
estimated on a common sample. The data are then quasi-differenced and OLS is applied
(eq. 15). The estimator is √T-consistent and asymptotically normal under
pre-determinedness; with non-exogenous regressors the first stage inflates its variance
by a term that eq. (29) estimates from by-products of the two steps, with no bandwidth or
other tuning parameter.
Heteroskedasticity ([GP24]). log(max(û², δ²)) from OLS is regressed on the candidate
covariates by an adaptive Lasso: ridge first step, penalty weights |γ̂_ridge|^(−ψ), and
the pair (λ, ψ) chosen jointly by 10-fold cross-validation with common folds. The
exponentiated fit gives the GLS weights. Because the variance function is only
approximated, the variance of the estimator is a heteroskedasticity-robust sandwich with
the Miller–Startz/Rothenberg finite-sample correction (eqs. 6 and 8), which accounts for
the leverage of the weighted regression and the degrees of freedom of the Lasso fit.
Both ([PG26] Supplement S-4). F-C (the serial-correlation FGLS), then the Lasso skedastic fit on the F-C residuals, then weighted least squares on the quasi-differenced data (F-CH), with the bias-corrected sandwich on the filtered regressors.
More detail: docs/theory.
Replication of the papers
The slow tests (pytest --runslow tests/statistical, nightly in CI) re-run the papers'
simulations with fewer replications. Highlights (full tables in
docs/replication.md):
| Design | Quantity | Paper | pyfgls |
|---|---|---|---|
| [PG26] Table 1 (T = 500) | slope RMSE: OLS / Durbin / GLS / FGLS / CO | 0.399 / 0.036 / 0.025 / 0.025 / 0.041 | 0.398 / 0.037 / 0.024 / 0.026 / 0.041 |
| [PG26] Table 1 | bias of ρ̂: FGLS / Cochrane–Orcutt | −0.008 / −0.171 | −0.008 / −0.170 |
| [PG26] Table 3, AR(2) (1.34, −0.42), γ = 0, T = 200 | MSE×100: OLS / FGLS | 11.50 / 0.41 | 10.7 / 0.41 |
| [PG26] Tables 2–3 | coverage of eq. (29) intervals, AR(1)/AR(2), γ ∈ {0, .25, .5} | 0.91–0.95 | 0.93–0.95 |
| [PG26] Table 4, MA(1) θ = −0.7, γ = 0.5 | coverage FGLS / GMA | 0.87 / 0.91 | 0.85 / 0.91 |
| [GP24] Table 1, T = 400 | Lasso eMSE / OLS: x, x², (log x)², exp, step | 0.92, 0.70, 0.46, 0.45, 0.73 | 0.92, 0.70, 0.46, 0.45, 0.74 |
| [GP24] Table 2, T = 100 | Lasso interval length: x², (log x)², exp | 1.10, 0.32, 1.34 | 1.12, 0.32, 1.35 |
python benchmarks/replicate_pg26_tables.py --table 1 --reps 10000
python benchmarks/replicate_pg26_tables.py --table general --reps 2000
python benchmarks/replicate_gp24_tables.py --reps 2000 --T 100 200 400
Implementation choices and open items
Where the papers leave room, pyfgls makes the following choices (all overridable):
kmax = int(12·(T/200)^¼); the [PG26] simulations use 12 for T = 200 and 500.- Variances are scaled by the effective sample
T − k*; normal critical values unlessuse_t=True. - The Lasso degrees of freedom count the intercept; the Romano–Wolf variance uses HC3 OLS residuals (eq. 7).
- The ridge weights of the adaptive Lasso are re-estimated within each CV fold so the CV
error is not flattered by weights that have seen the test fold (
cv_weights="full"computes them once). - The Lasso path is computed exactly (LARS); coordinate descent did not converge on the highly correlated default dictionary.
- The first
k*observations are dropped (no Prais–Winsten).
Open items for the authors:
- Combined variance. The Supplement does not write the first-stage term for F-CH;
pyfglsadds a heteroskedasticity-robust analogue of eq. (29) by default (coverage 0.94 with vs 0.78 without it for non-exogenous regressors). - Lag penalty with many regressors. The eq. (14) BIC penalises only the AR order; with
several stochastic regressors it tends to select
kmax.ic_penalty="params"is available; the default follows the paper. - Small-sample Lasso efficiency. At T = 100–200 our Lasso-FGLS eMSE ratios are 0.03–0.06 above [GP24] Table 1 (e.g. x²: 0.75–0.77 vs 0.70), although WLS-S1/S2, the infeasible GLS and the interval lengths agree with the paper and the T = 400 ratios match; the difference must come from details of the glmnet-based tuning.
- Multi-regressor Wallis ratio (
wallis_regressor):"auto"uses the regressor with the largest |t|; [PG26] reports insensitivity to the choice. - Remark 9 test. Read literally (n·R² of the Durbin residuals on X and lagged x), the
test rejects correctly specified models whose regressors are pre-determined but not
exogenous, because the Durbin residuals are not orthogonal to X and still contain past
innovations.
test_predeterminedtherefore uses the variable-addition form n(SSR₀ − SSR₁)/SSR₀ on the innovation scale (residuals and regressors filtered with the Durbin AR filter); simulated size 0.04, power 1.00 against an omitted x_{t−1}.scale="errors"keeps the literal reading. - GMA. θ̂ is the exact Gaussian MLE from the residuals of the Durbin regression with k_T = int(4(T/100)^{2/9}) lags (§5), and all T observations are transformed.
Citing
If you use pyfgls, please cite the papers that the methods come from:
- Perron, P. and González-Coya, E. (2026). Feasible GLS for time series regression. Journal of Econometrics 258, 106346. https://doi.org/10.1016/j.jeconom.2026.106346
- González-Coya, E. and Perron, P. (2024). Estimation in the presence of heteroskedasticity of unknown form: a Lasso-based approach. Journal of Econometric Methods 13(1), 29–48. https://doi.org/10.1515/jem-2023-0007
@article{PerronGonzalezCoya2026,
author = {Perron, Pierre and Gonz{\'a}lez-Coya, Emilio},
title = {Feasible {GLS} for time series regression},
journal = {Journal of Econometrics},
volume = {258},
pages = {106346},
year = {2026},
doi = {10.1016/j.jeconom.2026.106346}
}
@article{GonzalezCoyaPerron2024,
author = {Gonz{\'a}lez-Coya, Emilio and Perron, Pierre},
title = {Estimation in the presence of heteroskedasticity of unknown form:
a {L}asso-based approach},
journal = {Journal of Econometric Methods},
volume = {13},
number = {1},
pages = {29--48},
year = {2024},
doi = {10.1515/jem-2023-0007}
}
See also CITATION.cff. License: MIT © Emilio González-Coya.
Metadata
Release files for pyfgls 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pyfgls-0.1.0.tar.gz | 120.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyfgls-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 229.1 kB
Release files / pyfgls-0.1.0.tar.gz
| Download URL | pyfgls-0.1.0.tar.gz |
|---|---|
| Size | 120.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1c81adfa623dd4a828c3de4ce67c542dd2ba2b3800ef7947159c46c4a224fedf
|
|
BLAKE2b-256 checksum How to use checksums |
e17c22ba5d25a9d06afe61e61375eb9871475813a007ca4d6d46634a1165bd2a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / pyfgls-0.1.0-py3-none-any.whl
| Download URL | pyfgls-0.1.0-py3-none-any.whl |
|---|---|
| Size | 108.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4d8273028778032bc78a113723586503f918e9d5a74271a635e52402b2528321
|
|
BLAKE2b-256 checksum How to use checksums |
6d05628c713c6e4e20df7775340bccc4ca04b0a2251effc3109059a56331e88a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency log