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

Converting lme4 ranef output to data frame with RPy2

我正在试用 Rpy2,感觉很困惑。我传入了 pandas 数据框和 运行 具有

的混合效果模型
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' 。由于与 pandas 数据框定义存在一些冲突,我无法安装 dplyr - 也许这就是原因。那是正常的吗?下面那个错误:

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"\`

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

好的,有一种比我做的更简单的方法。我一直在使用 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 notebook 中)是:

%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 是一个数组。

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

To turn this exception into a simple warning use the parameter on_conflict="warn"\

按照建议做会让你导入 dplyr:

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

这就是完成的 in rpy2's own wrapper for dplyr。 如果您对 dplyr(这是 covered in the doc)感兴趣,您可能想使用该包装器。

我 运行 遇到了同样的问题,我相信你看到的 "out" 作为 R 对象如下:

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

我的解决方案是将其作为 python 数据框访问,如下所示:

输出[0] re_campaign[0]