Quelques exercices sur les QTL

Biais de ségrégation

Avant d'utiliser un marqueur (une fois qu'on a vérifié qu'il est bien polymorphe), il convient de s'assurer qu'on observe bien les proportions mendéliennes auxquelles on s'attend, à l'aide d'un test du Chi2.

F2

Dans une expérience, on constate les effectifs suivants dans la génération F2.

A:  7
B: 12
H: 20

Ces effectifs sont-ils semblables à ce à quoi on pouvait s'attendre ?

> chisq.test(c(7,12,20),p=c(.25,.25,.5))
      Chi-squared test for given probabilities
data:  c(7, 12, 20)
X-squared = 1.3077, df = 2, p-value = 0.52

Oui.

F2

Idem :

> chisq.test(c(10,4,23),p=c(.25,.25,.5))
      Chi-squared test for given probabilities
data:  c(10, 4, 23)
X-squared = 4.1351, df = 2, p-value = 0.1265

Lignées recombinantes

Dans une expérience avec des lignées recombinantes, on trouve les phénotypes suivants :

A:   15
B:   12
H:    6

Ces quantités sont-elles semblables à ce à quoi on pouvait s'attendre ?

# On ne tient pas compte des hétérozygotes
> chisq.test(c(15,12))
      Chi-squared test for given probabilities
data:  c(15, 12)
X-squared = 0.3333, df = 1, p-value = 0.5637

Oui.

TP : QTL chez le tournesol

Données

huile.BB <- c(40.74, 34.9, 33.5, 33.4, 36.47, 31.5, 36.7, 36, 37.22,
37.1, 38.64, 34.97, 31.78, 37.98, 38.75, NA, 31.45, 45.98, 37.76,
38.61, 36.38, 36.75, 35.4, 41.65, 42.63, 36.57, 40.5, 34.8, 32.55,
36.3, 37.23, 33.9, 36.36, 36.24, 36.35, 39.95, 35.53, 36.4, 39.58,
43.3, 36.98, 40.34, NA, 34.65, 34.44, 37.12, 38.4, 38.43, 32.3,
35.06, 33.7, 34.58, 35.98, 38.3, 38.67)

huile.Bb <- c(40.04, 35.65, 39, 38.16, 33.7, 37.5, 38.98, 41.2,
36.37, 40.6, 35.2, 40, 35.63, 34.02, 32.6, 37.8, 40, 33.8, 42.6,
42.6, 41.92, 43.3, 36.7, 33.25, 37.86, 40.8, 35.63, 37.98, 36.05,
36.53, 38.92, 42.54, 40.6, 40.32, 34.3, 35.9, 41.75, 40.33, 44.4,
42.55, 42.22, 39.6, 42.76, NA, 43.17, 39.5, 40.2, 34.58, 40.75,
43.54, 32.93, 43.84, 39.9, 39.03, 41.43, 39.03, 35.94, 39.43, 37.7,
37.2, 42.38, 36.75, 39.12, 42.75, 45.64, 48.9, 41.3, 38.8, 43.58,
36.63, 39.75, 46.8, 47.82, 34.48, 41.26, 42.43, 43.26, 35.22, 40.05,
37.28, 37.26, 36, 37.98, 37.52, 41.22, 32, 38.25, 40.24, 38.3,
42.34, 45.57, 37.84, 38.38, 46.6, 38.94, 40.56, 45.6, 40.7, 33.9,
39.7, 43.7, 35.83, 37.38, 41.85, 41.93, 40.28, 39.68, 38.88, 45.38,
41.72, 39.8, 40.03, 49.7, 37.57, 46.8, 46.07, 44.78, 40.35, 36.88,
32.05, 38.02, 30.17, 34.9, 39.14)

huile.bb <- c(46.3, 41.8, 47.6, 45.53, 42.88, 45.47, 49.06, 49.05,
46.2, 40.1, 47.58, 44.63, 51.45, 42.93, 50.2, 45.27, 43.03, 48.34,
50.3, 41.53, 46, 47.3, 50.4, 49.48, 47.46, 48.15, 41.02, 46.85,
37.93, 48.17, 42.93, 51.58, 42.94, 42.34, 46.3, 41.45, 49.62, 44.15,
41.9, 45.26, 50.42)

