使用 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]
我正在试用 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]