2016-03-02 6 views
0

Я пытаюсь Rpy2 и чувствую себя очень сильно. Я прошел в моем кадре панды данных и побежал смешанной модели эффектов сПреобразование lme4 ranef выход в кадр данных с RPy2

m_rt = lme4.lmer(formula,verbose=True) 
out = r.ranef(m_rt) 

Если я распечатать, это выглядит, как и ожидалось:

$cat 
       (Intercept) gen  delta 
x  0.093546331 -0.168458284 0.144213098 
y  -0.082592717 0.148733010 -0.127326764 
z  0.005229467 -0.009417228 0.008061863 

Теперь я хочу, чтобы передать эту информацию обратно в данных панд Рамка. Или действительно, любой объект python, с которым я могу работать! Я попытался pandas2ri.ri2py(out) и получил

<ListVector - Python:0x118b53248/R:0x7fe3663a3238> 
[DataFrame] 
<ListVector - Python:0x118b53248/R:0x7fe3663a3238> 
[DataFrame] 

и r.data.frame(out) и получил AttributeError: 'SignatureTranslatedFunction' object has no attribute 'frame' . Я не могу установить dplyr из-за некоторого конфликта с определениями фреймов данных pandas - возможно, именно поэтому. Это нормально? Эта погрешность ниже:

LibraryError: Conflict when converting R symbols in the package "dplyr" to Python symbols: 
-obj_type_data_frame -> obj_type.data_frame, obj_type.data.frame 
To turn this exception into a simple warning use the parameter `on_conflict="warn"\` 

Любая помощь очень ценится! Благодаря!

+0

фрейм данных обернут в список. –

+0

Какая версия rpy2 у вас есть? 'import rpy2; print (rpy2 .__ version __) ' – lgautier

+0

У меня есть версия 2.7.8 – Erin

ответ

1

Хорошо, есть намного более простой способ сделать это, чем я это делал. Я использовал шаблон из here

from rpy2.robjects import pandas2ri 
pandas2ri.activate() 
r_df = pandas2ri.py2ri(p_df) 

# add all the fields to an environment 
env = Environment() 
for varname in r.colnames(r_df): 
    env[varname] = r_df(varname) 

formula = Formula('x ~ gen + delta + (1 + gen + delta | cat)', 
       environment=env) 
m_rt = lme4.lmer(formula,verbose=True) 

И оттуда мог print r.summary(m_rt) и print r.fixef(m_rt), но не может получить больше работать.

Но более простой способ (я в jupyter ноутбук), является:

%load_ext rpy2.ipython 
%Rpush p_df 

(Следующая ячейка)

%%R 
library(lme4) 
m_rt <- lmer(x ~ gen + delta + (1 + gen + delta | cat)), 
     data = p_df) 

rfs <- ranef(m_rt)$cat 
ffs <- fixef(m_rt) 

(Следующая ячейка)

%Rpull rfs 
%Rpull ifs 

И voila, rfs теперь представляет собой кадр данных pandas, а ffs - массив.

1

Сообщение об ошибке пытается помочь вам здесь:

Чтобы превратить это исключение в простое предупреждение используйте параметр on_conflict="warn"\

Doing в соответствии с рекомендациями позволят вам импортировать dplyr:

dplyr = importr("dplyr", on_conflict="warn") 

Это то, что делается in rpy2's own wrapper for dplyr. Хотя у вас есть возможность использовать эту обертку, если она заинтересована в dplyr (это covered in the doc).

 Смежные вопросы

  • Нет связанных вопросов^_^