Error when running R code for anova in python

Viewed 69

I am trying to use ANOVA in python but using the R code with the help of the rpy2 package. In below, code stats.lm() works but not stats.aov()

import pandas as pd
from rpy2 import robjects as ro
from rpy2.robjects import pandas2ri
pandas2ri.activate()
from rpy2.robjects.packages import importr

stats = importr('stats')
R = ro.r

df = pd.DataFrame(data={
    'subject':['1','2','3','4','5','1','2','3','4','5'],
    'group':['1','1','1','2','2','1','1','1','2','2'],
    'session':['1','1','1','1','1','2','2','2','2','2'],
    'covar':['1', '2', '0', '2', '1', '1', '2', '0', '2', '1'],
    'result':[-6.77,6.11,5.67,-7.679,-0.0930,0.948,2.99,6.93,6.30,9.98]
})

rdf = ro.conversion.py2rpy(df)
result = stats.lm('covar ~ group*session', data=rdf)
print(R.summary(result).rx2('coefficients'))

result2 = stats.aov('covar ~ group*session', data=rdf)

I am getting this error.

"Error: $ operator is invalid for atomic vectors"

Thanks in advance

1 Answers

Error is due to passing a string formula into stats.aov and not formula object. Consider using stats package's as.formula (translated to as_formula in rpy2) to cast string formula or reformulate to build string with string parameters:

results = stats.aov(stats.as_formula("covar ~ group*session"), data=df)
print(R.summary(results))

results = stats.aov(stats.reformulate("group*session", "covar"), data=df)
print(R.summary(results))

#               Df Sum Sq Mean Sq F value Pr(>F)
#
# group          1    0.6  0.6000    0.72  0.429
# 
# session        1    0.0  0.0000    0.00  1.000
# 
# group:session  1    0.0  0.0000    0.00  1.000
# 
# Residuals      6    5.0  0.8333
Related