attaques.BB <- c(85.75, 70.09, 69.59, 74.31, 97.37, 79.24, 60.54,
44.07, 46.5, 63.83, 51.06, 89.49, 90, 66.15, 90, 73.58, 75.13,
66.03, 31.48, 94.23, 95.92, 92.65, 90, 62.06, 72.9, 89.77, 87.73,
86.85, 74.43, 68.97, 57.69, 86, 52.31, 66.15, 61.84, 85.81, 98.21,
71.94, 41.95, 88.1, 78.47, 46.31, 73.75, 96, 67.5, 98.08, 93.75,
83.92, 96.67, 92.86, 91.67, 81.25, 94.12, 89.97, 89.47)

attaques.Bb <- c(50, 75.36, 69.66, 74.37, 82.05, 86.31, 52.38,
47.65, 79.17, 77.3, 51.81, 71.79, 70.08, 69.41, 32.82, 55.65, 64.04,
64.07, 32.16, 49.31, 53.51, 31.29, 38.41, 79.17, 70.33, 60.1, 43.57,
23.57, 14.08, 78.46, 47.73, 35.93, 67.92, 68.75, 35.91, 5.95, 40.57,
64.46, 76.45, 61.54, 40.38, 74.48, 18.04, 88.23, 80.36, 46.3, 58.79,
67.39, 24.74, 80.64, 40.8, 77.08, 78.85, 87.98, 74.37, 86.41, 66.58,
88.83, 81.03, 68.52, 28.87, 97.73, 30.06, 70.54, 34.49, 48.33,
90.43, 49.42, 83.33, 86.23, 53.85, 70.69, 36.7, 42, 52.92, 79.27,
71.82, 48.53, 36.79, 84.46, 26.59, 57, 57.64, 62.93, 56.64, 67.46,
22.02, 33.97, 43.73, 68.61, 84.23, 66.58, 72.02, 14.29, 58.33,
44.58, 76, 75.05, 48.18, 53.23, 62.22, 69.38, 88.05, 76, 91.81,
56.36, 84.52, 54.83, 78.13, 92.11, 75.83, 50, 77.08, 70.54, 68.68,
75, 74.89, 39.6, 75.71, 75.39, 62.5, 58.82, 78.71, 65.63)

attaques.bb <- c(84.74, 80.59, 61.81, 46, 66.69, 37.63, 33.69,
27.08, 88.15, 25, 71.72, 56.74, 39.13, 29.26, 93.75, 28.22, 70.69,
60, 41.43, 42.31, 54.26, 45.23, 57.91, 68.75, 79.17, 73.75, 16.67,
69.08, 42.68, 47.62, 60.09, 70, 75.83, 72.26, 82.11, 73.75, 89.29,
35, 46.65, 82.21, 62.14)

poids.BB <- c(22.02, 14.96, 15.65, 19.7, 9.48, 6.44, 13.18, 7.06,
37.2, 9.94, 11.42, 5.56, 18, 28.2, 12.34, 0.72, 21.55, 24.4, 23.78,
13.48, 16.38, 8.1, 5.2, 13, 19.94, 5.94, 15.46, 2.45, 6.32, 14.98,
12.04, 35.58, 20.84, 28.62, 13.68, 29.74, 14.65, 18.16, 6.92, 11.73,
16.18, 23.8, 2.1, 6.04, 11.78, 15.16, 11.3, 15.84, 16.88, 25, 10.14,
19.16, 17.74, 9.2, 15.25)

