使用RPy2将lme4 ranef输出转换为数据帧

时间:2016-03-02 21:03:41

标签: r pandas dataframe rpy2 lme4

我正在尝试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

现在我想将这些信息传回pandas数据框。或者真的,我可以使用的任何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"\`

任何帮助非常感谢!谢谢!

3 个答案:

答案 0 :(得分:2)

好的,这比我做的更容易。我一直在使用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

瞧,rfs现在是一个pandas数据框,而ffs是一个数组。

答案 1 :(得分:1)

错误消息正在尝试帮助您:

  

要将此异常转换为简单警告,请使用参数on_conflict="warn"\

按照建议操作,您可以导入dplyr

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

这就是in rpy2's own wrapper for dplyr所做的。 在此期间,如果对dplyr感兴趣(这是covered in the doc),您可能想要使用该包装器。

答案 2 :(得分:0)

我遇到了同样的问题,我相信您看到“ out”作为R对象的情况如下:

R类,其类:('ranef.mer',)映射到:[ListSexpVector] 组:

我的解决方案是像这样通过python数据帧访问它:

出[0] re_campaign [0]

相关问题