# AttributeError: module 'scater' has no attribute 'normalize'

I am using rpy2 to run normalization using scran package. After calling computeSumFactors I want to do the actual normalization calling normalize() function from scater package:

def normalize(counts):
utils = importr('utils')
utils.chooseCRANmirror(ind=1)

packnames = ('Matrix', 'limSolve')
names_to_install = [x for x in packnames if not isinstalled(x)]
if len(names_to_install) > 0:
utils.install_packages(StrVector(names_to_install))

base = importr('base')
base.source('http://www.bioconductor.org/biocLite.R')
biocInstaller = importr('BiocInstaller')

sceLib = importr("SingleCellExperiment")
scranLib = importr("scran")
scaterLib = importr("scater")
named_list = robjects.r.list(counts=counts)
sce = sceLib.SingleCellExperiment(named_list)

try:
clusters = scranLib.quickCluster(sce)
sce = scaterLib.computeSumFactors(sce, cluster=clusters, positive=True)
except rpy2.rinterface.RRuntimeError:
print("fewer cells than the minimum cluster size, so no quickCluster is run")
sce = scranLib.computeSumFactors(sce, positive=True)

----> sce = scaterLib.normalize(sce, logExprsOffset=1)


Everything runs fine except the last line which gives the error:

AttributeError: module 'scater' has no attribute 'normalize'

This is strange since that is what I am supposed to do actually according to docs.

I suspect that maybe I am loading a wrong scran version? I do not know though neither how to check the version number, nor how to install a specific one. Any suggestions would be greatly appreciated.

I tried the following:

sce = scaterLib.normalizeSCE(sce, log_exprs_offset=1)


And it is working. I am afraid though that it is a wrong way to go.

I tried to get the normalized matrix but it retrieved the initial raw counts one:

sce = scaterLib.normalizeSCE(sce, log_exprs_offset=1)
mtx_norm_r = robjects.r.assay(sce)
mtx_norm = np.array(mtx_norm_r)


So, something is definitely wrong here. Either I am retrieving the normalized matrix in the wrong way or the normalization was not run correctly. I tried the following method for retrieval but no luck:

mtx_norm_r = sceLib.normcounts(sce)


RRuntimeError: Error in assay(object, i = exprs_values) : 'assay(, i="character", ...)' invalid subscript 'i' 'normcounts' not in names(assays())

I found a way to get the version numbers using getNamespaceVersion() function:

robjects.r.getNamespaceVersion('scater')


The versions are:

scater - 1.8.4
scran - 1.8.4
SingleCellExperiment - 1.2.0


They are the newest as I understand.

I was able to get to the normalized values using logcounts function in the following way:

mtx_norm_r = sceLib.logcounts(sce)
mtx_norm = np.array(mtx_norm_r)


Since I used log_exprs_offset=1 the field that I needed to use is logcounts, otherwise it should be normcounts which I found here.

• Maybe you know it but you can read the help page for each function using ?name_of_function on the terminal (There is no need to consult an online help page that might not match your version of the package).
– llrs
Sep 13, 2018 at 7:31
• But I can not check it in spyder Sep 13, 2018 at 19:12
• I don't know what is spyder but if it can run R is run you can.
– llrs
Sep 13, 2018 at 19:48
• It can not be done, or I do not know how anyway. It is rpy2 python library that translates objects between R and python and the documentation is often not clear and detailed enough, in my view, probably because not that many people use it. Spyder is just IDE for python from anaconda Sep 13, 2018 at 22:44