我必须从 OLS statsmodel 摘要中提取信息。这样做时,汇总的峰度结果与数组方法不同
kurtosis()
。
这是代码:
from sklearn.datasets import load_diabetes
import pandas as pd
import statsmodels.api as sm
dic = load_diabetes()
df = pd.DataFrame(data=dic.data, columns=dic.feature_names)
y = dic.target
# %%
X = sm.add_constant(df)
model = sm.OLS(y, X)
res = model.fit()
print(res.summary2())
print(f'\n\nKurtosis by Array Method: {res.resid.kurtosis():.3f}')
输出:
"""
Results: Ordinary least squares
==================================================================
Model: OLS Adj. R-squared: 0.507
Dependent Variable: y AIC: 4793.9857
Date: 2023-10-20 16:26 BIC: 4838.9901
No. Observations: 442 Log-Likelihood: -2386.0
Df Model: 10 F-statistic: 46.27
Df Residuals: 431 Prob (F-statistic): 3.83e-62
R-squared: 0.518 Scale: 2932.7
-------------------------------------------------------------------
Coef. Std.Err. t P>|t| [0.025 0.975]
-------------------------------------------------------------------
const 152.1335 2.5759 59.0614 0.0000 147.0707 157.1963
age -10.0099 59.7492 -0.1675 0.8670 -127.4460 107.4263
sex -239.8156 61.2223 -3.9171 0.0001 -360.1471 -119.4841
bmi 519.8459 66.5334 7.8133 0.0000 389.0755 650.6163
bp 324.3846 65.4220 4.9583 0.0000 195.7988 452.9705
s1 -792.1756 416.6799 -1.9012 0.0579 -1611.1530 26.8017
s2 476.7390 339.0305 1.4062 0.1604 -189.6198 1143.0978
s3 101.0433 212.5315 0.4754 0.6347 -316.6838 518.7703
s4 177.0632 161.4758 1.0965 0.2735 -140.3147 494.4412
s5 751.2737 171.9000 4.3704 0.0000 413.4072 1089.1402
s6 67.6267 65.9843 1.0249 0.3060 -62.0643 197.3177
------------------------------------------------------------------
Omnibus: 1.506 Durbin-Watson: 2.029
Prob(Omnibus): 0.471 Jarque-Bera (JB): 1.404
Skew: 0.017 Prob(JB): 0.496
Kurtosis: 2.726 Condition No.: 227
==================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the
errors is correctly specified.
Kurtosis by Array Method: -0.264
Skewness by Array Method: 0.017
"""
我想知道哪一个结果更可靠,如果我必须使用汇总结果,如何提取它。我还通过数组方法打印偏度,以查看我的方法是否正确或者我是否做错了什么。
我尝试使用 scipy stats 函数,但结果类似但不等于数组方法(-0.274)。
这似乎是皮尔逊峰度和费舍尔(或超额)峰度之间的差异。根据维基百科:
通常的做法是使用过度峰度,其定义为 Pearson 峰度负 3,提供与 正态分布。
当您从摘要中的峰度值中减去 3 时,您将获得与
scipy.stats.kurtosis
相同的值。
事实上,函数scipy.stats.kurtosis
有一个选项fisher
,默认为True
,但可以设置为False
以获得与摘要中相同的结果:
from scipy.stats import kurtosis
kurtosis(res.resid) # gives -0.2740841793704205
kurtosis(res.resid, fisher=False) # gives +2.7259158206295795
所以,我的建议是使用
scipy.stats.kurtosis
,因为它可以让您明确选择您想要的峰度定义。
pandas 函数 res.resid.kurtosis()
计算 Fisher 峰度,但似乎使用不同的实现,因此给出的值略有不同。 我会信任 Scipy。