2012-07-15 17 views
22

panda's experimental rpy interfaceを回り、回帰をRにするかどうか、またはstatsmodelsをPythonで使用するかどうかによって、単純なOLSの結果が少し違ってきているのか分かりません。 RからPython統計の相違点OLSとRのlm

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 

、私は次の要約を取得:

OLSを行うには statsmodels.apiを使用し
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 

を:

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ノートブックhereがあります。 Pythonはあなたの式にデフォルトでインターセプトを追加しないようにあなたが式インタフェースを使用するときにRが行うのに対し

答えて

16

これは、あなたが合う2つの異なるモデルをやった意味..見えます。私は

from statsmodels.formula.api import ols 

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

:あなたはまだstatsmodels.formula.apiからolsを使用することができます、またはあなたのケースで、ややより標準的な表記法

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

よろしくお願いいたします。数分で受け入れます。 –

+3

必要に応じてドキュメントのバグを修正しますか? – smci

+0

ドキュメントが更新されました。 数式を使用していない限り、モデルによって定数は追加されません。 – gliptak

5

と切片を除外するようにRで

lm(y ~ x - 1, data) 

をお試しくださいバックエンドでpatsyを使用して数式を変換し、自動的に代行受信が追加されると考えてください。