poids.Bb <- c(14.02, 13.14, 8.58, 34.4, 18.08, 8.98, 13.96, 9.32, 16.1,
8.25, 16.08, 24.2, 7.34, 28.9, 9.5, 13.06, 20.66, 16.8, 5.65, 13.8,
10.34, 16.8, 9.7, 13.1, 19.28, 13.86, 10.44, 10.56, 11.46, 11.03,
23.9, 11.96, 9, 13.42, 9.56, 11.58, 3.38, 17.06, 31.38, 16.05, 8.74,
9.48, 26.34, 6.43, 8.7, 13.86, 20.76, 13.36, 10.7, 12.18, 12.04,
31.16, 26.84, 14.18, 14.3, 10.78, 12.2, 12.52, 33.06, 20.46, 11.86,
17.56, 24.78, 13.24, 13.78, 5.62, 18.34, 6.04, 20.26, 8.44, 9.08,
11.62, 11.52, 11.06, 16.42, 14.12, 16.92, 24.74, 22.85, 11.02,
14.54, 26.18, 20.78, 18.08, 13.52, 16.86, 11.25, 10.68, 19.78,
28.88, 11.46, 15.28, 30.46, 6.9, 20.64, 17.84, 14.78, 3.6, 5.96,
14.03, 10.54, 10.36, 12.68, 14.72, 5.68, 20.1, 20.76, 17.6, 21.8,
31.88, 13.96, 10.14, 5.04, 6.46, 3.43, 13.43, 7.32, 5.76, 14.86,
10.94, 25.2, 10.24, 17.9, 20.82)

poids.bb <- c(11.3, 3.84, 4.84, 7.36, 10.16, 7.12, 10.56, 6.88, 9.56,
5.86, 14.2, 8.64, 7.62, 4.65, 7.56, 7.5, 12.05, 12.48, 6.96, 10.38,
16.3, 13.64, 14.68, 14.56, 11.96, 16.55, 7.88, 4.65, 14.17, 16.1,
4.72, 10.9, 11.82, 13.48, 5.42, 3.3, 12.2, 7.35, 9.04, 17.24, 18.3)

d1 <- data.frame(
  phenotype=c(attaques.BB,attaques.Bb,attaques.bb),
  genotype=c(rep("BB",length(attaques.BB)),
             rep("Bb",length(attaques.Bb)),
             rep("bb",length(attaques.bb))))
d2 <- data.frame(
  phenotype=c(huile.BB,huile.Bb,huile.bb),
  genotype=c(rep("BB",length(huile.BB)),
             rep("Bb",length(huile.Bb)),
             rep("bb",length(huile.bb))))
d3 <- data.frame(
  phenotype=c(poids.BB,poids.Bb,poids.bb),
  genotype=c(rep("BB",length(poids.BB)),
             rep("Bb",length(poids.Bb)),
             rep("bb",length(poids.bb))))

d <- data.frame(attaques=d1$phenotype, 
                huile=d2$phenotype, 
                poids=d3$phenotype, 
                genotype=d1$genotype)
plot(d[,1:3], col=(1:3)[d$genotype], pch=15)

*

draw.ellipse <- function (x, y=NULL, N=100, method=lines, ...) {
  if (is.null(y)) {
    y <- x[,2]
    x <- x[,1]
  }
  centre <- c(mean(x,na.rm=T), mean(y,na.rm=T))
  m <- matrix(c(var(x,na.rm=T),cov(x,y,use='c'),cov(x,y,use='c'),var(y,na.rm=T)),nr=2,nc=2)
  e <- eigen(m)
  r <- sqrt(e$values)
  v <- e$vectors
  theta <- seq(0,2*pi, length=N)
  x <- centre[1] + r[1]*v[1,1]*cos(theta) + r[2]*v[1,2]*sin(theta)
  y <- centre[2] + r[1]*v[2,1]*cos(theta) + r[2]*v[2,2]*sin(theta)
  method(x,y,...)
}

my.plot <- function (d, f, col=rainbow(length(levels(f))),
                     draw=draw.ellipse, ...) {
  plot(d, col=col[as.numeric(f)], pch=16, ...)
  for (i in 1:length(levels(f))) {
    try(
      draw(d[ as.numeric(f)==i, ], col=col[i])
    )
  }
  abline(h=0,lty=3)
  abline(v=0,lty=3)
  legend(par('usr')[1],par('usr')[3],xjust=0,yjust=0,
         levels(f),
         col=col,
         lty=1,lwd=3)
}

