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

问题描述 投票:0回答:1

我必须从 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)。

numpy scipy statistics linear-regression statsmodels
1个回答
3
投票

这似乎是皮尔逊峰度和费舍尔(或超额)峰度之间的差异。根据维基百科

通常的做法是使用过度峰度,其定义为 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。

© www.soinside.com 2019 - 2024. All rights reserved.