# Section 1: Contrast matrices

## Import sample information

import the information file related to each sample of the Toxoplasma Gondii Oocysts' dataset and check the class of each column

```{r message = FALSE, warning = FALSE, echo = TRUE}
inf <- read.csv(file="../data/samplesheet_corrected.tsv",
                sep="\t",row.names=1)
sapply(inf,class)
```


## One 2-level factor:

define the design matrices corresponding to a model in which the gene expression is a function of *Status*

* without intercept
* with intercept


```{r message = FALSE, warning = FALSE, echo = TRUE} 
# model without intercept and default levels:
X1 = model.matrix(~ Status - 1, data = inf)
X1 
# model with intercept and default reference level:
X2 = model.matrix(~ Status, data = inf)
X2
# change the reference:
inf$Status = factor(inf$Status,levels=c("Uninfected","Infected"))
inf$Status
X3 = model.matrix(~ Status, data = inf)
X3
# matrix multiplication: let s assume a mean of 2 for infected mice and of 3 for uninfected ones
X1 %*% c(2, 3)
X2 %*% c(2, 1)
X3 %*% c(3,-1)
```


## One 3-level factor:

create the *modified/fake* three-level status variable *status3* and define the design matrices corresponding to a model in which the gene expression is a function of this three-level status variable

* without intercept
* with intercept
   

```{r message = FALSE, warning = FALSE, echo = TRUE} 
#
inf$Status3 = as.character(inf$Status)
inf$Status3[c(1,2,10,12)] = "Half-infected"
inf
# model without intercept and default levels:
X1 = model.matrix(~ Status3 - 1, data = inf)
X1
# model with intercept and default levels
X2 = model.matrix(~ Status3, data = inf)
X2
# model with intercept and self-defined levels
inf$Status3 = factor(inf$Status3,levels=c("Uninfected","Half-infected","Infected"))
inf$Status3
X3 = model.matrix(~ Status3, data = inf)
X3

# matrix multiplication: let s assume a mean of 
# > 2 for Uninfected 
# > 3 for Half-infected
# > 4 for Infected
# ! CHALLENGE !
# ! FIND the values of the BETA vector corresponding to X1, X2 and X3 !

```

## Two 2-level factors:

define the design matrices corresponding to a model in which the gene expression is a function of the two-level factors  status and time

* without interaction
* with interaction



```{r message = FALSE, warning = FALSE, echo = TRUE} 
# design matrix without interaction
X1 = model.matrix(~ Status + TimePoint, data=inf)
X1
# design matrix with interaction
X2 = model.matrix(~ Status * TimePoint, data=inf)
X2 
model.matrix(~ Status + TimePoint + Status:TimePoint, data=inf)

# matrix multiplication: let s assume a mean of 
# > 2 for Uninfected at 11 dpi
# > 3 for Infected at 11 dpi
# > 4 for Uninfected at 33 dpi
# > 6 for Infected at 33 dpi

# ! CHALLENGE !
# ! FIND the values of the BETA vector corresponding to X1 and X2!

```



# Section 2: DESeq2


## Introduction slide

Let's generate

* *cnts*, a toy matrix of counts of 1000 genes for 20 samples,
* *cond*, a vector indicating to which condition each sample belongs (1 for treatment 1, 2 for treatment 2),

```{r message = FALSE, warning = FALSE, echo = TRUE} 
set.seed(777)
cnts <- matrix(rnbinom(n=20000, mu=100, size=1/.25), ncol=20)
cond <- factor(rep(1:2, each=10))
```

Let's 

* combine the count matrix, the sample information and the assumed model in an object of class *DESeqDataSet*,
* perform the DE analysis via the function *DESeq*
* print the results

```{r message = FALSE, warning = FALSE, echo = TRUE}
library(DESeq2)
dds <- DESeqDataSetFromMatrix(cnts, DataFrame(cond), ~ cond)
dds <- DESeq(dds)
results(dds)
```

