statsmodel的稳健性问题线性回归(ols) - Python

时间:2015-09-16 03:13:57

标签: python statsmodels

我正在使用Stats模型测试一些基本的类别回归: 我建立了一个确定性模型

  

Y = X + Z

其中X可以取3个值(a,b或c),Z只取2个(d或e)。 在那个阶段,模型纯粹是确定性的,我设置了每个变量的权重,如下所示

  

a的重量= 1

     

b的重量= 2

     

c的重量= 3

     

d's weight = 1

     

e的重量= 2

因此,如果X = a,则1(X = a)为1,否则为0,模型就是:

  

Y = 1(X = a)+ 2 * 1(X = b)+ 3 * 1(X = c)+ 1(Z = d)+ 2 * 1(Z = e)

使用以下代码生成不同的变量并运行回归

from statsmodels.formula.api import ols
nbData = 1000
rand1 = np.random.uniform(size=nbData)
rand2 = np.random.uniform(size=nbData)
a = 1 * (rand1 <= (1.0/3.0))
b = 1 * (((1.0/3.0)< rand1) & (rand1< (4/5.0)))
c = 1-b-a
d = 1 * (rand2 <= (3.0/5.0))
e = 1-d
weigths = [1,2,3,1,2]
y = a+2*b+3*c+4*d+5*e
df = pd.DataFrame({'y':y, 'a':a, 'b':b, 'c':c, 'd':d, 'e':e})

mod = ols(formula='y ~ a + b + c + d + e - 1', data=df)
res = mod.fit()
print(res.summary())

我最终获得了权利结果(一个人必须看看coef而不是系数之间的差异)

                           OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       1.000
Model:                            OLS   Adj. R-squared:                  1.000
Method:                 Least Squares   F-statistic:                 1.006e+30
Date:                Wed, 16 Sep 2015   Prob (F-statistic):               0.00
Time:                        03:05:40   Log-Likelihood:                 3156.8
No. Observations:                 100   AIC:                            -6306.
Df Residuals:                      96   BIC:                            -6295.
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
a              1.6000   7.47e-16   2.14e+15      0.000         1.600     1.600
b              2.6000   6.11e-16   4.25e+15      0.000         2.600     2.600
c              3.6000   9.61e-16   3.74e+15      0.000         3.600     3.600
d              3.4000   5.21e-16   6.52e+15      0.000         3.400     3.400
e              4.4000   6.85e-16   6.42e+15      0.000         4.400     4.400
==============================================================================
Omnibus:                       11.299   Durbin-Watson:                   0.833
Prob(Omnibus):                  0.004   Jarque-Bera (JB):                5.720
Skew:                          -0.381   Prob(JB):                       0.0573
Kurtosis:                       2.110   Cond. No.                     2.46e+15
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The smallest eigenvalue is 1.67e-29. This might indicate that there are
strong multicollinearity problems or that the design matrix is singular.

但是当我将数据点数增加到(例如)600时,回归产生了非常糟糕的结果。我在Excel和R中尝试过类似的回归,无论数据点数多少,它们都能产生一致的结果。有谁知道对statsmodel ols有什么限制来解释这种行为,还是我错过了什么?

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.167
Model:                            OLS   Adj. R-squared:                  0.161
Method:                 Least Squares   F-statistic:                     29.83
Date:                Wed, 16 Sep 2015   Prob (F-statistic):           1.23e-22
Time:                        03:08:04   Log-Likelihood:                -701.02
No. Observations:                 600   AIC:                             1412.
Df Residuals:                     595   BIC:                             1434.
Df Model:                           4                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
a              5.8070   1.15e+13   5.05e-13      1.000     -2.26e+13  2.26e+13
b              6.4951   1.15e+13   5.65e-13      1.000     -2.26e+13  2.26e+13
c              6.9033   1.15e+13   6.01e-13      1.000     -2.26e+13  2.26e+13
d             -1.1927   1.15e+13  -1.04e-13      1.000     -2.26e+13  2.26e+13
e             -0.1685   1.15e+13  -1.47e-14      1.000     -2.26e+13  2.26e+13
==============================================================================
Omnibus:                       67.153   Durbin-Watson:                   0.328
Prob(Omnibus):                  0.000   Jarque-Bera (JB):               70.964
Skew:                           0.791   Prob(JB):                     3.89e-16
Kurtosis:                       2.419   Cond. No.                     7.70e+14
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The smallest eigenvalue is 9.25e-28. This might indicate that there are
strong multicollinearity problems or that the design matrix is singular.

1 个答案:

答案 0 :(得分:2)

如F先生所提到的那样,主要问题是statsmodel OLS在这种情况下似乎并不处理共线性pb和Excel / R,而是为每个{{而不是为每个{{定义一个变量1}},一个定义变量a, b, c, d and e和一个X,它可以等于Za, b or c resp,然后回归工作正常。即用以下代码更新代码:

d or e

导致预期结果

df['X'] = ['c']*len(df)
df.X[df.b!=0] = 'b'
df.X[df.a!=0] = 'a'
df['Z'] = ['e']*len(df)
df.Z[df.d!=0] = 'd'
mod = ols(formula='y ~ X + Z - 1', data=df)