Добавить матрицу к фрейму данных, используя rpy2 - PullRequest
0 голосов
/ 08 ноября 2019

Мне нужно использовать регрессию Дирихле в Python, и единственная найденная мною реализация была доступна в R. Следовательно, я хотел бы преобразовать этот R код в rpy2 представление.

library(DirichletReg)
data(ArcticLake)

ArcticLake$Y <- DR_data(ArcticLake[, 1:3])
DirichReg(Y ~ depth, data=ArcticLake)

DR_data функция возвращает матрицу с атрибутами. Я не совсем уверен в его внутреннем представлении в R, но str делает его похожим на отдельный элемент в списке, а print делает его похожим на дополнительный набор из 3 столбцов.

Из-заВ частности, мне не удалось преобразовать приведенный выше код в rpy2. Выполнение функции DR_data само по себе работает просто отлично.

from rpy2.robjects.packages import importr, data
from rpy2.robjects import Formula
from rpy2.robjects import pandas2ri

pandas2ri.activate()
dirichlet_reg = importr("DirichletReg")
arctic_lake = data(dirichlet_reg).fetch("ArcticLake")["ArcticLake"]

dr_arctic = dirichlet_reg.DR_data(pandas2ri.ri2py(arctic_lake).iloc[:, 0:3])

Назначение вывода для окончательной подгонки, однако, вот где я изо всех сил. Я пробовал это, но окончательная структура неверна.

arctic_lake.do_slot_assign("Y", dr_arctic)  # arctic_lake$Y <- dr_arctic

fmla = Formula("Y ~ depth")
dirichlet_reg.DirichReg(fmla, data=arctic_lake)

Как правильно назначить матрицу для фрейма данных, используя rpy2 таким же образом, R делает это?

1 Ответ

0 голосов
/ 09 ноября 2019

Я вижу два различия между портом R и Python.

Добавление столбца с зависимой переменной 'y':

Я думаю, что .do_slot_assign()не делает то, что, по вашему мнению, делает:

>>> from rpy2.robjects.vectors import DataFrame
>>> dataf = DataFrame({'x': 1})                                                    
>>> print(dataf)                                                                   
  x
1 1
>>> dataf.do_slot_assign('y', 2)                                                   
print(dataf)                                                                   
  x
1 1
>>> dataf2 = dataf.cbind(z=3)                                                    
>>> print(dataf2)                                                                  
  x z
1 1 3

Извлечение столбцов из фрейма данных R:

Этот, вероятно, не является корнем проблемы, но сэкономитВам нужно преобразовать полный фрейм данных R в панды, просто чтобы извлечь из него несколько столбцов.

В R у вас есть:

ArcticLake$Y <- DR_data(ArcticLake[, 1:3])

В Python у вас есть:

dr_arctic = dirichlet_reg.DR_data(pandas2ri.ri2py(arctic_lake).iloc[:, 0:3])

Python / rpy2 было бы ближе к оригиналу R (подробности о .rx() - https://rpy2.github.io/doc/v3.2.x/html/vector.html#extracting-r-style):

from rpy2.robjects.vectors import IntVector
dr_arctic = dirichlet_reg.DR_data(
    arctic_lake.rx(True, IntVector(range(1, 3+1)))
)
см. Здесь)
...