2017-08-12 24 views
0

我已經看到這個問題出現在我的編碼幾次,現在statsmodels計算的「Df模型」小於該模型擬合的參數的數量。爲什麼statsmodels「Df Model」少於模型參數的數量?

據我所知,無論我適合哪種模型和(我相信)僅在具有不小(>〜20?)數量的參數的情況下才會發生。這可能與參數之間的高度多重共線性有關嗎?

由於這個問題似乎與大量的參數(與'真實'的數據)出現,我不確定我可以重新創建一些虛擬數據來展示這個問題。我只是希望有人看到它,並知道它爲什麼會發生。

無論如何,我的代碼示例(&輸出爲註釋)如下所示。

print type(base_features) #<type 'list'> 
print len(base_features) #70 

model = sm.GLM(train1['target'], train1[base_features], family=Poisson()) 
#^ produces the same results for other glm family models as well as standard OLS 
poi_base = model.fit() 

print len(poi_base.params) #70 
print poi_base.df_model #63 

請注意,是用戶構建攔截/在「base_features」不變,但即使statsmodels是能夠分辨,df_model仍然應該是69最小。

回答

1

通常,df_model取決於設計矩陣的等級,並且不考慮常數。等級由numpy中使用的閾值定義,取決於條件編號。

線性模型考慮了是否明確或隱含地檢測到exog之間的常量。其他模型,如離散和GLM模型,假設總是有一個常數。 (在線性模型中,rsquared的定義取決於常數的存在性,在其他模型中,llnull是具有常數的模型的對數似然性,而不檢查原始模型是否包含常數。)

在線性模型,OLS,WLS和類似

self._df_model = float(self.rank - self.k_constant) 

在GLM

self.df_model = np_matrix_rank(self.exog) - 1 

在離散模型,對數,概率,泊松和類似

self.df_model = float(np_matrix_rank(self.exog) - 1) 

(在github上有一些關於各種df_modeldf_resid的定義的開放性問題,主要用於處理常量。對於懲罰性估計器,df_model和df_resid應該基於有效自由度,但可能還沒有一貫實現。)

另外:基於線性模型的估計量包括通過迭代重新加權最小二乘估計的估計量,默認情況下基於即使設計矩陣是秩虧的,也可以產生一個估計的廣義逆。所有其他模型都會在優化中突破,並以單一設計矩陣引發異常。

相關問題