【问题标题】:Difference in Python statsmodels OLS and R's lmPython statsmodels OLS 和 R 的 lm 的区别
【发布时间】:2012-07-14 18:06:08
【问题描述】:

我不确定为什么对于简单的 OLS 得到的结果略有不同,这取决于我是通过 panda's experimental rpy interfaceR 中进行回归,还是在 Python 中使用 statsmodels

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

R,我得到以下摘要:

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

使用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 notebook here,可以重现不一致。

【问题讨论】:

    标签: python r pandas rpy2 statsmodels


    【解决方案1】:

    看起来 Python 默认情况下不会向您的表达式添加截距,而 R 在您使用公式接口时会这样做..

    这意味着您确实适合了两个不同的模型。试试

    lm( y ~ x - 1, data)
    

    在 R 中排除截距,或者在您的情况下使用更标准的符号

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

    【讨论】:

    • 必要时提出文档错误?
    • 文档已用措辞更新:除非您使用公式,否则模型不会添加常量。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-02
      • 2020-11-23
      • 2023-02-15
      • 2014-04-17
      • 2017-06-05
      • 2016-01-08
      • 2015-11-18
      • 2018-10-17
      • 2018-06-19
      相关资源
      最近更新 更多