## Section 2 slides dedicated to dispersion 

Let's print the relevant information to deduce the estimated NB distribution assumed for each gene and condition:

```{r message = FALSE, warning = FALSE, echo = TRUE} 
mcols(dds)[,c("Intercept","cond_2_vs_1","dispGeneEst","dispFit","dispersion")]
```

Let's reproduce the plot showing the fitted probability mass functions per condition for gene 1:

```{r message = FALSE, warning = FALSE, echo = TRUE} 
axe.x = seq(0,400)
f.x1  = dnbinom(axe.x, mu=2^6.90565, size=1/0.274708)
f.x2  = dnbinom(axe.x, mu=2^(6.90565-0.682067), size=1/0.274708)

par(mfrow=c(1,1),mar=c(4,4,0,0))
ylimw = max(c(f.x1,f.x2))
plot(1,1,ylim=c(0,ylimw),xlim=c(0,max(axe.x)),pch="",xlab="Counts",ylab="Probability",
     axes=FALSE)
lines(axe.x,f.x1,col=.cruk$col[1])
lines(axe.x,f.x2,col=.cruk$col[3])
axis(1,pos=0)
axis(2,las=2,pos=0)
legend("topright",bg="light gray",lty=1,col=.cruk$col[c(1,3)],
       legend=c("Condition 1","Condition 2"),title="Estimated distributions",box.lwd=NA)
abline(v=2^6.90565,col=.cruk$col[1],lty=3)
abline(v=2^(6.90565-0.682067),col=.cruk$col[3],lty=3)

```


# Section 3: Large Scale Hypothesis testing: FDR


When we are doing thousands of tests for differential expression, the overall significance level of a test is very difficult to control. Let's see why:
First, we simulate 40,000 genes not differentially expressed (with a mean of zero). We assume that we have 10 replicates of this experiment:
```{r}

N <- 40000
R <- 10
X <- matrix(rnorm(N* R, 0, 1), nrow=N)
```
Now we assume that we run a t-test under the null hypothesis that the mean is zero for each of these genes, that is each row in the matrix:
```{r}
t.test(X[1,])$p.value
pvals <- apply(X, 1, function(y) t.test(y)$p.value)
```
Because we have generated this data with mean zero, we know that none of these genes are differentially expressed, so we would like to be able to not reject any of the hypothesis. However, if you choose a significance level of 0.05 we get 
```{r}
sum(pvals<0.05)
```
Too many rejections!!!
In fact, if we look at the distributions of the p-values obtained we get:
```{r}
hist(pvals)
```


That is, if the null hypothesis is true, the p-values will follow a uniform distribution.
This is the key to all methods that aim to control the proportion of false positives amongs the genes that we call differentially expressed. Let's add 1000 genes to our set that are really differentially expressed (mean of 1):
```{r}
df <- 1000
Y <- matrix(rnorm(df* R, 1, 1), nrow=df)
Z <- rbind(X, Y)
pvals <- apply(Z, 1, function(y) t.test(y)$p.value)
#
plot(pvals,col=rep(1:2,c(40000,1000)))
plot(p.adjust(pvals, method="BH"),col=rep(1:2,c(40000,1000)))
#
tapply(p.adjust(pvals, method="BH")<0.05,rep(1:2,c(40000,1000)),mean)
```
Let's look at the distribution of p-values now:
```{r}
hist(pvals)
```


What would be the number of false positives now? How many would we expect if we reject p-values samller than our significance level, 0.05?
```{r}
exp.sig<- (nrow(Z))*0.05
obs.sig <- sum(pvals<0.05)
FDR <- exp.sig / obs.sig
FDR
```
We can compare this with the Benjamini-Hochberg method:
```{r}
pvals.adj <- p.adjust(pvals, method="BH")
plot(pvals, pvals.adj)
abline(v=0.05, col=2)
```

