Numpy 从数组方法中获得与Summary不同的峰度

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。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程