op <- par(mfrow=c(2,2))
my.plot(d[,c(1,2)], d$genotype)
plot.new()
my.plot(d[,c(1,3)], d$genotype)
my.plot(d[,c(2,3)], d$genotype)
par(op)

*

Ces graphiques suggèrent : le marqueur est lié à la résistance aux attaques et à la teneur en huile mais pas vraiment au poids du grain, le QTL "résistance aux attaques" est dominant, le QTL "teneur en huile" est plutôt additif.

Plan d'étude

1. Pour chaque QTL, regarder sa distribution. Faire éventuellement une transformation pour que les données soient gaussiennes. Les transformations les plus courrantes sont des élévations à la puissance ou le logarithme.

Pour cet exercice, on nous suggère arcsin(sqrt(p)), sqrt(p), log(p).

2. Faire une analyse de variance pour voir si le QTL est lié au marqueur qui nous intéresse.

3. Corriger la p-valeur en considérant qu'il y a 290 marqueurs sur la carte génétique.

4. Faire des tests afin de voir si le QTL (enfin, le morceau du QTL qui est proche du marqueur) est additif ou dominant.

Pourcentage d'attaques : graphiques

On commence par regarder les données.

library(lattice)
bwplot(~phenotype|genotype,data=d1,layout=c(1,3))

*

densityplot(~phenotype|genotype,data=d1,layout=c(1,3))

*

Pourcentage d'attaques : normalité

Les données ne sont visiblement pas normales. On regarde les différentes transformations qui nous sont suggérées.

densityplot(~phenotype|genotype,data=d1, layout=c(1,3))

*

densityplot(~sqrt(phenotype)|genotype,data=d1, layout=c(1,3))

*

densityplot(~log(phenotype)|genotype,data=d1, layout=c(1,3))

*

densityplot(~asin(phenotype/100)|genotype,data=d1, layout=c(1,3))

*

densityplot(~asin(sqrt(phenotype/100))|genotype,data=d1, layout=c(1,3))

*

Les graphiques quantiles/quantiles sont une autre manière de regarder la normalité d'une variable.

transformations <- c( 
  function(x){x},
  function(x){sqrt(x)}, 
  function(x){asin(x/100)},
  function(x){asin(sqrt(x/100))},
  function(x){log(x)}
)
op <- par(mfrow=c(5,3))
for (f in transformations) {
  for (i in 1:3) {
    x <- f(d1$phenotype[d1$genotype==levels(d1$genotype)[i]])
    qqnorm(x, main=round(shapiro.test(x)$p.value,3))
    qqline(x, col='red')
  }
}
par(op)

*

Il y a encore une manière de regarder la normalité d'une variable : le test de Shapiro-Wilk (dont la p-valeur apparaît comme titre des diagrammes quantiles/quantiles précédents).

for (f in transformations) {
  res <- rep(NA,3)
  for (i in 1:3) {
    res[i] <- shapiro.test(f(d1$phenotype[d1$genotype==levels(d1$genotype)[i]]))$p.value
  }
  print(res)
}

Il vient :

[1] 0.267568407 0.001633154 0.002006893
[1] 1.061572e-01 2.220330e-06 3.198249e-04
[1] 0.5525346 0.4585406 0.1770722
[1] 0.7261533 0.0817244 0.1438315
[1] 1.012883e-02 1.291891e-10 2.966839e-05

On choisit donc la transformation 3 ou 4. L'énoncé nous demandait de prendre asin(sqrt(x/100)) : c'est correct, c'est ce qu'on prendra.

Pourcentage d'attaques : équivariance

Avant de faire une analyse de la variance, il convient de vérifier que ses hypothèses sont bien satisfaites : nous venons de voir la normalité, il reste l'équivariance.

