## 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.

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

1 |
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.

1 2 3 |
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.

4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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.

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

### repeated measures ANOVA using rpy2

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.

25 26 27 |
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.

1 2 |
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.

25 26 |
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.

Hi, thanks for posting this. I think you may need ‘rpackages.importr’ in place of ‘importr’ when importing the afex and lsmeans packages. That’s what worked for me anyway.

Hey Sam,

Thanks for the comment and correction,

I will have a look and will update the code later,

Erik