gpt4 book ai didi

python - Statsmodels:计算拟合值和 R 平方

转载 作者:太空狗 更新时间:2023-10-29 20:56:11 25 4
gpt4 key购买 nike

我正在按如下方式运行回归(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 的均值。因此,简化模型中无法解释的变化是未居中的总平方和。

这已记录在案 herersquared 项下。将 yBar 设置为零,我希望您会得到相同的数字。

关于python - Statsmodels:计算拟合值和 R 平方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24851787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com