appleLover
appleLover

Reputation: 15691

Regression in Python

Trying to do logistic regression through pandas and statsmodels. Don't know why I'm getting an error or how to fix it.

import pandas as pd
import statsmodels.api as sm
x = [1, 3, 5, 6, 8]
y = [0, 1, 0, 1, 1]
d = { "x": pd.Series(x), "y": pd.Series(y)}
df = pd.DataFrame(d)

model = "y ~ x"
glm = sm.Logit(model, df=df).fit()

ERROR:

Traceback (most recent call last):
  File "regress.py", line 45, in <module>
    glm = sm.Logit(model, df=df).fit()
TypeError: __init__() takes exactly 3 arguments (2 given)

Upvotes: 1

Views: 8889

Answers (2)

Ana clarice Silva
Ana clarice Silva

Reputation: 11

You can pass a formula directly in Logit too.

Logit.from_formula('y ~ x',data=data).fit()

Upvotes: 0

Phillip Cloud
Phillip Cloud

Reputation: 25692

You can't pass a formula to Logit. Do:

In [82]: import patsy

In [83]: f = 'y ~ x'

In [84]: y, X = patsy.dmatrices(f, df, return_type='dataframe')

In [85]: sm.Logit(y, X).fit().summary()
Optimization terminated successfully.
         Current function value: 0.511631
         Iterations 6
Out[85]:
<class 'statsmodels.iolib.summary.Summary'>
"""
                           Logit Regression Results
==============================================================================
Dep. Variable:                      y   No. Observations:                    5
Model:                          Logit   Df Residuals:                        3
Method:                           MLE   Df Model:                            1
Date:                Fri, 30 Aug 2013   Pseudo R-squ.:                  0.2398
Time:                        16:56:38   Log-Likelihood:                -2.5582
converged:                       True   LL-Null:                       -3.3651
                                        LLR p-value:                    0.2040
==============================================================================
                 coef    std err          z      P>|z|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
Intercept     -2.0544      2.452     -0.838      0.402        -6.861     2.752
x              0.5672      0.528      1.073      0.283        -0.468     1.603
==============================================================================
"""

This is pretty much straight from the docs on how to do exactly what you're asking.

EDIT: You can also use the formula API, as suggested by @user333700:

In [22]: print sm.formula.logit(model, data=df).fit().summary()
Optimization terminated successfully.
         Current function value: 0.511631
         Iterations 6
                           Logit Regression Results
==============================================================================
Dep. Variable:                      y   No. Observations:                    5
Model:                          Logit   Df Residuals:                        3
Method:                           MLE   Df Model:                            1
Date:                Fri, 30 Aug 2013   Pseudo R-squ.:                  0.2398
Time:                        18:14:26   Log-Likelihood:                -2.5582
converged:                       True   LL-Null:                       -3.3651
                                        LLR p-value:                    0.2040
==============================================================================
                 coef    std err          z      P>|z|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
Intercept     -2.0544      2.452     -0.838      0.402        -6.861     2.752
x              0.5672      0.528      1.073      0.283        -0.468     1.603
==============================================================================

Upvotes: 9

Related Questions