Статистические модели: расчет подогнанных значений и R в квадрате

Я выполняю регрессию следующим образом (df - это кадр данных pandas):

import statsmodels.api as sm
est = sm.OLS(df['p'], df[['e', 'varA', 'meanM', 'varM', 'covAM']]).fit()
est.summary()

Что дало мне, среди прочего, R-квадрат 0.942. Итак, я хотел построить исходные 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

Я делаю что-то неправильно? Или есть причина, по которой мои вычисления так далеки от того, что получают статистические модели? SSTot, SSReg имеют значения 48084, 35495.


person FooBar    schedule 20.07.2014    source источник


Ответы (2)


Если вы не включаете перехват (постоянную независимую переменную) в свою модель, 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 равным нулю, и я ожидаю, что вы получите то же число.

person behzad.nouri    schedule 20.07.2014
comment
В некоторых случаях OLS использует центрированную модель, я не понимаю, почему. Не сказал, что по центру. Вы можете проверить ссылку. - person Nurislom Rakhmatullaev; 18.02.2021

Если ваша модель:

a = <yourmodel>.fit()

Затем, чтобы вычислить подходящие значения:

a.fittedvalues

и вычислить R в квадрате:

a.rsquared
person Roy Martinez    schedule 28.03.2021