2017-09-20 4 views
0

J'ai une liste d'oiseaux individuels qui sont reliés entre eux d'un continuum de 0,0 (non apparenté) à 1,0 (jumeaux identiques). À un certain seuil (disons 0,25), ils sont trop liés pour l'analyse en aval et je veux en retirer un de l'ensemble de données. Parfois, cependant, les individus sont liés à plus d'un autre oiseau et dans mon jeu de données (~ 1700) cela devient rapidement compliqué. Quelqu'un a-t-il un code qui enlèverait les individus liés d'une manière qui minimise les pertes de l'ensemble de données? Dans les données d'exemple suivantes, Ind001 est lié à Ind002 et et Ind004, mais au lieu d'enlever les deux Ind002 et Ind004, je voudrais simplement supprimer Ind001:Comment puis-je supprimer un individu d'une liste de dyades apparentées?

données Exemple:

pair.no ind1.id ind2.id relatedness 
1038723 Ind001 Ind002 1.0 
1038895 Ind001 Ind003 0.2 
1280057 Ind001 Ind004 0.9 
1389905 Ind002 Ind003 0.0 
1390069 Ind002 Ind004 0.1 
1390069 Ind003 Ind004 0.1 
1390069 MNP002 MSW004 0.1 

Merci, Steve

Répondre

0

Que diriez-vous d'identifier les dyades les plus apparentées, puis de retirer en moyenne à tout le monde la personne ayant le lien le plus élevé jusqu'à ce que vous atteigniez votre seuil? En supposant données = ce que vous avez fourni ci-dessus, une approche pourrait être:

threshold = 0.25 #threshold for relatedness values 
pruned_data = data 

while(max(pruned_data$relatedness)>threshold){ 
    #find max relatedness estimate 
    maxrelate = max(pruned_data$relatedness) 

    #find records that are at the max relatedness 
    temp = pruned_data[pruned_data$relatedness==maxrelate,,drop=FALSE] 

    #find average relatedness for only those that are in the "max" group 
    maxindvs = data.frame(id = unique(c(as.character(temp$ind1.id), as.character(temp$ind2.id))), 
         mrelate = rep(0, length(unique(c(temp$ind1.id, temp$ind2.id))))) 
    for(i in 1:nrow(maxindvs)){ 
    itemp = rbind(pruned_data[as.character(pruned_data$ind1.id)==maxindvs[i,1],,drop=FALSE], 
        pruned_data[as.character(pruned_data$ind2.id)==maxindvs[i,1],,drop=FALSE]) 
    maxindvs$mrelate[i] = mean(itemp$relatedness) 
    } 

    #remove individual that is most related to all others 
    toremove = as.character(maxindvs[maxindvs$mrelate==max(maxindvs$mrelate),1]) 
    pruned_data = pruned_data[as.character(pruned_data$ind1.id)!=toremove & as.character(pruned_data$ind2.id)!=toremove,,drop=FALSE] 
}