[BioC] edgeR - coefficients in 3-factor experiment, complex contrasts and decideTestsDGE

Emanuel Heitlinger emanuelheitlinger at googlemail.com
Sun Oct 16 13:39:09 CEST 2011


Hi all,

I have some questions regarding multi-factor-glms in edgeR. I am
working on a RNA-seq experiment:

I have 24 samples from 3 "treatments" each having two levels. This
means 3 biological replicates per treatment combination. I want to
model the full set of possible interactions
(sex.conds*eel.conds*pop.conds), as expecially two-fold interactions
could be very interetsing for my research-question.

I want to categorize genes (contigs form a 454-transcriptome assembly,
genome is unsequenced) I mapped my reads against into categoris:
a) only different for sex
b) only different for eel
c) only different for pop
d1)d2)d3) different for sex:eel, sex:pop, eel:pop

In glmLRT giving simple coefficients would compare the complete model
to a model removing one coefficient at a time. From application of
glms in ecology I remember that an interaction effect should not be
left in the model if the main effect is removed. Does this apply here?
Should I compare the full model against e.g. the model minus pop,
sex:pop, eel:pop and sex:eel:pop, when I want to remove condition
"pop" from the model?

Hope this code demonstrates what I mean:

## CODE start
library(edgeR)

## generate a df of neg. bionm. counts
y <- as.data.frame(matrix(rnbinom(6000,mu=10,size=10),ncol=24))
names(y) <- c("AA_R11M", "AA_R16M", "AA_R18F", "AA_R28F",
              "AA_R2M",  "AA_R8F",  "AA_T12F", "AA_T20F",
              "AA_T24M", "AA_T3M", "AA_T42M", "AA_T45F",
              "AJ_R1F",  "AJ_R1M",  "AJ_R3F",  "AJ_R3M",
              "AJ_R5F",  "AJ_R5M",  "AJ_T19M", "AJ_T20M",
              "AJ_T25M", "AJ_T26F", "AJ_T5F",  "AJ_T8F")

sex.conds <- factor(ifelse(grepl("M$", names(y)), "male", "female" ))
eel.conds <- factor(ifelse(grepl("^AA", names(y)), "Aa", "Aj" ))
pop.conds <- factor(ifelse(grepl("\\w\\w_R.*", names(y)), "EU", "TW" ))

design <- model.matrix(~sex.conds*eel.conds*pop.conds)

## Counts frame to full DGEList
d <- DGEList(y, lib.size=colSums(y))
d <- calcNormFactors(d)
d <- estimateGLMCommonDisp(d, design=design)
d <- estimateGLMTrendedDisp(d, design=design)
d <- estimateGLMTagwiseDisp(d, design=design)

glmfit <- glmFit(d, design, dispersion=d$tagwise.dispersion)

glm.wrapper <- function(de.obj, fit.obj, conds.regex){
  glm.list <- list()
  coe <- names(as.data.frame(fit.obj$design))
  coe.l <- lapply(conds.regex, function (x) grep(x, coe))
  for (i in 1:length(conds.regex)){
    glm.list[[conds.regex[[i]]]] <- glmLRT(de.obj, fit.obj, coef=coe.l[[i]])
  }
  return(glm.list)
}

## selects all coefficients being contained in each other hierachically
combi.conds <- gsub(":", ".*", names(as.data.frame(glmfit$design))[2:8])
glm.l <- glm.wrapper(d, glmfit, combi.conds)

## show what is compared
lapply(glm.l, function (x) x$comparison)

## topTags works (same as using p.adjust directly)
topTags.l <- lapply(glm.l, function (x){
  tt <- topTags(x, n=40000) ## set as high as the length
  tt[tt$table$adj.P.Val<0.05] ## get only below adj.P
})

## Code End

Then I would look through the topTags list to categorize the contigs
as stated above. E.g. from topTags.l[[1]] I would take only those not
in topTags.l[[c(4, 5, 7]] to get category a) stated above, from
topTags.l[[4]] only those not in topTagl.l[[7]] to get d1. This seems
all a bit complicated to me, is this a correct way of doing this?

I am alos a bit worried that decideTestsDGE seems to not work on
DGELRT-objects with complicated coefficients. Eg.

## Code Start
## decideTestsDGE does not work
decideTestsDGE.l <- lapply(glm.l, function (x){
   subset(x$table, (decideTestsDGE(x, p.value = .05))!=0)})
## Code End

I saw that for simple coefficients the results of decideTestsDGE
differ from topTags. Is this expected, what is the difference between
the two, thought both do p-value adjustment the same way (I could
provide code if these differenced would not be the expected
behaviour)?

These are my questions for now. I would be very greatful for help!

All the Best,
Emanuel


sessionInfo()
R version 2.13.0 (2011-04-13)
Platform: x86_64-redhat-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
LC_TIME=en_US.UTF-8
 [4] LC_COLLATE=en_US.UTF-8     LC_MONETARY=C
LC_MESSAGES=en_US.UTF-8
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C
LC_ADDRESS=C
[10] LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=C

attached base packages:
[1] splines   stats     graphics  grDevices utils     datasets
methods   base

other attached packages:
[1] edgeR_2.2.6

loaded via a namespace (and not attached):
[1] limma_3.8.3  tools_2.13.0

-- 
Emanuel Heitlinger

Karlsruhe Institute of Technology (KIT)
Zoological Institute; Ecology/Parasitology
Kornblumenstr. 13
76131 Karlsruhe
Germany
Telephone +49 (0)721-608 47654

or
University of Edinburgh
Institute of Evolutionary Biology
Kings Buildings, Ashworth Laboratories, West Mains Road
Edinburgh EH9 3JT
Scotland, UK
Telephone:+44 (0)131-650 7403



More information about the Bioconductor mailing list