Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

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

オープン
#258 コメント 3 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
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分
マージ済み PR(30日)
115

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

bashtage/linearmodels のほかの issue

bashtage/linearmodels の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。