Проблема надежности статистической модели Линейная регрессия (OLS) — Python

Я тестировал базовую регрессию категорий, используя модель статистики: я строю детерминированную модель.

Y = X + Z

где X может принимать 3 значения (a, b или c), а Z только 2 (d или e). На этом этапе модель является чисто детерминированной, я устанавливаю веса для каждой переменной следующим образом.

вес = 1

вес б = 2

вес с=3

вес d=1

вес е=2

Следовательно, если 1(X=a) равно 1, если X=a, и 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, а не самим 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.

person cpeusteuche    schedule 16.09.2015    source источник
comment
Можете ли вы также опубликовать код Excel или R? Я ожидаю, что проблема мультиколлинеарности должна возникать: если у вас есть переменная, которая может принимать N различных категориальных значений, она должна быть представлена ​​фиктивными столбцами N-1, < i>не N фиктивных столбцов, потому что, учитывая первые N-1 столбцов, N-й столбец полностью определен. Например, ваша переменная Z полностью определяется одним фиктивным столбцом. Я удивлен, что другие инструменты регрессии дают стабильные результаты.   -  person ely    schedule 16.09.2015
comment
хороший пример, я никогда не видел такого случая. Я предполагаю, что вы просто достигаете порога для обобщенного обратного, numpy.pinv. В первом случае решение представляет собой пониженный ранг с df_model, равным 3. Во втором случае числового шума достаточно, чтобы ранг идентифицировался с df_model, равным 4. Это может быть аргументом в пользу снижения порога pinv по сравнению со значением по умолчанию numpy. ценность. R может давать более стабильные, хотя и столь же неопознанные результаты, потому что по умолчанию он использует поворотную QR-декомпозицию, насколько мне известно. Стата сбрасывает идеально коллинеарные столбцы.   -  person Josef    schedule 16.09.2015
comment
Это все еще немного удивительно. Каков тип ваших данных, то есть mod.exog.dtype?   -  person Josef    schedule 16.09.2015
comment
dtype для меня - это float64 с неудачным примером. Порог для pinv слишком низкий, np.linalg.pinv(mod.exog, rcond=1.5e-15).dot(mod.endog) вместо 1e-15 по умолчанию исправит его для случайного случая, который я получил. Но, как указано в предупреждении и как указал г-н Ф., полагаться на вопросы точности в единичных или почти единичных случаях небезопасно.   -  person Josef    schedule 16.09.2015
comment
@Г-н. F: Для Excel я просто использую linest, а для R код просто использует myreg <- lm( y ~ a + b + c + d + e, data = data). В R он распознал наличие коллинеарности и избавился от N-й фиктивной переменной (выход R для параметра наклона reg равен a=2, b=1, c=NA, d=1, e=NA).   -  person cpeusteuche    schedule 17.09.2015


Ответы (1)


Похоже, что, как упомянул г-н Ф., основная проблема заключается в том, что статистическая модель OLS, по-видимому, не обрабатывает коллинеарность pb так же, как Excel/R в этом случае, но если вместо определения одной переменной для каждого a, b, c, d and e, определить переменная X и одна Z, которая может быть равна a, b or c и 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)

приводит к ожидаемым результатам

                           OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       1.000
Model:                            OLS   Adj. R-squared:                  1.000
Method:                 Least Squares   F-statistic:                 2.684e+27
Date:                Thu, 17 Sep 2015   Prob (F-statistic):               0.00
Time:                        06:22:43   Log-Likelihood:             2.5096e+06
No. Observations:              100000   AIC:                        -5.019e+06
Df Residuals:                   99996   BIC:                        -5.019e+06
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
X[a]           5.0000   1.85e-14    2.7e+14      0.000         5.000     5.000
X[b]           6.0000   1.62e-14   3.71e+14      0.000         6.000     6.000
X[c]           7.0000   2.31e-14   3.04e+14      0.000         7.000     7.000
Z[T.e]         1.0000   1.97e-14   5.08e+13      0.000         1.000     1.000
==============================================================================
Omnibus:                      145.367   Durbin-Watson:                   1.353
Prob(Omnibus):                  0.000   Jarque-Bera (JB):             9729.487
Skew:                          -0.094   Prob(JB):                         0.00
Kurtosis:                       1.483   Cond. No.                         2.29
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
person cpeusteuche    schedule 17.09.2015