distances génétiques

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

herve chapuis
Messages : 110
Enregistré le : 05 Déc 2008, 15:26

distances génétiques

Messagepar herve chapuis » 24 Mai 2018, 12:24

Bonjour à tous,

Débutant dans la GWAS, je me suis lancé dans GenAbel.

Grâce à la fonction ibs(), on peut calculer une distance entre individus à partir des marqueurs.

Code : Tout sélectionner

> TsaiyaRFI.gkin[1:5,1:5]
           230051       230064       230053       230038       230054
230051 0.69181443 6.786500e+04 6.792600e+04 6.745600e+04 6.797600e+04
230064 0.02664986 6.746765e-01 6.779900e+04 6.740800e+04 6.786300e+04
230053 0.05058215 1.827279e-02 7.605652e-01 6.738500e+04 6.794600e+04
230038 0.04776457 8.667402e-02 7.369850e-02 7.303391e-01 6.745000e+04
230054 0.03814102 1.890136e-02 1.054625e-01 3.672067e-02 7.317633e-01

Et ce qui m'intéresse ici c'est le triangle inférieur de cette matrice.
J'applique (bêtement ?) les instructions pour représenter le nuage des mes individus dans le plan principal, et ça marche plutôt bien.

Code : Tout sélectionner

TsaiyaRFI.gkin<-ibs(TsaiyaRFI[,autosomal(TsaiyaRFI)],weight="freq")
TsaiyaRFI.dist<-as.dist(0.5-TsaiyaRFI.gkin)
TsaiyaRFI.mds<-cmdscale(TsaiyaRFI.dist)
phdata(TsaiyaRFI)$line<-as.factor(phdata(TsaiyaRFI)$line)
jpeg(filename="nuageRFI_0.jpg",height=800,width=800)
plot(TsaiyaRFI.mds,col=as.numeric(phdata(TsaiyaRFI)$line),main="Nuage des génotypes Tsaiya sur plan principal",xlab="axe1",ylab="axe2")
abline(h=0,lty=2)
abline(v=0,lty=2)
legend("bottomleft",legend=levels(phdata(TsaiyaRFI)$line),pch=1,col=c(1,2),cex=1.2)
dev.off()

Je dis "bêtement" car je ne comprends pas pourquoi il faut appliquer le as.dist() sur "0.5 - TsaiyaRFI.gkin" et non sur TsaiyaRFI.gkin. Toujours est-il que si je le fais j'ai un joli graphe, alors qu'il est ultra moche si je l'applique directement sur la matrice qui sort de ibs().

Je désire maintenant comparer les distances obtenues avec les marqueurs et les distances obtenues par le pedigree.
Pour cela j'utilise la fonction makeA() du package pedigree.Ceci me permet de créer une table matA qui contient les coefficients de parenté entre les individus.

Code : Tout sélectionner

> matA[1:5,]
     i    j        a
1 3411 3411 1.125240
2 3412 3411 0.168365
3 3412 3412 1.082430
4 3414 3411 0.179199
5 3414 3412 0.284164

Malheureusement les lignes & colonnes sont numérotées de 1 à n.
Après les fusions idoines j'obtiens néanmoins un fichier avec les mêmes identifiants que ceux utilisés par ibs():

Code : Tout sélectionner

> matA[1:5,]
     j    i         a   id.i   id.j
1 3411 3411 1.1252400 230001 230001
2 3411 3412 0.1683650 230004 230001
3 3411 3573 0.4840090 230403 230001
4 3411 3414 0.1791990 230006 230001
5 3411 3646 0.0258942 231044 230001


Mon problème est d'arriver à obtenir une matrice avec pour identifiant des lignes et colonnes les quantités id.i et id.j, matrice que je pourrais ensuite comparer à celle donnée par ibs().
C'est une matrice symétrique et la fonction makeA() ne me donne que de quoi en remplir la moitié, diagonale comprise, soit 20910 (= 204*205/2) termes.

