使用rpy2从Python调用R

由伊莎贝拉维拉斯

这篇关于R Views的文章是关于Python的!令人吃惊的是,我知道。Python有几个编写良好的用于统计和数据科学的包,但是R的中央存储库CRAN包含数千个实现复杂统计算法的包,这些算法经过多年的实地测试。多亏了rpy2包,Pythonistas可以利用R社区已经完成的伟大工作。rpy2提供了一个接口,允许您在Python进程中运行R。用户可以在两种语言之间切换,并使用这两种编程语言的最佳功能。

下面,我将向您介绍如何从Python调用三个强大的R包:stats、lme4和ggplot2。每个部分都包含详细的步骤,您可以在附录

从rpy2开始

安装rpy2

首先,安装一些软件包。必须安装Python >=3.7和R >= 4.0才能使用rpy2 3.5.2。安装R之后,通过运行来安装rpy2包pip安装rpy2.如果想查看rpy2在机器上的安装位置,可以运行rpy2python - m rpy2.situation

如果您使用的是Jupyter笔记本,您可能希望在笔记本中查看ggplot2图。运行conda安装r-ggplot2在木星环境中,这样它们才会出现。


安装

PIP安装rpy2 conda安装r-ggplot2

导入rpy2包和子包

然后,您将导入包和子包。通过运行导入顶级rpy2包进口rpy2

导入顶层子包robjects进口rpy2。robjectsas robjects.运行robjects也会在当前Python进程中初始化R。

还有一些其他的步骤可以让在笔记本上工作更容易一些:

  • rpy2定制R对象的显示,例如笔记本中的数据帧。运行rpy2.ipython.html.init_printing ()启用此自定义。
  • 您可能希望在笔记本的输出单元格中看到ggplot2对象。使这从rpy2.ipython。ggplot进口image_png

导入rpy2包和子包

Import rpy2 Import rpy2。robjects作为robjects## To aid in printing HTML in notebooks import rpy2.ipython.html rpy2.ipython.html.init_printing() ## To see plots in an output cell from rpy2.ipython.ggplot import image_png

使用rpy2安装和加载R包

安装和加载R包通常是R脚本的第一步。rpy2包提供了一个函数rpy2.robjects.packages.importr ()模仿这些步骤。运行下面的代码,您还将导入该函数数据()为以后。

从rpy2.robjects。Packages import importr, data

使用importr ()来加载utils和基本包,它们通常预先安装在R中。

Utils = importr(' Utils ') base = importr('base')

您还可以使用rpy2从包存储库(如CRAN)下载和安装包。

首先,选择你想要的镜子utils.chooseCRANmirror ()并安装您的软件包utils.install_packages ().下面,您将安装stats和lme4。

utils.install_packages utils.install_packages(“统计数据”)(“lme4”)

安装后,用importr ()

lme4 = importr(' Stats ')

使用rpy2安装和加载ggplot2

rpy2文档推荐了一种不同的安装ggplot2的方法:

进口rpy2.robjects.lib。ggplot2作为ggplot2

R包的安装

从rpy2.robjects。packages import importr, data utils = importr('utils') base = importr('base') utils. choosecranmirror (ind=1) utils.install_packages('lme4') utils.install_packages('stats') stats = importr('stats') lme4 = importr('lme4') import rpy2. objects.libggplot2作为ggplot2

使用Python接口R

设置好一切后,您就可以开始使用Python界面了!然而,这并不像在你的Jupyter笔记本上写R代码那么简单。你必须“翻译”R函数才能从Python调用它们。

下面,我将分析lme4的睡眠研究数据。这些数据代表了睡眠剥夺研究中受试者每天的平均反应时间(以毫秒为单位)。在第0-1天,受试者有正常的睡眠时间。第二天是基准,之后开始睡眠剥夺。

使用rpy2中的数据

你可以使用rpy2从R包中'获取'数据。下面的代码等价于lme4: sleepstudy注意你用了数据()功能导入前:

Sleepstudy = data(lme4).fetch(' Sleepstudy ')[' Sleepstudy ']睡眠研究

使用Python中的ggplot2可视化数据

ggplot2包为创建图形提供了灵活而健壮的功能。我们可以在Python中绘制数据,并对常用的ggplot2语法进行一些调整。

从睡眠研究中可视化天数和反应时间之间的关系:

Gp = ggplot2.ggplot(sleepstudy) p1 = (Gp + ggplot2。aes_string(x = 'Days', y = 'Reaction') + ggplot2。geom_point(颜色= '#648FFF', alpha = 0.7) + ggplot2。Geom_smooth (method = 'lm', color = 'black') + ggplot2.theme_minimal())显示(image_png(p1))
R[写入控制台]:' geom_smooth() '使用公式'y ~ x'

睡眠试验天数与反应时间的散点图呈正相关

使用rpy2运行模型并查看结果

您可以在Python中利用R的统计功能。调用lm ()函数使用rpy2编写一个线性模型:

lm1 =统计数据。lm('反应~天数',数据=睡眠研究)#打印(base.summary(lm1))

打印匹配对象print (base.summary (lm1))显示用于执行匹配的代码而且结果。为了简单起见,将输出限制为系数:

print (stats.coef (lm1))
(截距)天251.40510 10.46729

同时打印95%置信区间:

print (stats.confint (lm1))
2.5% 97.5%(截距)238.360753 264.44946天8.023855 12.91072

结果显示,睡眠不足天数越多,反应时间越慢。然而,你可能会意识到线性模型掩盖了整个研究对象的变化。为了说明这些差异,您可以使用ggplot2分别绘制每个受试者的反应vs.天数facet_wrap ()

p2 = (p1 + ggplot2.facet_wrap)~主题”),* *{“ncol”:6}))显示(image_png (p2))
R[写入控制台]:' geom_smooth() '使用公式'y ~ x'

研究中18名受试者的睡眠试验天数与反应时间的散点图,每一项都显示出不同的相关性

图表显示,平均反应时间与睡眠不足天数呈近似线性增长。然而,斜率和截距因主题而异。

您可以使用lme4包创建一个模型,该模型计算睡眠不足天数对反应时间的固定影响,同时考虑每个人的开始反应时间和差异。

fm1 = lme4。lmer(“反应~天数+(天数|受试者)”,数据=睡眠研究)打印(base.summary(fm1))

以下是总结的输出,简写为结果:

收敛时REML准则:1743.6尺度残差:最小1Q中值3Q Max -3.9536 -0.4634 0.0231 0.4634 5.1793随机效应:组名称方差st . dev。相关对象(截距)612.10 24.741天35.07 5.922 0.07剩余654.94 25.592对象数量:180个,组:受试者,18个固定效果:估计标准差(截距)251.405 6.825 36.838天10.467 1.546 6.771固定效果相关性:(Intr)天-0.138

截距和斜率随机效应的标准差估计分别为24.74 ms和5.92 ms/day。固定效应系数分别为251.4 ms和10.47 ms/day。这些结果与R输出的结果相匹配。1

学习如何使用rpy2

使用rpy2进行了一些调查工作。有一些R函数,我认为转换成Python会很简单,但它们最终变得更复杂。

例如,我想确认每个被试都有不同的线性模型结果。的子集()函数是底数R的一部分,所以我想我可以运行:

lm1 =统计数据。lm('反应~天',数据=基础。睡眠研究,受试者== 308)

不幸的是,这是不正确的。我读着书找到了答案提取项目部分的文档。在学习了rpy2如何使用R数据帧之后,我能够找到数据子集的实际方法:

lm308 =统计数据。lm(“反应~天数”,数据= sleepstudy.rx(sleepstudy.rx(“受试者”)。ro == 308, True)) print(stats.confint(lm308))
2.5% 97.5%(截距)179.433863 308.95148天9.634267 33.89514

您需要掌握一些Python知识,才能更灵活地使用rpy2接口。例如,定义列数的能力* *{“ncol”:6}facet_wrap ()以上内容不在rpy2文档中。拆包值和关键字参数,用* * {},是一般Python语法的一部分。

了解更多

Python用户可以通过多种方式在脚本中利用R包和函数。rpy2对于那些想要使用R社区有影响力的工作的人来说是一个很有帮助的工具。正如rpy2文档“重用。把事情做好。不重装。”

附录

#安装pip install rpy2 conda install r-ggplot2 #导入rpy2包和子包Import rpy2 Import rpy2robjects作为robjects## To aid in printing HTML in notebooks import rpy2.ipython.html rpy2.ipython.html.init_printing() ## To see plots in an output cell from rpy2.ipython.ggplot import image_png # Installation of R packages from rpy2.robjects.packages import importr, data utils = importr('utils') base = importr('base') utils.chooseCRANmirror(ind=1) utils.install_packages('lme4') utils.install_packages('stats') stats = importr('stats') lme4 = importr('lme4') import rpy2.robjects.lib.ggplot2 as ggplot2 # Working with data in rpy2 sleepstudy = data(lme4).fetch('sleepstudy')['sleepstudy'] sleepstudy # Visualizing with ggplot2 in Python gp = ggplot2.ggplot(sleepstudy) p1 = (gp + ggplot2.aes_string(x = 'Days', y = 'Reaction') + ggplot2.geom_point(color = '#648FFF', alpha = 0.7) + ggplot2.geom_smooth(method = 'lm', color = 'black') + ggplot2.theme_minimal()) display(image_png(p1)) p2 = (p1 + ggplot2.facet_wrap(robjects.Formula('. ~ Subject'), **{'ncol':6})) display(image_png(p2)) # Run models and view results lm1 = stats.lm('Reaction ~ Days', data = sleepstudy) print(stats.coef(lm1)) print(stats.confint(lm1)) fm1 = lme4.lmer('Reaction ~ Days + (Days | Subject)', data = sleepstudy) print(base.summary(fm1))

  1. 道格拉斯·贝茨,马丁·梅希勒,本·博克,史蒂夫·沃克(2015)。利用lme4拟合线性混合效应模型。统计软件学报,67(1),1-48。doi: 10.18637 / jss.v067.i01。

你可以在下面留言或者在论坛里讨论community.英格兰vs伊朗让球rstudio.com