ols python r pandas rpy2 statsmodels

Diferencia en los modelos de estadísticas de Python OLS y R''s lm



ols in python statsmodels (2)

No estoy seguro de por qué obtengo resultados ligeramente diferentes para un OLS simple, dependiendo de si utilizo la interfaz rpy experimental de panda para realizar la regresión en R o si uso statsmodels en Python.

import pandas from rpy2.robjects import r from functools import partial loadcsv = partial(pandas.DataFrame.from_csv, index_col="seqn", parse_dates=False) demoq = loadcsv("csv/DEMO.csv") rxq = loadcsv("csv/quest/RXQ_RX.csv") num_rx = {} for seqn, num in rxq.rxd295.iteritems(): try: val = int(num) except ValueError: val = 0 num_rx[seqn] = val series = pandas.Series(num_rx, name="num_rx") demoq = demoq.join(series) import pandas.rpy.common as com df = com.convert_to_r_dataframe(demoq) r.assign("demoq", df) r(''lmout <- lm(demoq$num_rx ~ demoq$ridageyr)'') # run the regression r(''print(summary(lmout))'') # print from R

De R , obtengo el siguiente resumen:

Call: lm(formula = demoq$num_rx ~ demoq$ridageyr) Residuals: Min 1Q Median 3Q Max -2.9086 -0.6908 -0.2940 0.1358 15.7003 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -0.1358216 0.0241399 -5.626 1.89e-08 *** demoq$ridageyr 0.0358161 0.0006232 57.469 < 2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 1.545 on 9963 degrees of freedom Multiple R-squared: 0.249, Adjusted R-squared: 0.2489 F-statistic: 3303 on 1 and 9963 DF, p-value: < 2.2e-16

Usando statsmodels.api para hacer el OLS:

import statsmodels.api as sm results = sm.OLS(demoq.num_rx, demoq.ridageyr).fit() results.summary()

Los resultados son similares a la salida de R pero no son los mismos:

OLS Regression Results Adj. R-squared: 0.247 Log-Likelihood: -18488. No. Observations: 9965 AIC: 3.698e+04 Df Residuals: 9964 BIC: 3.698e+04 coef std err t P>|t| [95.0% Conf. Int.] ridageyr 0.0331 0.000 82.787 0.000 0.032 0.034

El proceso de instalación es un poco engorroso. Pero, hay un cuaderno de ipython here , que puede reproducir la inconsistencia.


Parece que Python no agrega una intercepción de forma predeterminada a tu expresión, mientras que R lo hace cuando usas la interfaz de fórmula ...

Esto significa que encajaste en dos modelos diferentes. Tratar

lm( y ~ x - 1, data)

en R para excluir la intercepción, o en su caso y con una notación algo más estándar

lm(num_rx ~ ridageyr - 1, data=demoq)


Tenga en cuenta que todavía puede usar statsmodels.formula.api desde statsmodels.formula.api :

from statsmodels.formula.api import ols results = ols(''num_rx ~ ridageyr'', demoq).fit() results.summary()

Creo que usa patsy en el backend para traducir la expresión de fórmula, y la intercepción se agrega automáticamente.