Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

cast of non-full rank regression in the first-step regression of FamaMacBeth

未关闭
#258 3 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
3-5 天
新手友好度
25/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
停滞
技术栈
numpy, python
领域
data

调研方向

Start in model.py at FamaMacBeth.fit.single, especially the full-rank check around lines 2755–2761. Reproduce the 1935 case with the supplied grunfeld data and compare the current result with the issue’s np.linalg.lstsq example. Done means the rank-deficient group produces the stated coefficients rather than all NaNs, with regression tests covering the behavior.

由索引模型根据 Issue 内容生成。

描述

I found that in the first-step regression of FamaMacBeth function (i.e. FamaMacBeth.fit.single function in line 2755-2761 of model.py), if the exog matrix is not full-rank, the coefficients of time-series regression for that group will be NaN. But when I use Stata/SE 15.1, the coefficients of that collinear variables will be 0, and the coefficients of remaining variables will be the same as for normal regression. So I think that the full rank command on line 2757 may need to be reconsidered......

For example, I use grunfeld data set and create a dummy variable. For those obs with year < 1945, I set dummy variable as 0, and for those obs with year >= 1945, I set dummy variable randomly from 0 to 1.

The subset of the data is:

                  invest       mvalue      kstock  Dummy  Dummy*mvalue  Dummy*kstock  const
company year
1       1935  317.600010  3078.500000    2.800000      0           0.0           0.0      1
2       1935  209.899990  1362.400000   53.799999      0           0.0           0.0      1
3       1935   33.099998  1170.600000   97.800003      0           0.0           0.0      1
4       1935   40.290001   417.500000   10.500000      0           0.0           0.0      1
5       1935   39.680000   157.700000  183.200000      0           0.0           0.0      1
6       1935   20.360001   197.000000    6.500000      0           0.0           0.0      1
7       1935   24.430000   138.000000  100.200000      0           0.0           0.0      1
8       1935   12.930000   191.500000    1.800000      0           0.0           0.0      1
9       1935   26.629999   290.600010  162.000000      0           0.0           0.0      1
10      1935    2.540000    70.910004    4.500000      0           0.0           0.0      1

In linearmodels package, we will get:

# est = FamaMacBeth(d['invest'], d[['const', 'mvalue', 'kstock', 'Dummy', 'Dummy*mvalue', 'Dummy*kstock']]).fit(cov_type='kernel', kernel='bartlett', bandwidth=5)
# print(est.all_params.iloc[[0], :])
         const    mvalue    kstock       Dummy  Dummy*mvalue  Dummy*kstock
year
1935        NaN       NaN       NaN         NaN           NaN           NaN

But in Stata/SE 15.1, we will get:

# xtset company year
# asreg invest mvalue kstock dummy dummymvalue dummykstock , fmb newey(5) save(~/Downloads/coff_stata)
_b_mvalue	_b_kstock	_b_dummy	_b_dummymvalue	_b_dummykstock	_Cons	_R2	_adjR2	_TimeVar	_obs
.10249786	-.00199479	0	0	0	.3560334	.865262	.7574716	1935	10

The result from Stata is the same as the result directly using np.linalg.lstsq:

  const    mvalue    kstock  Dummy  Dummy*mvalue  Dummy*kstock
year
1935  0.356033  0.102498 -0.001995    0.0           0.0           0.0

So I think the regression for those groups with non-full rank can still be estimated, instead of getting NaN.

The logic of the judgment in the Stata software seems to be to select a certain variable for regression among all collinear variables, and all coefficients of the others are set to 0. I find that the judgment priority may be as follows:

  1. Non-zero normal variable;
  2. Constant term;
  3. the coefficients of the variables wtih all 0 value are naturally set to 0.

Similar issue #176

The data set I use is available below.
grunfeld.csv.zip

主要语言
Python
星标
1.1k
派生
203
平均合并
3 小时 26 分钟
30 天内合并 PR
115

环境准备

这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

bashtage/linearmodels 的其他 Issue

查看 bashtage/linearmodels 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。