Не можете добавить y-перехват в линейную модель? - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь построить модель множественной линейной регрессии, используя statsmodels. Я хочу, чтобы модель включала константу, но она не добавляется должным образом. Я использовал другой, меньший набор данных, и он работал, мой текущий не будет. Мой текущий набор данных составляет около 1000 наблюдений х 2000 переменных.

# Multiple Linear Regression

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import statsmodels.api as sm

# Importing the dataset, y value is last column, other columns are X
dataset = pd.read_excel('sheet.xlsx')
X = dataset.iloc[:, :-1]
y = dataset.iloc[:, -1]

#Stats
X2 = sm.add_constant(X)
test = sm.OLS(y, X2)
test2 = test.fit()
print(test2.summary())

Мой вывод выглядит так:

/home/chasel88/.local/lib/python3.7/site-packages/statsmodels/regression/linear_model.py:1648: RuntimeWarning: divide by zero encountered in true_divide
  return 1 - (np.divide(self.nobs - self.k_constant, self.df_resid)
/home/chasel88/.local/lib/python3.7/site-packages/statsmodels/regression/linear_model.py:1649: RuntimeWarning: invalid value encountered in double_scalars
  * (1 - self.rsquared))
/home/chasel88/.local/lib/python3.7/site-packages/statsmodels/regression/linear_model.py:1665: RuntimeWarning: divide by zero encountered in double_scalars
  return self.ssr/self.df_resid
/home/chasel88/.local/lib/python3.7/site-packages/statsmodels/regression/linear_model.py:1578: RuntimeWarning: divide by zero encountered in double_scalars
  return np.dot(wresid, wresid) / self.df_resid
                            OLS Regression Results                            
==============================================================================
Dep. Variable:            Reverse Log   R-squared:                       1.000
Model:                            OLS   Adj. R-squared:                    nan
Method:                 Least Squares   F-statistic:                     0.000
Date:                 Di, 09 Jul 2019   Prob (F-statistic):                nan
Time:                        16:36:58   Log-Likelihood:                 31546.
No. Observations:                1097   AIC:                        -6.090e+04
Df Residuals:                       0   BIC:                        -5.541e+04
Df Model:                        1096                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Measurement1      2.1712        inf          0        nan         nan         nan
Measurement2    -0.1254        inf         -0        nan         nan         nan
Measurement3     -1.0199        inf         -0        nan         nan         nan
Measurement4      2.4232        inf          0        nan         nan         nan
Measurement5      0.7925        inf          0        nan         nan         nan
Measurement6     -0.6553        inf         -0        nan         nan         nan

Он не показывает y-перехват, но когда я запускаю эти данные в sklearn, я получаю перехват. Я только пытаюсь использовать statsmodels, чтобы я мог получить значения p для моих коэффициентов. В дополнение к отсутствующему перехвату везде написано «nan», и оно говорит, что есть ошибки деления на ноль. Кто-нибудь знает в чем проблема?

1 Ответ

1 голос
/ 09 июля 2019

Было бы очень полезно предоставить mcve с вашими sklearn и statsmodels регрессиями.

Если отбросить преимущества запуска регрессии с 2000 переменными, кажется, чтоВаши входные данные могут содержать столбец констант.Страница справки для sm.add_constant() сообщает:

has_constant : str {'raise', 'add', 'skip'}
    Behavior if ``data`` already has a constant. The default will return
    data without adding another constant. If 'raise', will raise an
    error if a constant is present. Using 'add' will duplicate the
    constant, if one is present.

Нормальное поведение

np.random.seed(42)
df = pd.DataFrame({'x1':np.random.rand(20) // .1,
                  'x2':np.random.rand(20) // .01,
                  'x3':np.random.rand(20) // .01,
                  'y':np.random.rand(20) // .01})

X = df.iloc[:, :-1]
y = df.iloc[:, -1]

X2 = sm.add_constant(X)
model = sm.OLS(y, X2).fit()
print(model.summary())

возвращает

const         23.7669     24.751      0.960      0.351     -28.702      76.236
x1             1.1993      2.943      0.408      0.689      -5.039       7.438
x2             0.4973      0.327      1.523      0.147      -0.195       1.190
x3            -0.1122      0.231     -0.486      0.634      -0.602       0.377

Константа уже в наборе данных

Если в наборе данных уже есть постоянный член, sm.add_constant() выполняется, не возвращает сообщения и не добавляет константу.В приведенном ниже примере константой является значение, отличное от 1, поэтому параметр для k на выходе регрессии отличается от приведенного выше нормального случая.

np.random.seed(42)
df = pd.DataFrame({'x1':np.random.rand(20) // .1,
                  'x2':np.random.rand(20) // .01,
                  'x3':np.random.rand(20) // .01,
                  'k':list([15])*20,
                  'y':np.random.rand(20) // .01})

X = df.iloc[:, :-1]
y = df.iloc[:, -1]

X2 = sm.add_constant(X)
model = sm.OLS(y, X2).fit()
print(model.summary())

возвращает

                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
x1             1.1993      2.943      0.408      0.689      -5.039       7.438
x2             0.4973      0.327      1.523      0.147      -0.195       1.190
x3            -0.1122      0.231     -0.486      0.634      -0.602       0.377
k              1.5845      1.650      0.960      0.351      -1.913       5.082
...