


---
title: "Statistical analysis of RNAseq data" 
author: "D.-L. Couturier"
date: '`r format(Sys.time(), "Last modified: %d %b %Y")`'
output:
  html_document:
    theme: united 
    highlight: tango
    code_folding: show    
    toc: true           
    toc_depth: 2       
    toc_float: true     
    fig_width: 8
    fig_height: 6
---



<!--- rmarkdown::render("~/courses/cruk/RNAseqWithR/201903/tex/sc/03-StatisticalModels.Rmd") --->

```{r message = FALSE, warning = FALSE, echo = FALSE} 
# change working directory: should be the directory containg the Markdown files:
setwd("~/courses/cruk/RNAseqWithR/201903/git_RNAseq_March_2019/Course_Materials/")

```


# Section 1: Analysis of gene expression measured with Microarrays 


Lets starts by

* importing the data set *microarrays* with the function `read.csv()`  

## Section 1B: Student T-test

Boxplot of the data:
```{r message = FALSE, warning = FALSE, echo = TRUE} 
microarrays = read.csv("data/03-microarrays.csv",row.names=1)
boxplot(expression~celltype,data=microarrays,col="light gray",
        ylab = "Gene expression", xlab = "Cell type")
```

Student's T-test:
```{r message = FALSE, warning = FALSE, echo = TRUE}
Basal = microarrays$expression[microarrays$celltype=="Basal"]
Luminal = microarrays$expression[microarrays$celltype=="Luminal"]
t.test(Basal,Luminal,var.equal=TRUE)
```

By hand:
```{r message = FALSE, warning = FALSE, echo = TRUE}
# means
mu.hatB = mean(Basal)
mu.hatL = mean(Luminal)
# sample size
n.B = length(Basal)
n.L = length(Luminal)
# standard deviation
sigma.hatB = sqrt(var(Basal))
sigma.hatL = sqrt(var(Luminal))
# pool standard dev
Sigma.pool = sqrt((sigma.hatB^2*(n.B-1)+sigma.hatL^2*(n.L-1))/(n.B+n.L-2))
# test stat
T.stat = (mu.hatB-mu.hatL)/(Sigma.pool*sqrt(1/n.B+1/n.L))
# number of degrees of freedom
n.df =  n.B+n.L-2
# p-value
2*(1-pt(T.stat,n.df))
```

As a linear model:
```{r message = FALSE, warning = FALSE, echo = TRUE}
fit = lm(expression~celltype-1,data=microarrays)
summary(fit)
#
fit = lm(expression~celltype,data=microarrays)
summary(fit)
```



## Section 1C: One-way ANOVA

Lets perform a Fisher's one-way ANOVA by means of the functions `aov()`

```{r message = FALSE, warning = FALSE, echo = TRUE} 
# model 1
summary(aov(expression~mousetype-1,data=microarrays))
summary(lm(expression~mousetype-1,data=microarrays))
# model 2
summary(aov(expression~mousetype,data=microarrays))
summary(lm(expression~mousetype,data=microarrays))
# model 3
summary(aov(expression~mousetype,data=microarrays))
summary(lm(expression~mousetype,data=microarrays))
```



## Section 1D: Two-way ANOVA

```{r message = FALSE, warning = FALSE, echo = TRUE}
# without interactions
summary(aov(expression~mousetype+celltype,data=microarrays))
summary(lm(expression~mousetype+celltype,data=microarrays))
anova(lm(expression~mousetype+celltype,data=microarrays))
# with interactions
summary(lm(expression~mousetype*celltype,data=microarrays))
summary(lm(expression~mousetype*celltype,data=microarrays))
anova(lm(expression~mousetype*celltype,data=microarrays))
model.matrix(~mousetype*celltype,data=microarrays)
```



## Section 1E: Linear model

Estimate the regression coefficients of the model with interation by hand 

```{r message = FALSE, warning = FALSE, echo = TRUE}
# prepare 
Y = microarrays$expression
X = model.matrix(~mousetype*celltype,data=microarrays)
# estimate
Beta.hat = solve(t(X)%*%X)%*%t(X)%*%Y
# compare
Beta.hat
summary(lm(expression~mousetype*celltype,data=microarrays))

```

For fun, simulate data with sigma = 2
```{r message = FALSE, warning = FALSE, echo = TRUE}
# prepare 
E  = rnorm(nrow(X),mean=0,sd=.25)
Y  = X%*%Beta.hat + E 
# estimate
summary(lm(Y~microarrays$mousetype*microarrays$celltype))
```


## Section 2: LNO model

```{r message = FALSE, warning = FALSE, echo = TRUE}
# install or load gamlss package
install.packages("gamlss")
library(gamlss)
# prepare 
E  = rnorm(nrow(X),mean=0,sd=.25)
Y  = exp(X%*%Beta.hat + E)
microarrays$Y = Y
# estimate
?LOGNO
summary(gamlss(Y~mousetype*celltype,data=microarrays,family="LOGNO"))
summary(lm(log(Y)~microarrays$mousetype*microarrays$celltype))
```



# 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)
```

