簡體   English   中英

Statsmodels:計算擬合值和 R 平方

[英]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 得到的結果相差甚遠有什么原因嗎? SSTotSSReg值為4808435495

如果您的模型中不包含截距(恆定解釋變量),則 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM