{"title":"News","markdown":{"headingText":"News","containsRefs":false,"markdown":"\n## PyFixest 0.22.0\n\n### Changes\n\n- Fix bug in wildboottest method @s3alfisc (#506)\n- docs: add sanskriti2005 as a contributor for infra @allcontributors (#503)\n- Infra: added the release-drafter for automation of release notes @sanskriti2005 (#502)\n- Fix broken link in contributing.md @s3alfisc (#499)\n- docs: add leostimpfle as a contributor for bug @allcontributors (#495)\n- Update justfile @leostimpfle (#494)\n- docs: add baggiponte as a contributor for doc @allcontributors (#490)\n- docs: improve installation section @baggiponte (#489)\n- Bump tornado from 6.4 to 6.4.1 @dependabot (#487)\n- docs: add leostimpfle as a contributor for code @allcontributors (#478)\n- Feols: speed up the creation of interacted fixed effects via `fe1^fe2` syntax @leostimpfle (#475)\n- rename resampling iterations to 'reps' in all methods @s3alfisc (#474)\n- fix a lot of broken links throught the repo @s3alfisc (#472)\n- Multiple readme fixes required after package was moved to py-econometrics project @s3alfisc (#450)\n\n### Infrastructure\n\n- infrastructure: fix minor release drafter bugs @s3alfisc (#504)\n\n## PyFixest 0.21.0\n\n- Add support for randomization inference via the `ritest()` method:\n\n```{python}\n#| eval: False\nimport pyfixest as pf\ndata = pf.get_data()\n\nfit = pf.feols(\"Y ~ X1\", data = data)\nfit.ritest(resampvar=\"X1=0\", reps = 1000)\n```\n\n## PyFixest 0.20.0\n\n- This version introduces MyPy type checks to the entire pyfixest codebase. Thanks to @juanitorduz for nudging me to get started with this =). It also fixes a handful of smaller bugs.\n\n## PyFixest 0.19.0\n\n- Fixes multiple smaller and larger performance regressions. The NYC-Taxi example regression now takes approximately 22 seconds to run (... if my laptopt is connected to a power charger)!\n\n```{python}\n#| eval: False\n\n%load_ext autoreload\n%autoreload 2\n\nimport duckdb\nimport time\nimport numpy as np\nimport pyfixest as pf\n\n# %%\nnyc = duckdb.sql(\n    '''\n    FROM 'C:/Users/alexa/Documents/nyc-taxi/**/*.parquet'\n    SELECT\n        tip_amount, trip_distance, passenger_count,\n        vendor_id, payment_type, dropoff_at,\n        dayofweek(dropoff_at) AS dofw\n    WHERE year = 2012 AND month <= 3\n    '''\n    ).df()\n\n# convert dowf, vendor_id, payment_type to categorical\ntic = time.time()\nnyc[\"dofw\"] = nyc[\"dofw\"].astype(int)\nnyc[\"vendor_id\"] = nyc[\"vendor_id\"].astype(\"category\")\nnyc[\"payment_type\"] = nyc[\"payment_type\"].astype(\"category\")\nprint(f\"\"\"\n    I am convering columns of type 'objects' to 'categories' and 'int'data types outside\n    of the regression, hence I am cheating a bit. This saves {np.round(time.time() - tic)} seconds.\n    \"\"\"\n)\n#    I am convering columns of type 'objects' to 'categories' and 'int'data types outside\n#    of the regression, hence I am cheating a bit. This saves 7.0 seconds.\n\nrun = True\nif run:\n\n    # mock regression for JIT compilation\n    fit = pf.feols(\n        fml = \"tip_amount ~ trip_distance + passenger_count | vendor_id + payment_type + dofw\",\n        data = nyc.iloc[1:10_000],\n        copy_data = False,\n        store_data = False\n        )\n\n    import time\n    tic = time.time()\n    fit = pf.feols(\n        fml = \"tip_amount ~ trip_distance + passenger_count | vendor_id + payment_type + dofw\",\n        data = nyc,\n        copy_data = False, # saves a few seconds\n        store_data = False # saves a few second\n        )\n    passed = time.time() - tic\n    print(f\"Passed time is {np.round(passed)}.\")\n    # Passed time is 22.\n```\n\n- Adds three new function arguments to `feols()` and `fepois()`: `copy_data`, `store_data`, and `fixef_tol`.\n- Adds support for frequency weights with the `weights_type` function argument.\n```{python}\nimport pyfixest as pf\n\ndata = pf.get_data(N = 10000, model = \"Fepois\")\ndf_weighted = data[[\"Y\", \"X1\", \"f1\"]].groupby([\"Y\", \"X1\", \"f1\"]).size().reset_index().rename(columns={0: \"count\"})\ndf_weighted[\"id\"] = list(range(df_weighted.shape[0]))\n\nprint(\"Dimension of the aggregated df:\", df_weighted.shape)\nprint(df_weighted.head())\n\nfit = pf.feols(\n    \"Y ~ X1 | f1\",\n    data = data\n)\nfit_weighted = pf.feols(\n    \"Y ~ X1 | f1\",\n    data = df_weighted,\n    weights = \"count\",\n    weights_type = \"fweights\"\n)\npf.etable([fit, fit_weighted], coef_fmt = \"b(se) \\n (t) \\n (p)\")\n```\n\n- Bugfix: Wild Cluster Bootstrap Inference with Weights would compute unweighted standard errors. Sorry about that! WLS is not supported for the WCB.\n- Adds support for CRV3 inference with weights.\n\n\n## PyFixest 0.18.0\n\n- Large Refactoring of Interal Processing of Model Formulas, in particular `FixestFormulaParser` and `model_matrix_fixest`. As a results, the code should be cleaner and more robust.\n- Thanks to the refactoring, we can now bump the required `formulaic` version to the stable `1.0.0` release.\n- The `fml` argument of `model_matrix_fixest` is deprecated. Instead, `model_matrix_fixest`\n  now asks for a `FixestFormula`, which is essentially a dictionary with information on model\n  specifications like a first stage formula (if applicable), dependent variables, fixed effects,\n  etc.\n- Additionally, `model_matrix_fixest` now returns a dictionary instead of a tuple.\n- Brings back fixed effects reference setting via `i(var1, var2, ref)` syntax. Deprecates the `i_ref1`, `i_ref2` function arguments. I.e. it is again possible to e.g. run\n\n```{python}\n#| eval: False\n\nimport pyfixest as pf\ndata = pf.get_data()\n\nfit1 = pf.feols(\"Y ~ i(f1, X2)\", data=data)\nfit1.coef()[0:8]\n```\nVia the `ref` syntax, via can set the reference level:\n```{python, eval=FALSE}\n#| eval: False\nfit2 = pf.feols(\"Y ~ i(f1, X2, ref = 1)\", data=data)\nfit2.coef()[0:8]\n```\n\n## PyFixest 0.17.0\n\n- Restructures the codebase and reorganizes how users can interact with the `pyfixest` API. It is now recommended to use `pyfixest` in the following way:\n\n  ```{python}\n  import numpy as np\n  import pyfixest as pf\n  data = pf.get_data()\n  data[\"D\"] = data[\"X1\"] > 0\n  fit = pf.feols(\"Y ~ D + f1\", data = data)\n  fit.tidy()\n  ```\n\n  The update should not inroduce any breaking changes. Thanks to [@Wenzhi-Ding](https://github.com/Wenzhi-Ding) for the PR!\n\n- Adds support for simultaneous confidence intervals via a multiplier bootstrap. Thanks to [@apoorvalal](https://github.com/apoorvalal) for the contribution!\n\n  ```{python}\n  fit.confint(joint = True)\n  ```\n\n- Adds support for the causal cluster variance estimator by [Abadie et al. (QJE, 2023)](https://academic.oup.com/qje/article/138/1/1/6750017)\n  for OLS via the `.ccv()` method.\n\n  ```{python}\n  fit.ccv(treatment = \"D\", cluster = \"group_id\")\n  ```\n\n\n\n## PyFixest 0.16.0\n\n- Adds multiple quality of life improvements for developers, thanks to [NKeleher](https://github.com/NKeleher).\n- Adds more options to customize `etable()` output thanks to [Wenzhi-Ding](https://github.com/Wenzhi-Ding).\n- Implements Romano-Wolf and Bonferroni corrections for multiple testing in the `multcomp` module.\n\n## PyFixest 0.15.\n\n- Adds support for weighted least squares for `feols()`.\n- Reduces testing time drastically by running tests on fewer random data samples. Qualitatively,\n  the set of test remains identical.\n- Some updates for future `pandas` compatibility.\n\n## PyFixest 0.14.0\n\n- Moves the documentation to [quartodoc](https://github.com/machow/quartodoc).\n- Changes all docstrings to `numpy` format.\n- Difference-in-differences estimation functions now need to be imported via the `pyfixest.did.estimation` module:\n\n```{python}\nfrom pyfixest.did.estimation import did2s, lpdid, event_study\n```\n## PyFixest 0.13.5\n\n- Fixes a bug that lead to incorrect results when the dependent variable and **all covariates** (excluding the fixed effects) where integers.\n\n## PyFixest 0.13.4\n\n- Fixes a bug in `etable()` with IV's that occurred because `feols()` does not report R2 statistics for IVs.\n\n## PyFixest 0.13.2\n\n- Fixes a bug in `etable()` and a warning in `fixest_model_matrix` that arose with higher `pandas` versions. Thanks to @aeturrell for reporting!\n\n## PyFixest 0.13.0\n\n### New Features\n\n- Introduces a new `pyfixest.did` module which contains routines for Difference-in-Differences estimation.\n- Introduces support for basic versions of the local projections DiD estimator following [Dube et al (2023)](https://www.nber.org/papers/w31184)\n- Adds a new vignette for Difference-in-Differences estimation.\n- Reports R2 values in `etable()`.\n\n\n## PyFixest 0.12.0\n\n\n### Enhancements:\n\n- Good performance improvements for singleton fixed effects detection. Thanks to [@styfenschaer](https://github.com/styfenschaer) for the PR! See [#229](https://github.com/py-econometrics/pyfixest/issues/229).\n- Uses the [r2u project](https://github.com/eddelbuettel/r2u) for installing R and R packages on github actions, with great performance improvements.\n- Allows to pass `polars` data frames to `feols()`, `fepois()` and `predict()`. [#232](https://github.com/py-econometrics/pyfixest/issues/232). Thanks to [@vincentarelbundock](https://github.com/py-econometrics/pyfixest/issues/232) for the suggestion!\n\n### Bug Fixes:\n\n- Missing variables in features were not always handled correctly in `predict()` with `newdata` not `None` in the presence of missing data, which would lead to an error. See [#246](https://github.com/py-econometrics/pyfixest/issues/246) for details.\n- Categorical variables were not always handled correctly in `predict()` with `newdata` not `None`, because the number of fixed effects levels in `newdata` might be smaller than in `data`. In consequence, some levels were not found, which lead to an error. See [#245](https://github.com/py-econometrics/pyfixest/issues/245) for details. Thanks to [@jiafengkevinchen](https://github.com/jiafengkevinchen) for the pointer!\n- Multicollinearity checks for over-identified IV was not implemented correctly, which lead to a dimension error. See [#236](https://github.com/py-econometrics/pyfixest/issues/236) for details.  Thanks to [@jiafengkevinchen](https://github.com/jiafengkevinchen) for the pointer!\n- The number of degrees of freedom `k` was computed incorrectly if columns were dropped from the design matrix `X` in the presence of multicollinearity. See [#235](https://github.com/py-econometrics/pyfixest/issues/235) for details.  Thanks to [@jiafengkevinchen](https://github.com/jiafengkevinchen) for the pointer!\n- If all variables were dropped due to multicollinearity, an unclear and imprecise error message was produced. See [#228](https://github.com/py-econometrics/pyfixest/issues/228) for details. Thanks to [@manferdinig](https://github.com/manferdinig) for the pointer!\n- If selection `fixef_rm = 'singleton'`, `feols()` and `fepois()` would fail, which has been fixed. [#192](https://github.com/py-econometrics/pyfixest/issues/192)\n\n### Dependency Requirements\n\n- For now, sets `formulaic` versions to be `0.6.6` or lower as version `1.0.0` seems to have introduced a problem with the `i()` operator, See [#244](https://github.com/py-econometrics/pyfixest/issues/244) for details.\n- Drops dependency on `pyhdfe`.\n\n## PyFixest 0.11.1\n\n- Fixes some bugs around the computation of R-squared values (see [issue #103](https://github.com/py-econometrics/pyfixest/issues/103)).\n- Reports R-squared values again when calling `.summary()`.\n\n## PyFixest 0.11.0\n\n- Significant speedups for CRV1 inference.\n\n## PyFixest 0.10.12\n\nFixes a small bug with the separation check for poisson regression #138.\n\n## PyFixest 0.10.11\n\nFixes bugs with i(var1, var2) syntax introduced with PyFixest 0.10.10.\n\n## PyFixest 0.10.10\n\nFixes a bug with variable interactions via `i(var)` syntax. See [issue #221](https://github.com/py-econometrics/pyfixest/issues/211).\n\n## PyFixest 0.10.9\n\nMakes `etable()` prettier and more informative.\n\n## PyFixest 0.10.8\n\n### Breaking changes\nReference levels for the `i()` formula syntax can no longer be set within the formula, but need to be added via the `i_ref1` function argument to either `feols()` and `fepois()`.\n\n### New feature\n\nA `dids2()` function is added, which implements the 2-stage difference-in-differences procedure à la Gardner and follows the syntax of @kylebutts [did2s](https://github.com/kylebutts/did2s) R package.\n\n```py\nfrom pyfixest.did.did import did2s\nfrom pyfixest.estimation import feols\nfrom pyfixest.visualize import iplot\nimport pandas as pd\nimport numpy as np\n\ndf_het = pd.read_csv(\"https://raw.githubusercontent.com/py-econometrics/pyfixest/master/pyfixest/did/data/df_het.csv\")\n\nfit = did2s(\n    df_het,\n    yname = \"dep_var\",\n    first_stage = \"~ 0 | state + year\",\n    second_stage = \"~i(rel_year)\",\n    treatment = \"treat\",\n    cluster = \"state\",\n    i_ref1 = [-1.0, np.inf],\n)\n\nfit_twfe = feols(\n    \"dep_var ~ i(rel_year) | state + year\",\n    df_het,\n    i_ref1 = [-1.0, np.inf]\n)\n\niplot([fit, fit_twfe], coord_flip=False, figsize = (900, 400), title = \"TWFE vs DID2S\")\n```\n![](figures/event_study.svg)\n\n\n\n## PyFixest 0.10.7\n\n- Adds basic support for event study estimation via two-way fixed effects and Gardner's two-stage \"Did2s\" approach.\n  This is a beta version and experimental. Further updates (i.e. proper event studies vs \"only\" ATTs) and a more flexible\n  did2s front end will follow in future releases.\n\n```python\n%load_ext autoreload\n%autoreload 2\n\nfrom pyfixest.did.did import event_study\nimport pyfixest as pf\nimport pandas as pd\ndf_het = pd.read_csv(\"pyfixest/did/data/df_het.csv\")\n\nfit_twfe = event_study(\n    data = df_het,\n    yname = \"dep_var\",\n    idname= \"state\",\n    tname = \"year\",\n    gname = \"g\",\n    estimator = \"twfe\"\n)\n\nfit_did2s = event_study(\n    data = df_het,\n    yname = \"dep_var\",\n    idname= \"state\",\n    tname = \"year\",\n    gname = \"g\",\n    estimator = \"did2s\"\n)\n\npf.etable([fit_twfe, fit_did2s])\n# | Coefficient   | est1             | est2             |\n# |:--------------|:-----------------|:-----------------|\n# | ATT           | 2.135*** (0.044) | 2.152*** (0.048) |\n# Significance levels: * p < 0.05, ** p < 0.01, *** p < 0.001\n```\n\n## PyFixest 0.10.6\n\n- Adds an `etable()` function that outputs markdown, latex or a pd.DataFrame.\n\n## PyFixest 0.10.5\n\n- Fixes a big in IV estimation that would trigger an error. See [here](https://github.com/py-econometrics/pyfixest/issues/197) for details. Thanks to @aeturrell for reporting!\n\n## PyFixest 0.10.4\n\n- Implements a custom function to drop singleton fixed effects.\n- Additional small performance improvements.\n\n## PyFixest 0.10.3\n\n- Allows for white space in the multiway clustering formula.\n- Adds documentation for multiway clustering.\n\n## PyFixest 0.10.2\n\n- Adds support for two-way clustering.\n- Adds support for CRV3 inference for Poisson regression.\n\n## PyFixest 0.10.1\n\n- Adapts the internal fixed effects demeaning criteron to match `PyHDFE's default.\n- Adds Styfen as coauthor.\n\n## PyFixest 0.10\n\n- Multiple performance improvements.\n- Most importantly, implements a custom demeaning algorithm in `numba` - thanks to Styfen Schaer (@styfenschaer),\n  which leads to performance improvements of 5x or more:\n\n```python\n%load_ext autoreload\n%autoreload 2\n\nimport numpy as np\nimport time\nimport pyhdfe\nfrom pyfixest.demean import demean\n\nnp.random.seed(1238)\nN = 10_000_000\nx = np.random.normal(0, 1, 10*N).reshape((N,10))\nf1 = np.random.choice(list(range(1000)), N).reshape((N,1))\nf2 = np.random.choice(list(range(1000)), N).reshape((N,1))\n\nflist = np.concatenate((f1, f2), axis = 1)\nweights = np.ones(N)\n\nalgorithm = pyhdfe.create(flist)\n\nstart_time = time.time()\nres_pyhdfe = algorithm.residualize(x)\nend_time = time.time()\nprint(end_time - start_time)\n# 26.04527711868286\n\n\nstart_time = time.time()\nres_pyfixest, success = demean(x, flist, weights, tol = 1e-10)\n# Calculate the execution time\nend_time = time.time()\nprint(end_time - start_time)\n#4.334428071975708\n\nnp.allclose(res_pyhdfe , res_pyfixest)\n# True\n```\n\n\n\n## PyFixest 0.9.11\n\n- Bump required `formulaic` version to `0.6.5`.\n- Stop copying the data frame in `fixef()`.\n\n## PyFixest 0.9.10\n\n- Fixes a big in the `wildboottest` method (see [#158](https://github.com/py-econometrics/pyfixest/issues/158)).\n- Allows to run a wild bootstrap after fixed effect estimation.\n\n## PyFixest 0.9.9\n\n- Adds support for `wildboottest` for Python `3.11`.\n\n## PyFixest 0.9.8\n\n- Fixes a couple more bugs in the `predict()` and `fixef()` methods.\n- The `predict()` argument `data` is renamed to `newdata`.\n\n## PyFixest 0.9.7\n\nFixes a bug in `predict()` produced when multicollinear variables are dropped.\n\n## PyFixest 0.9.6\n\nImproved Collinearity handling. See [#145](https://github.com/py-econometrics/pyfixest/issues/145)\n\n## PyFixest 0.9.5\n\n\n- Moves plotting from `matplotlib` to `lets-plot`.\n- Fixes a few minor bugs in plotting and the `fixef()` method.\n\n\n## PyFixest 0.9.1\n\n### Breaking API changes\n\nIt is no longer required to initiate an object of type `Fixest` prior to running [Feols(/reference/Feols.qmd) or `fepois`. Instead,\nyou can now simply use `feols()` and `fepois()` as functions, just as in `fixest`. Both function can be found in an\n`estimation` module and need to obtain a `pd.DataFrame` as a function argument:\n\n```py\nfrom pyfixest.estimation import fixest, fepois\nfrom pyfixest.utils import get_data\n\ndata = get_data()\nfit = feols(\"Y ~ X1 | f1\", data = data, vcov = \"iid\")\n```\n\nCalling `feols()` will return an instance of class [Feols(/reference/Feols.qmd), while calling `fepois()` will return an instance of class `Fepois`.\nMultiple estimation syntax will return an instance of class `FixestMulti`.\n\nPost processing works as before via `.summary()`, `.tidy()` and other methods.\n\n### New Features\n\nA summary function allows to compare multiple models:\n\n```py\nfrom pyfixest.summarize import summary\nfit2 = feols(\"Y ~ X1 + X2| f1\", data = data, vcov = \"iid\")\nsummary([fit, fit2])\n```\n\nVisualization is possible via custom methods (`.iplot()` & `.coefplot()`), but a new module allows to visualize\n  a list of [Feols(/reference/Feols.qmd) and/or `Fepois` instances:\n\n```py\nfrom pyfixest.visualize import coefplot, iplot\ncoefplot([fit, fit2])\n```\n\nThe documentation has been improved (though there is still room for progress), and the code has been cleaned up a\nbit (also lots of room for improvements).\n","srcMarkdownNoYaml":""},"formats":{"html":{"identifier":{"display-name":"HTML","target-format":"html","base-format":"html"},"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":false,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"ipynb-shell-interactivity":null,"plotly-connected":true,"engine":"jupyter"},"render":{"keep-tex":false,"keep-typ":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"scroll","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"inline-includes":false,"preserve-yaml":false,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-min-runs":1,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[],"notebook-links":true},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","output-file":"news.html"},"language":{"toc-title-document":"Table of contents","toc-title-website":"On this page","related-formats-title":"Other Formats","related-notebooks-title":"Notebooks","source-notebooks-prefix":"Source","other-links-title":"Other Links","code-links-title":"Code Links","launch-dev-container-title":"Launch Dev Container","launch-binder-title":"Launch Binder","article-notebook-label":"Article Notebook","notebook-preview-download":"Download Notebook","notebook-preview-download-src":"Download Source","notebook-preview-back":"Back to Article","manuscript-meca-bundle":"MECA Bundle","section-title-abstract":"Abstract","section-title-appendices":"Appendices","section-title-footnotes":"Footnotes","section-title-references":"References","section-title-reuse":"Reuse","section-title-copyright":"Copyright","section-title-citation":"Citation","appendix-attribution-cite-as":"For attribution, please cite this work as:","appendix-attribution-bibtex":"BibTeX citation:","appendix-view-license":"View License","title-block-author-single":"Author","title-block-author-plural":"Authors","title-block-affiliation-single":"Affiliation","title-block-affiliation-plural":"Affiliations","title-block-published":"Published","title-block-modified":"Modified","title-block-keywords":"Keywords","callout-tip-title":"Tip","callout-note-title":"Note","callout-warning-title":"Warning","callout-important-title":"Important","callout-caution-title":"Caution","code-summary":"Code","code-tools-menu-caption":"Code","code-tools-show-all-code":"Show All Code","code-tools-hide-all-code":"Hide All Code","code-tools-view-source":"View Source","code-tools-source-code":"Source Code","tools-share":"Share","tools-download":"Download","code-line":"Line","code-lines":"Lines","copy-button-tooltip":"Copy to Clipboard","copy-button-tooltip-success":"Copied!","repo-action-links-edit":"Edit this page","repo-action-links-source":"View source","repo-action-links-issue":"Report an issue","back-to-top":"Back to top","search-no-results-text":"No results","search-matching-documents-text":"matching documents","search-copy-link-title":"Copy link to search","search-hide-matches-text":"Hide additional matches","search-more-match-text":"more match in this document","search-more-matches-text":"more matches in this document","search-clear-button-title":"Clear","search-text-placeholder":"","search-detached-cancel-button-title":"Cancel","search-submit-button-title":"Submit","search-label":"Search","toggle-section":"Toggle section","toggle-sidebar":"Toggle sidebar navigation","toggle-dark-mode":"Toggle dark mode","toggle-reader-mode":"Toggle reader mode","toggle-navigation":"Toggle navigation","crossref-fig-title":"Figure","crossref-tbl-title":"Table","crossref-lst-title":"Listing","crossref-thm-title":"Theorem","crossref-lem-title":"Lemma","crossref-cor-title":"Corollary","crossref-prp-title":"Proposition","crossref-cnj-title":"Conjecture","crossref-def-title":"Definition","crossref-exm-title":"Example","crossref-exr-title":"Exercise","crossref-ch-prefix":"Chapter","crossref-apx-prefix":"Appendix","crossref-sec-prefix":"Section","crossref-eq-prefix":"Equation","crossref-lof-title":"List of Figures","crossref-lot-title":"List of Tables","crossref-lol-title":"List of Listings","environment-proof-title":"Proof","environment-remark-title":"Remark","environment-solution-title":"Solution","listing-page-order-by":"Order By","listing-page-order-by-default":"Default","listing-page-order-by-date-asc":"Oldest","listing-page-order-by-date-desc":"Newest","listing-page-order-by-number-desc":"High to Low","listing-page-order-by-number-asc":"Low to High","listing-page-field-date":"Date","listing-page-field-title":"Title","listing-page-field-description":"Description","listing-page-field-author":"Author","listing-page-field-filename":"File Name","listing-page-field-filemodified":"Modified","listing-page-field-subtitle":"Subtitle","listing-page-field-readingtime":"Reading Time","listing-page-field-wordcount":"Word Count","listing-page-field-categories":"Categories","listing-page-minutes-compact":"{0} min","listing-page-category-all":"All","listing-page-no-matches":"No matching items","listing-page-words":"{0} words","listing-page-filter":"Filter","draft":"Draft"},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.5.56","quartodoc":{"package":"pyfixest","title":"PyFixest Function Reference","parser":"numpy","rewrite_all_pages":false,"sidebar":"_sidebar.yml","sections":[{"title":"Estimation Functions","desc":"User facing estimation functions\n","contents":["estimation.estimation.feols","estimation.estimation.fepois","did.estimation.did2s","did.estimation.lpdid","did.estimation.event_study","estimation.bonferroni","estimation.rwolf"]},{"title":"Estimation Classes","desc":"Details on Methods and Attributes\n","contents":["estimation.feols_.Feols","estimation.fepois_.Fepois","estimation.feiv_.Feiv","estimation.feols_compressed_.FeolsCompressed"]},{"title":"Summarize and Visualize","desc":"Post-Processing of Estimation Results\n","contents":["did.visualize.panelview","report.summary","report.etable","report.dtable","report.coefplot","report.iplot","did.visualize.panelview"]},{"title":"Misc / Utilities","desc":"PyFixest internals and utilities\n","contents":["estimation.demean","estimation.detect_singletons","estimation.model_matrix_fixest"]}]}},"extensions":{"book":{"multiFile":true}}}},"projectFormats":["html"]}