Минимальный пример регрессии rpy2 с использованием фрейма данных pandas
Каков рекомендуемый способ (если таковой имеется) для выполнения линейной регрессии с использованием кадра данных pandas? Я могу сделать это, но мой метод кажется очень сложным. Я делаю вещи излишне сложными?
Код 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
Теперь мои версии Python (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)
для преобразования кадра данных из панд в R (как упоминалось здесь), я получаю
NotImplementedError: Conversion 'py2ri' not defined for objects of type '<class 'pandas.core.series.Series'>'
3 ответа
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
После звонка 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
Я могу добавить к ответу unutbu, обрисовав в общих чертах, как извлечь определенные элементы таблицы коэффициентов, включая, что важно, 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's start from unutbu's 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