Numpy 从数组方法中获得与Summary不同的峰度
问题描述
我正在构建一个项目,需要从OLS statsmodel summary中提取信息。在进行此操作时,从summary中获得的峰度结果与数组方法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)。
解决方案
这似乎是皮尔逊峰度和费舍尔(或超额)峰度之间的区别。根据维基百科:
通常使用超额峰度,其定义为皮尔逊峰度减去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
,因为它允许你明确选择想要的峰度定义。
Panda的函数 res.resid.kurtosis()
计算的是Fisher峰度,但似乎使用了不同的实现,因此得到的值稍有不同。 我会相信Scipy。