Limma: Best way to analyse treatment response in patients paired pre/post treatment
2
2
Entering edit mode
j.iremonger ▴ 20
@jiremonger-14126
Last seen 6.5 years ago

Dear All,

I've searched and searched but still not confident with my LIMMA analysis here. Below is an example target file table to demonstrate the sort of samples I have (my n number is thankfully bigger than the table suggests). In the example, I have 4 patients all 4 have a disease. After completion of the study, it is seen that two of the patients responded well to the treatment (Positive Response = 1) and two did not (Positive Response = 0). Their initial pre-treatment sample is where Intervention = 0, and conversely Intervention = 1 is a post-treatment sample. I've not shown it in the table but I also have a good number of Healthy volunteers which could be used for comparisons. However, I'm of the understanding that pairing the samples can possibly add more power to my analysis, but any ideas here would be welcome. 

<caption>Example of Targets file</caption>
File Patient Intervention Treatment.Response
a.txt a naive Responder
a.txt a treated Responder
b.txt b naive Responder
b.txt b treated Responder
c.txt c naive Non_Responder
c.txt c treated Non_Responder
d.txt d naive Non_Responder
d.txt d treated Non_Responder

 

I want to make the most of the data available here and that I haven't made any incorrect assumptions or misinterpreted things. I need some help designing the contrasts. I don't know if these questions need a paired design or if I just compare the appropriate subset of arrays.

I want to investigate the differences between responders and non-responders.

  1. I'd like to know if there is any difference in expression pre-treatment. i.e. could there be a way to molecularly stratify these patients before assigning treatment?
  2. What are the differences post-treatment. i.e. differences here could be used to understand the biology underpinning the treatment response/non-response?

Below is the basic LIMMA code for this, the makeContrasts() is blank as that's the bit I'm not sure on.

design <- model.matrix(~ 0 + Intervention + Treatment.Response + Patient, data = targets)
fit <- lmFit(eset, design= design)

​contrast.matrix <- makeContrasts("", levels = design)
fit2 <- contrasts.fit(fit, contrast.matrix)
fit2 <- eBayes(fit2)
topTable(fit2)

 

 

limma paired samples limma paired analysis • 2.5k views
ADD COMMENT
2
Entering edit mode
@gordon-smyth
Last seen 14 minutes ago
WEHI, Melbourne, Australia

See Section 9.7 "Multi-level experiments" in the limma User's Guide. Your experimental design is almost exactly the same as the example given in the guide.

ADD COMMENT
0
Entering edit mode

Thank you Gordon, you really must hate people who fail to read the entire manual!  I do apologise, it never registered with myself that this was what I was after when first reading through.

ADD REPLY
0
Entering edit mode

Hi Gordon,

Going through that example has got me most of the way. I'm also interested in what unique changes are present in responders when they are given treatment. Is the below contrast valid for that comparison?

makeContrasts(genes.of.interest = (Responder.treated-Responder.naive) - (Non_Responder.treated-Non_Responder.naive))

Or using the example from the LIMMA user guide (9.7)

makeContrasts(genes.of.interest = (Diseased.B-Diseased.A) - (Normal.B-Normal.A))
ADD REPLY
2
Entering edit mode

Well, it depends what you mean by "unique". If you want genes that are DE for responders but not DE for non-responders, then you need to examine multiple contrasts. If you want to be strict about it, then I would do it like this:

contrast.matrix <- makeContrasts(
      Treated.vs.Naive.Responders = Responder.treated-Responder.naive,
      Treated.vs.Naive.Non_Responders = Non_Responder.treated-Non_Responder.naive,
      Responders.vs.Non_Responders = (Responder.treated-Responder.naive) - (NonResponder.treated-NonResponder.naive),
      levels = design)
fit2 <- contrasts.fit(fit, contrast.matrix)
fit2 <- eBayes(fit2)
results <- decideTests(fit2)

You want genes that are positive for the first contrast (up-regulated for responders) and zero for the second contrast (not DE for non-responders). To be strict, you should also restrict to genes that have significantly different responses in responders vs non-responders. So you want genes like this:

i <- results[,1]==1 & results[,2]==0 & results[,3]==1
topTable(fit2[i,])

That gives up-regulated genes. To get down-regulated:

i <- results[,1]==-1 & results[,2]==0 & results[,3]==-1
topTable(fit2[i,])

 

ADD REPLY
0
Entering edit mode

Thanks again Gordon,

The first contrast was what I was thinking of, but I hadn't thought of comparing them like the second. I will give that a go too. 

ADD REPLY
1
Entering edit mode
@james-w-macdonald-5106
Last seen 13 hours ago
United States

There is an example for this type of experiment, but it's in the edgeR User's Guide, not the limma User's Guide. See section 3.5 in the edgeR User's Guide. Note that while limma fits a different model, as far as specifying a design and contrast matrix, both edgeR and limma are identical.

ADD COMMENT
0
Entering edit mode

Thank you James, that's exactly what I needed. Looking at the matrix design it's unlike anything I've ever made before. It would explain why this problem, which I swear should be simple, has proven so tricky to get my head around. Again, thank you very much.

ADD REPLY

Login before adding your answer.

Traffic: 756 users visited in the last hour
Help About
FAQ
Access RSS
API
Stats

Use of this site constitutes acceptance of our User Agreement and Privacy Policy.

Powered by the version 2.3.6