2016-08-13 9 views
1

Pythonでstatsmodelsを使用した私の回帰モデルは、48,065行のデータで動作しますが、新しいデータを追加している間に、特異行列エラーを生成する1行のコードを追跡しました。同様の質問への回答は欠落しているデータを示唆しているようですが、私はチェックして、エラーの起こりやすいコード行から目に見えない不規則なものは何もなく、重大な問題を引き起こします。誰もがこれが私のコードのエラーであるかどうかを知っているのですか、アイデアが足りなくなってから解決する解決策を知っていますか?mnlogit回帰、特異行列エラー

Data2.csv - エラーを生成http://www.sharecsv.com/s/8ff31545056b8864f2ad26ef2fe38a09/Data2.csv

import pandas as pd 
import statsmodels.formula.api as smf 

data = pd.read_csv("Data2.csv") 
formula = 'is_success ~ goal_angle + goal_distance + np_distance + fp_distance + is_fast_attack + is_header + prev_tb + is_rebound + is_penalty + prev_cross + is_tb2 + is_own_goal + is_cutback + asst_dist' 
model = smf.mnlogit(formula, data=data, missing='drop').fit() 

CSV行目:モデル内の問題の行と0,0,0,0,0,0,0,1,22.94476,16.877204,13.484806,20.924627,0,0,11.765203

エラー:私の知る限り見ることができるように

runfile('C:/Users/User1/Desktop/Model Check.py', wdir='C:/Users/User1/Desktop') 
Optimization terminated successfully. 
     Current function value: 0.264334 
     Iterations 20 
Traceback (most recent call last): 

    File "<ipython-input-76-eace3b458e24>", line 1, in <module> 
    runfile('C:/Users/User1/Desktop/xG_xA Model Check.py', wdir='C:/Users/User1/Desktop') 

    File "C:\Users\User1\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 714, in runfile 
    execfile(filename, namespace) 

    File "C:\Users\User1\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 74, in execfile 
    exec(compile(scripttext, filename, 'exec'), glob, loc) 

    File "C:/Users/User1/Desktop/xG_xA Model Check.py", line 6, in <module> 
    model = smf.mnlogit(formula, data=data, missing='drop').fit() 

    File "C:\Users\User1\Anaconda2\lib\site-packages\statsmodels\discrete\discrete_model.py", line 587, in fit 
    disp=disp, callback=callback, **kwargs) 

    File "C:\Users\User1\Anaconda2\lib\site-packages\statsmodels\base\model.py", line 434, in fit 
    Hinv = np.linalg.inv(-retvals['Hessian'])/nobs 

    File "C:\Users\User1\Anaconda2\lib\site-packages\numpy\linalg\linalg.py", line 526, in inv 
    ainv = _umath_linalg.inv(a, signature=signature, extobj=extobj) 

    File "C:\Users\User1\Anaconda2\lib\site-packages\numpy\linalg\linalg.py", line 90, in _raise_linalgerror_singular 
    raise LinAlgError("Singular matrix") 

LinAlgError: Singular matrix 

答えて

0

問題は変数ですこれは1であるすべての観測値も従属変数is_successが1に等しいためです。つまり、is_own_goalは既に成功であると指定しているため、結果に変化はありません。

したがって、is_own_goalの係数を推定することはできません。その係数はデータによって識別されません。係数の分散は無限大であり、ヘッセ行列は特異であるため、パラメータ推定値の共分散を得るためにヘッセ行列を逆転させる。 浮動小数点精度が与えられ、計算上のノイズがあると、ヘッセ行列は可逆であり、特異行列例外は表示されません。私が推測しているのは、それが一部の観測ではなく、すべての観測では機能しない理由です。

BTW:従属変数endogがバイナリの場合、MNLogitは特殊なケースとして扱いますが、Logitはより適切です。

BTW:係数がデータによってまだ識別されず、罰則の結果であるにもかかわらず、罰則を課された推定は、単数のケースでも推定を強制する別の方法です。この例では

、私の作品

mod = smf.logit(formula, data=data, missing='drop').fit_regularized()

。これはL1のペナルティです。また、統計モデル0.8では、二項(すなわちLogit)をファミリとするGLMの弾性ネットペナルティがある。

+0

詳細を追跡するためにhttps://github.com/statsmodels/statsmodels/issues/issues/3156をオープンしました。これらのケースを特定するために、統計モデルにいくつかの機能を追加することをうれしく思います。 – user333700

関連する問題