Минимальный пример регрессии rpy2 с использованием фрейма данных pandas

Каков рекомендуемый способ (если он есть) для выполнения линейной регрессии с помощью pandas dataframe? Я могу это сделать, но мой метод кажется очень сложным. Я делаю вещи излишне сложными?

Код R для сравнения:

x <- c(1,2,3,4,5)
y <- c(2,1,3,5,4)
M <- lm(y~x)
summary(M)$coefficients
            Estimate Std. Error  t value  Pr(>|t|)
(Intercept)      0.6  1.1489125 0.522233 0.6376181
x                0.8  0.3464102 2.309401 0.1040880

Теперь мой питон (2.7.10), rpy2 (2.6.0) и pandas (0.16.1)  версия:

import pandas
import pandas.rpy.common as common
from rpy2 import robjects
from rpy2.robjects.packages import importr

base = importr('base')
stats = importr('stats')

dataframe = pandas.DataFrame({'x': [1,2,3,4,5], 
                              'y': [2,1,3,5,4]})

robjects.globalenv['dataframe']\
   = common.convert_to_r_dataframe(dataframe) 

M = stats.lm('y~x', data=base.as_symbol('dataframe'))

print(base.summary(M).rx2('coefficients'))

            Estimate Std. Error  t value  Pr(>|t|)
(Intercept)      0.6  1.1489125 0.522233 0.6376181
x                0.8  0.3464102 2.309401 0.1040880

Кстати, я получаю FutureWarning при импорте pandas.rpy.common. Однако, когда я попробовал pandas2ri.py2ri(dataframe) преобразовать dataframe из pandas в R (как упоминалось здесь), я получаю

NotImplementedError: Conversion 'py2ri' not defined for objects of type '<class 'pandas.core.series.Series'>'

Ответы

Ответ 1

R и Python не являются строго идентичными, потому что вы создаете кадр данных в Python/rpy2, тогда как вы используете векторы (без фрейма данных) в R.

В противном случае транзакция конверсии с rpy2 работает здесь:

from rpy2.robjects import pandas2ri
pandas2ri.activate()
robjects.globalenv['dataframe'] = dataframe
M = stats.lm('y~x', data=base.as_symbol('dataframe'))

Результат:

>>> print(base.summary(M).rx2('coefficients'))
            Estimate Std. Error  t value  Pr(>|t|)
(Intercept)      0.6  1.1489125 0.522233 0.6376181
x                0.8  0.3464102 2.309401 0.1040880

Ответ 2

После вызова pandas2ri.activate() некоторые преобразования из объектов Pandas в объекты R происходят автоматически. Например, вы можете использовать

M = R.lm('y~x', data=df)

вместо

robjects.globalenv['dataframe'] = dataframe
M = stats.lm('y~x', data=base.as_symbol('dataframe'))

import pandas as pd
from rpy2 import robjects as ro
from rpy2.robjects import pandas2ri
pandas2ri.activate()
R = ro.r

df = pd.DataFrame({'x': [1,2,3,4,5], 
                   'y': [2,1,3,5,4]})

M = R.lm('y~x', data=df)
print(R.summary(M).rx2('coefficients'))

дает

            Estimate Std. Error  t value  Pr(>|t|)
(Intercept)      0.6  1.1489125 0.522233 0.6376181
x                0.8  0.3464102 2.309401 0.1040880

Ответ 3

Я могу добавить к unutbu answer, изложив, как извлекать определенные элементы таблицы коэффициентов, включая, в основном, p-значения.

def r_matrix_to_data_frame(r_matrix):
    """Convert an R matrix into a Pandas DataFrame"""
    import pandas as pd
    from rpy2.robjects import pandas2ri
    array = pandas2ri.ri2py(r_matrix)
    return pd.DataFrame(array,
                        index=r_matrix.names[0],
                        columns=r_matrix.names[1])

# Let start from unutbu line retrieving the coefficients:
coeffs = R.summary(M).rx2('coefficients')
df = r_matrix_to_data_frame(coeffs)

Это оставляет нам DataFrame, доступ к которому мы можем получить обычным способом:

In [179]: df['Pr(>|t|)']
Out[179]:
(Intercept)    0.637618
x              0.104088
Name: Pr(>|t|), dtype: float64

In [181]: df.loc['x', 'Pr(>|t|)']
Out[181]: 0.10408803866182779