Python statsols模型和R';s lm

Python statsols模型和R';s lm,python,r,pandas,rpy2,statsmodels,Python,R,Pandas,Rpy2,Statsmodels,我不确定为什么对于一个简单的OLS,结果会略有不同,这取决于我是在R中进行回归,还是在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/D

我不确定为什么对于一个简单的OLS,结果会略有不同,这取决于我是在
R
中进行回归,还是在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
使用
statsmodels.api
执行OLS:

import statsmodels.api as sm
results = sm.OLS(demoq.num_rx, demoq.ridageyr).fit()
results.summary()
结果与R的输出类似,但不相同:

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

安装过程有点麻烦。但是,有一个ipython笔记本可以重现不一致性。

看起来Python在默认情况下不会向表达式添加截取,而R在使用公式接口时会添加截取

这意味着您确实适合两种不同的型号。试一试

lm( y ~ x - 1, data)
在R中排除截距,或者在您的情况下,使用更标准的符号

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

请注意,您仍然可以从
statsmodels.formula.api
使用
ols

from statsmodels.formula.api import ols

results = ols('num_rx ~ ridageyr', demoq).fit()
results.summary()

我认为它在后端使用了
patsy
来翻译公式表达式,并自动添加了intercept。

根据需要提出文档错误?文档已用措辞更新:除非使用公式,否则模型不会添加常量。
from statsmodels.formula.api import ols

results = ols('num_rx ~ ridageyr', demoq).fit()
results.summary()