> bartlett.test(phenotype~genotype,data=d1)
      Bartlett test for homogeneity of variances
data:  phenotype by genotype
Bartlett's K-squared = 2.2705, df = 2, p-value = 0.3213

Pour la transformation que nous venons de choisir :

> bartlett.test(asin(sqrt(phenotype/100))~genotype,data=d1)
      Bartlett test for homogeneity of variances
data:  asin(sqrt(phenotype/100)) by genotype
Bartlett's K-squared = 0.1831, df = 2, p-value = 0.9125

Pourcentage d'attaques : analyse de la variance

On peut maintenant passer à l'analyse de la variance : le génotype (plus précisément : le marqueur dont on dispose) a-t-il un effet sur le phénotype ?

> summary(lm(asin(sqrt(phenotype/100))~genotype,data=d1))
 
Call:
lm(formula = asin(sqrt(phenotype/100)) ~ genotype, data = d1)

Residuals:
    Min      1Q  Median      3Q     Max
-0.6585 -0.1455  0.0274  0.1538  0.5146

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  0.87652    0.03380  25.933  < 2e-16 ***
genotypeBb   0.02840    0.03899   0.728    0.467
genotypeBB   0.21883    0.04465   4.900 1.87e-06 ***

Residual standard error: 0.2164 on 217 degrees of freedom
Multiple R-Squared: 0.1385,     Adjusted R-squared: 0.1305
F-statistic: 17.44 on 2 and 217 DF,  p-value: 9.486e-08

La p-valeur est de l'ordre de 10^-7 : il y a des différences notables.

Correction des p-valeurs

Les p-valeurs données sont correctes si on ne fait qu'un seul test : c'est la probabilité qu'on rejette à tors l'hypothèse nulle.

Par contre, si on fait une multitude de tests, on aimerait avoir la probabilité de rejeter à tors l'une des hypothèses nulles.

Si on fait N tests et si on suppose qu'il sont indépendants, on remplace la p-valeur p par :

1-(1-p)^N.