Savez-vous comment je pourrais créer cette matrice ?
Et à supposer que je parvienne à réaliser le même type de graphique, quel moyen objectif me conseilleriez-vous pour comparer l'information pedigree (donnée par makeA() ) et l'information génomique (donnée par ibs() ) ?

Merci
Ingénieur de recherche INRAE Toulouse

Yann Labrune
Messages : 34
Enregistré le : 13 Juin 2008, 10:19

Re: distances génétiques

Messagepar Yann Labrune » 30 Mai 2018, 12:51

Une solution pour crée la matrice :

Code : Tout sélectionner


# J'ai les données en colonnes :
> head(dd1)
  V1 V2 dd
  1  1  1
  2  1 11
  3  1 21
  4  1 31
  5  1 41
  6  1 51
 
  # Je rentre les données "mirroir"
DD1 <- rbind(dd1,data.frame(V1=dd1$V2,V2=dd1$V1,dd=dd1$dd))

#Mais du coup j'ai la diagonal en double :
DD1 <- DD1[!duplicated(DD1),]
# Je trie
DD1 <- DD1[order(DD1$V1,DD1$V2),]
#Et voila
RES <- matrix(DD1[,3],ncol=10,nrow=10,byrow=T)



Il existe surement plus simple...

Yann

denis laloe
Messages : 119
Enregistré le : 28 Déc 2006, 13:05

Re: distances génétiques

Messagepar denis laloe » 31 Mai 2018, 13:05

Hello Hervé,
tu construis ta matrice de distance as.dist(0.5 - coef) parce que le "coef" est un indice de similarité qui doit être égal à 0.5 pour un individu avec lui-même. Donc 0.5-coef est un indice qui est d'autant plus grand que les individus sont similaires, et nul pour un individu avec lui-même, donc un indice de ditance
Pour la deuxième question, la fonction matrix sur ton vecteur convenablement trié devrait marcher:
matrix(data = matA$a, nrow = nombredelignes, ncol = nombredecolonnes, byrow = FALSE,
dimnames = NULL)

herve chapuis
Messages : 110
Enregistré le : 05 Déc 2008, 15:26

Re: distances génétiques

Messagepar herve chapuis » 12 Juin 2018, 14:10

Merci.
Désolé de n'avoir pas répondu plus vite.
Ingénieur de recherche INRAE Toulouse

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: distances génétiques

Messagepar Mickael Canouil » 13 Juin 2018, 15:40

Bonjour,

voici une petite proposition:

Code : Tout sélectionner

library(tidyverse)
dta <- read.table(text = "230051       230064       230053       230038       230054
230051 0.69181443 6.786500e+04 6.792600e+04 6.745600e+04 6.797600e+04
230064 0.02664986 6.746765e-01 6.779900e+04 6.740800e+04 6.786300e+04
230053 0.05058215 1.827279e-02 7.605652e-01 6.738500e+04 6.794600e+04
230038 0.04776457 8.667402e-02 7.369850e-02 7.303391e-01 6.745000e+04
230054 0.03814102 1.890136e-02 1.054625e-01 3.672067e-02 7.317633e-01", check.names = FALSE)

dta[lower.tri(dta)] <- NA # "remove" lower triangular matrix

dta %>%
  tibble::rownames_to_column(var = "ID1") %>%
  tidyr::gather(key = "ID2", value = "dist", -ID1) %>%
  dplyr::filter(!is.na(dist))

Image

Pour avoir le même format avec pedigree::makeA: (il transforme les identifiants en facteurs et ne conserve que les entiers correspondants)

Code : Tout sélectionner

id <- LETTERS[seq(6)]
dam <- c(0,0,1,1,4,4)
sire <- c(0,0,2,2,3,5)
ped <- data.frame(id,dam,sire)
pedigree::makeA(ped,which = c(rep(FALSE,4),rep(TRUE,2)))

A <- read.table("A.txt", col.names = c("ID1", "ID2", "dist"))
sort_id <- sort(id)
A[, 1]<-sort_id[A[, 1]]
A[, 2]<-sort_id[A[, 2]]


Ainsi, il est très facile de faire la jointure des deux tables sur ID1 et ID2

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité