## rpy2 tutorial

Recently I found the Python module rpy2. This module offers a Python interface to R. Obviously; rpy2 requires that you have both R (version 3.2+) and Python (versions 2.7 and 3.3) installed. There are pre-compiled binaries available for Linux and Windows (unsupported and unofficial, however). In this short tutorial, I will show you how to do carry out a repeated measures ANOVA (rmANOVA) using the r-packages ‘afex‘ and ‘lsmeans‘, Python, and rpy2.https://open.spotify.com/album/6XJujBkWZYlhTtxYRcDHr3

First, we start the tutorial with installing rpy2. I installed rpy2 on Ubuntu 14.04 using pip:

```
sudo pip install rpy2
```

When we have a working installation, we continue the tutorial with importing the methods that we are going to use. In this rpy2 example we are going to use ‘afex’ to do the within-subject ANOVA and ‘lsmeans’ to do the follow-up analysis.

```
import rpy2.robjects as robjects
import rpy2.robjects.packages as rpackages
from rpy2.robjects.vectors import StrVector
```

We also need to check whether the needed packages are installed. Note that the following script will install the r-package if needed. However, it might be good to know how to carry out a repeated measrues ANOVA using the function ez_aov.

```
packageNames = ('afex', 'lsmeans')
if all(rpackages.isinstalled(x) for x in packageNames):
have_packages = True
else:
have_packages = False
if not have_packages:
utils = rpackages.importr('utils')
utils.chooseCRANmirror(ind=1)
packnames_to_install = [x for x in packageNames if not rpackages.isinstalled(x)]
if len(packnames_to_install) > 0:
utils.install_packages(StrVector(packnames_to_install))
```

For this tutorial we borrow a data set from the package Psych. In this case, we use the r-function read.table to get the data.

```
data = robjects.r('read.table(file = "http://personality-project.org/r/datasets/R.appendix3.data", header = T)')
```

### repeated measures ANOVA

In this part of the rpy2 tutorial we will carry out the actual analysis. However, before conducting our ANOVA for within-subjects design, we need to import the r-package (i.e., afex). When this is done, we will use the function aov_ez to conduct the analysis.

```
afex = importr('afex')
model = afex.aov_ez('Subject', 'Recall', data, within='Valence')
print model
```

The last line above prints the results. A main effect of Valence was found.

```
Effect df MSE F ges p.value
1 Valence 1.15, 4.60 9.34 189.11 *** .93 < .0001
```

### Follow-up analysis

Typically we are interested in following up the main effect, and with rpy2, we can do that using the r-package ‘lsmeans’. First, we need to import the package and then we do a pairwise contrast and adjust for familywise error using Holm-Bonferroni correction.

```
lsm = importr('lsmeans')
pairwise = lsm.lsmeans(model, "Valence", contr="pairwise", adjust="holm")
```

That was easy, right. Particularly, if you are used to doing analysis in R. Although, rpy2 is relatively easy to use I don’t think it will replace learning R. That is, you will have to know some R to make use of it. However, if you are a Python programmer and want to use available R-scripts, it might be useful and hopefully this rpy2 tutorial have made it somewhat easier for you. Noteworthy, I am not aware of any Python implementations of rmANOVA (except for the linear-mixed effects approach maybe). In fact, that is why I learned how to use rpy2 in the first place; to use Python, and R, to conduct the analysis.

**Update**: In this rpy2 tutorial you learned how to do a repeated measures ANOVA with Python and R. I have now found a Python package that allows Python ANOVA for within-subjects design (i.e., Python native); see my tutorial Repeated Measures ANOVA using Python.