(Je crois que ça s'appelle la "correction de Sidak".)

(Si les tests ne sont pas indépendants, cette p-valeur est "trop prudente".)

(On parle parfois de "correction de Bonferroni" : il s'agit de remplacer p par N*p. La correction mentionnée plus haut est plus pertinente.)

Il existe plein d'autres corrections (très utilisées pour l'analyse de résultats de puces à ADN) : sous R, voir par exemple la fonction mt.rawp2adjp de la bibliothèque multtest. Voir aussi, de manière plus générale, le projet bioconductor.

Dans notre cas :

> 1-(1-1e-7)^290
[1] 2.899958e-05

Pourcentage d'attaques : Effets additifs ou dominants ?

r <- lm(asin(sqrt(phenotype/100)) ~ genotype, data = d1)
r.dominant <- lm(asin(sqrt(phenotype/100)) ~ 
                 factor(d1$genotype %in% c('BB','Bb')), data = d1)
r.additif <- lm(asin(sqrt(phenotype/100)) ~
                ifelse(d1$genotype=="BB",1,ifelse(d1$genotype=="Bb",0,-1)), data=d1)

Le modèle complet est-il meilleur que le modèle dominant ?

>   anova(r.dominant,r)
Analysis of Variance Table

Model 1: asin(sqrt(phenotype/100)) ~ factor(d1$genotype %in% c("BB", "Bb"))
Model 2: asin(sqrt(phenotype/100)) ~ genotype
  Res.Df     RSS  Df Sum of Sq      F    Pr(>F)
1    218 11.5458
2    217 10.1642   1    1.3816 29.497 1.496e-07 ***
---
Signif. codes:  0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1

Oui.

Le modèle complet est-il meilleur que le modèle additif ?

> anova(r.additif,r)
Analysis of Variance Table

Model 1: asin(sqrt(phenotype/100)) ~ ifelse(d1$genotype == "BB", 1, ifelse(d1$genotype ==
    "Bb", 0, -1))
Model 2: asin(sqrt(phenotype/100)) ~ genotype
  Res.Df     RSS  Df Sum of Sq      F   Pr(>F)
1    218 10.5150
2    217 10.1642   1    0.3508 7.4901 0.006718 **

Oui.

On gardera donc un modèle semi-additif.

Production d'huile

Regardons les données :

library(lattice)
bwplot(~phenotype|genotype,data=d2,layout=c(1,3))

*

Normalité des données, quelques transformations :

densityplot(~phenotype|genotype,data=d2, layout=c(1,3))

*

densityplot(~sqrt(phenotype)|genotype,data=d2, layout=c(1,3))

*

densityplot(~log(phenotype)|genotype,data=d2, layout=c(1,3))

*

densityplot(~asin(phenotype/100)|genotype,data=d2, layout=c(1,3))

*

densityplot(~asin(sqrt(phenotype/100))|genotype,data=d2, layout=c(1,3))

*

transformations <- c( 
  function(x){x},
  function(x){sqrt(x)}, 
  function(x){asin(x/100)},
  function(x){asin(sqrt(x/100))},
  function(x){log(x)}
)
op <- par(mfrow=c(5,3))
for (f in transformations) {
  for (i in 1:3) {
    x <- f(d2$phenotype[d2$genotype==levels(d2$genotype)[i]])
    qqnorm(x, main=round(shapiro.test(x)$p.value,3))
    qqline(x, col='red')
  }
}
par(op)

*

for (f in transformations) {
  res <- rep(NA,3)
  for (i in 1:3) {
    res[i] <- shapiro.test(f(d2$phenotype[d2$genotype==levels(d2$genotype)[i]]))$p.value
  }
  print(res)
}

[1] 0.3450675 0.9373818 0.2105760
[1] 0.2979586 0.9905358 0.3980080
[1] 0.3694092 0.8607130 0.1607268
[1] 0.3427520 0.9713968 0.2756805
[1] 0.2431749 0.9778920 0.6001771

On choisit de ne pas faire de transformation.

Equivariance :

> bartlett.test(phenotype~genotype,data=d2)
      Bartlett test for homogeneity of variances
data:  phenotype by genotype
Bartlett's K-squared = 3.6616, df = 2, p-value = 0.1603

Analyse de la variance :

> summary(lm(phenotype~genotype,data=d2))

Call:
lm(formula = phenotype ~ genotype, data = d2)

Residuals:
     Min       1Q   Median       3Q      Max
-9.38951 -2.29951 -0.05698  2.27439 10.14049

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  45.8756     0.5506  83.316   <2e-16 ***
genotypeBb   -6.3161     0.6358  -9.934   <2e-16 ***
genotypeBB   -9.0686     0.7333 -12.367   <2e-16 ***
---
Signif. codes:  0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1

Residual standard error: 3.526 on 214 degrees of freedom
Multiple R-Squared: 0.4265,     Adjusted R-squared: 0.4211
F-statistic: 79.57 on 2 and 214 DF,  p-value: < 2.2e-16

Correction de la p-valeur :

> 1-(1-2.2e-16)^290
[1] 6.439294e-14

QTL partiellement additif :

r <- lm(phenotype ~ genotype, data = d2)
r.dominant <- lm(phenotype ~ 
                 factor(d2$genotype %in% c('BB','Bb')), data = d2)
r.additif <- lm(phenotype ~
                ifelse(d2$genotype=="BB",1,ifelse(d2$genotype=="Bb",0,-1)), data=d2)

> anova(r,r.dominant)
Analysis of Variance Table
Model 1: phenotype ~ genotype
Model 2: phenotype ~ factor(d2$genotype %in% c("BB", "Bb"))
  Res.Df     RSS  Df Sum of Sq      F    Pr(>F)
1    214 2660.14
2    215 2940.77  -1   -280.63 22.576 3.703e-06 ***

>  anova(r,r.additif)
Analysis of Variance Table
Model 1: phenotype ~ genotype
Model 2: phenotype ~ ifelse(d2$genotype == "BB", 1, ifelse(d2$genotype ==
    "Bb", 0, -1))
  Res.Df     RSS  Df Sum of Sq      F    Pr(>F)
1    214 2660.14
2    215 2827.72  -1   -167.58 13.481 0.0003044 ***

Poids des grains

Regardons les données :

bwplot(~phenotype|genotype,data=d3,layout=c(1,3))

*

Normalité des données, quelques transformations :

densityplot(~phenotype|genotype,data=d3, layout=c(1,3))

*

densityplot(~sqrt(phenotype)|genotype,data=d3, layout=c(1,3))

*

densityplot(~log(phenotype)|genotype,data=d3, layout=c(1,3))

*

transformations <- c( 
  function(x){x},
  function(x){sqrt(x)}, 
  function(x){log(x)}
)
op <- par(mfrow=c(3,3))
for (f in transformations) {
  for (i in 1:3) {
    x <- f(d3$phenotype[d3$genotype==levels(d3$genotype)[i]])
    qqnorm(x, main=round(shapiro.test(x)$p.value,3))
    qqline(x, col='red')
  }
}
par(op)

*

for (f in transformations) {
  res <- rep(NA,3)
  for (i in 1:3) {
    res[i] <- shapiro.test(f(d3$phenotype[d3$genotype==levels(d3$genotype)[i]]))$p.value
  }
  print(res)
}

[1] 2.170423e-01 3.717989e-05 1.452725e-01
[1] 0.3217445 0.1262890 0.8679819
[1] 0.1109250427 0.0606293629 0.0000675456

Equivariance :

for (f in transformations) {
  print(bartlett.test(f(phenotype)~genotype,data=d3)$p.value)
}

[1] 0.0001150813
[1] 0.005037395
[1] 0.0005259798

C'est très mauvais, dans tous les cas. On choisira la transformation "racine carrée", qui est la "moins pire".

Analyse de la variance :

Call:
lm(formula = sqrt(phenotype) ~ genotype, data = d3)

Residuals:
     Min       1Q   Median       3Q      Max
-2.88597 -0.52969 -0.02874  0.54184  2.36468

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)   3.1089     0.1400  22.201  < 2e-16 ***
genotypeBb    0.6387     0.1615   3.954 0.000104 ***
genotypeBB    0.6256     0.1850   3.381 0.000855 ***
---
Signif. codes:  0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1

