![](/img/trans.png)
[英]How to calculate a prediction interval for a fitted statsmodels OLS model?
[英]Statsmodels: Calculate fitted values and R squared
我正在運行如下回歸( df
是一個pandas
數據框):
import statsmodels.api as sm
est = sm.OLS(df['p'], df[['e', 'varA', 'meanM', 'varM', 'covAM']]).fit()
est.summary()
這給了我,其中包括0.942
的 R 平方。 所以我想繪制原始y-values
和擬合值。 為此,我對原始值進行了排序:
orig = df['p'].values
fitted = est.fittedvalues.values
args = np.argsort(orig)
import matplotlib.pyplot as plt
plt.plot(orig[args], 'bo')
plt.plot(orig[args]-resid[args], 'ro')
plt.show()
然而,這給了我一個圖表,其中的值完全關閉。 沒有任何跡象表明 R 平方為0.9
。 因此,我嘗試自己手動計算:
yBar = df['p'].mean()
SSTot = df['p'].apply(lambda x: (x-yBar)**2).sum()
SSReg = ((est.fittedvalues - yBar)**2).sum()
1 - SSReg/SSTot
Out[79]: 0.2618159806908984
難道我做錯了什么? 或者我的計算與 statsmodels 得到的結果相差甚遠有什么原因嗎? SSTot
、 SSReg
值為48084
、 35495
。
如果您的模型中不包含截距(恆定解釋變量),則 statsmodels 將根據非中心總平方和計算 R 平方,即。
tss = (ys ** 2).sum() # un-centred total sum of squares
與
tss = ((ys - ys.mean())**2).sum() # centred total sum of squares
因此,R 平方會高得多。
這在數學上是正確的。 因為,R 平方應該表明完整模型與簡化模型相比解釋了多少變化。 如果您將模型定義為:
ys = beta1 . xs + beta0 + noise
那么簡化模型可以是: ys = beta0 + noise
,其中beta0
的估計值是樣本平均值,因此我們有: noise = ys - ys.mean()
。 這就是在具有截距的模型中去意義的地方。
但是從這樣的模型:
ys = beta . xs + noise
你只能減少到: ys = noise
。 由於假設noise
為零均值,因此您可能不會降低ys
的均值。 因此,簡化模型中無法解釋的變化是未居中的總平方和。
這在此處記錄在rsquared
項下。 將yBar
設置為零,我希望您會得到相同的數字。
如果您的模型是:
a = <yourmodel>.fit()
然后,計算擬合值:
a.fittedvalues
並計算 R 平方:
a.rsquared
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.