library(tidyverse)
library(kableExtra)
library(ggvenn)
kabex = function(o) o %>% kable(format="html", escape=F) %>% kable_styling(bootstrap_options = c("striped"))
var.n = function(x) 1/length(x) * sum( (x - mean(x))**2 )
t.stat = function(m1, m2, n1, n2, v1, v2) (m1-m2)/sqrt( (n1*v1 + n2*v2)  * (1/n1 + 1/n2) ) * sqrt(n1+n2-2)
rounding=2
correction=F
correction.start=function() ifelse(correction, '<font style="color: #F00000;">', "<!--")
correction.end=function() ifelse(correction, '</font>', "-->")

Contexte

La présence du marqueur (gène FLS2) induit une cascade de réactions résultant en réponses immunitaires de la plante Arabidopsis thaliana. Ici, vous voulez comparer le transcriptome entre plantes avec marqueur et plantes sans marqueur. Pour cela, vous marquez le transcriptome des plantes avec marqueur avec le fluorochrome vert (cy3) et le transcriptome des plantes sans marqueur avec le fluorochrome rouge (cy5). Vous disposez de 10 réplicats.

Test de l’expression différentielle d’un gène

Vous voulez tester l’expression différentielle d’un gène de réponse immunitaire. Pour cela, vous disposez des valeurs de sonde suivantes :

replicat=1:10
cy3=c(10, 30, 42, 12, 30, 47, 25, 27, 26, 41)
cy5=c(25, 47, 60, 47, 77, 56, 81, 70, 56, 68)
tibble(Réplicat=replicat, `Cy3 (G)`=cy3, `Cy5 (R)`=cy5) %>% t %>% kabex
Réplicat 1 2 3 4 5 6 7 8 9 10
Cy3 (G) 10 30 42 12 30 47 25 27 26 41
Cy5 (R) 25 47 60 47 77 56 81 70 56 68

Vous devez donc comparer (statistiquement) la moyenne de l’expression du gène des plantes avec et sans marqueur afin de déterminer si les moyennes sont différentes et donc de déterminer si le marqueur a un effet (significatif).

Elements de statistiques

On suppose que la population peut se résumer à (ou modéliser avec) une moyenne et un écart-type.

Exemple avec une population de moyenne \(µ = 30\) et d’écart-type \(\sigma = 10\) tous les 2 connus.

xi=seq(0,60,by=.01)
plot(xi, dnorm(xi, mean=30, sd=10), type='l', xlab='x', ylab='p(x)', main='Loi normale N(30,10)')

Quand on prend des individus au hasard dans la population, on a plus de chance de tomber sur quelqu’un proche de la moyenne.

En pratique, il est rarement possible de mesurer tous les individus d’une population. L’idée est d’estimer la moyenne et l’écart-type de la population à partir d’un échantillon, c’est-à-dire un certain nombre d’individus (→ taille de l’échantillon) pris au hasard. Il sera essentiel de pouvoir statistiquement quantifier la confiance que l’on peut accorder à ces estimation.

Moyenne de l’échantillon : \[\overline{X} = \frac{1}{n}\sum_{i=1}^{n} x_i\] avec \(n\) la taille de l’échantillon.

Ecart-type de l’échantillon noté \(S\) et variance \(S^2\) : \[S^2 = \frac{1}{n} \sum_{i=1}^{n} (x_i - \overline{X} )^2\]

3 échantillons de taille 10 pour la loi N(moyenne=30, écart-type=10)

par(mfrow=c(3,1))
sample.size = 10
smp = round(rnorm(sample.size,30,10))
stripchart(smp, method="stack", xlim=c(5,55), frame.plot=F, axes=F)
axis(1, col=NA, col.ticks=1)
abline(v=mean(smp), lty="dashed")
text(mean(smp), 0, paste0("Moyenne de l'échantillon : ", round(mean(smp),rounding)))
smp = round(rnorm(sample.size,30,10))
stripchart(smp, method="stack", xlim=c(5,55), frame.plot=F, axes=F)
axis(1, col=NA, col.ticks=1)
abline(v=mean(smp), lty="dashed")
text(mean(smp), 0, paste0("Moyenne de l'échantillon : ", round(mean(smp),rounding)))
smp = round(rnorm(sample.size,30,10))
stripchart(smp, method="stack", xlim=c(5,55), frame.plot=F, axes=F)
axis(1, col=NA, col.ticks=1)
abline(v=mean(smp), lty="dashed")
text(mean(smp), 0, paste0("Moyenne de l'échantillon : ", round(mean(smp),rounding)))

2 échantillons de taille 100 pour la loi N(moyenne=30, écart-type=10)

par(mfrow=c(2,1))
sample.size = 100
smp = round(rnorm(sample.size,30,10))
stripchart(smp, method="stack", xlim=c(5,55), frame.plot=F, axes=F)
axis(1, col=NA, col.ticks=1)
abline(v=mean(smp), lty="dashed")
text(mean(smp), 0, paste0("Moyenne de l'échantillon : ", round(mean(smp),rounding)))
smp = round(rnorm(sample.size,30,10))
stripchart(smp, method="stack", xlim=c(5,55), frame.plot=F, axes=F)
axis(1, col=NA, col.ticks=1)
abline(v=mean(smp), lty="dashed")
text(mean(smp), 0, paste0("Moyenne de l'échantillon : ", round(mean(smp),rounding)))

2 échantillons de taille 1000 pour la loi N(moyenne=30, écart-type=10)

stripchart(round(rnorm(1000,30,10)), method="stack", xlim=c(5,55), ylim=c(0,15), frame.plot = F)