Residual standard error: 0.8966 on 217 degrees of freedom
Multiple R-Squared: 0.07155,    Adjusted R-squared: 0.06299
F-statistic: 8.361 on 2 and 217 DF,  p-value: 0.0003177

Correction de la p-valeur :

> 1-(1-0.0003177)^290
[1] 0.0880295

La liaison entre le QTL et le marqueur n'est plus significative. On arrête l'analyse.

A cause du problème d'équivariance, on aurait pu faire une analyse de la variance non paramétrique, qui conduit aux mêmes conclusions :

> r <- kruskal.test(phenotype ~ genotype, data=d3)
> r
        Kruskal-Wallis rank sum test
data:  phenotype by genotype
Kruskal-Wallis chi-squared = 16.4084, df = 2, p-value = 0.0002735

> 1-(1-r$p.value)^290
[1] 0.07626181

Conclusions

On peut résumer tous les tests précédents dans un tableau.

                   Attaque            Huile                Poids
----------------------------------------------------------------------------
Transformation    asin(sqrt(x))       aucune               sqrt(x)
Shapiro           0.73, 0.08, 0.14    0.35, 0.94, 0.21     0.32, 0.13, 0.87
Bartlett          0.91                0.1603               0.005
Anova             1e-7                1e-16                3e-4
Anova (corrigé)   3e-5                1e-13                .09
Additif ?         1e-7                4e-6
Dominant ?        7e-3                3e-4

Les QTL "Attaque" et "Huile" sont liés au marqueur, le QTL "Poids" non.

Vincent Zoonekynd
<zoonek@math.jussieu.fr>
latest modification on Tue Feb 24 20:52:14 CET 2004