2010-09-23 15 views
1

J'avais l'habitude d'avoir 2 expériences de facteur 2 par niveau qui ont été faites dans une expérience de 3 facteurs par 2 niveaux. En utilisant la pâte, j'ai pu faire 4 groupes uniques à partir de mes deux facteurs et faire un test de Fisher avec le résultat de savoir si un organisme a vécu ou est mort.Test exact de couple par paire post-hoc

fisher.test(mortal$alv.dead,paste(mortal$Strain,mortal$capsule)) 

Mais quand je voulais enquêter sur comparisions entre les groupes par paires individuels que je devais faire quelque filtrage inélégante de sorte que seuls deux groupes sont entrés l'analyse à la fois. Maintenant que j'ai plus de groupes, il est trop fastidieux de coder à la main chaque parement. Voici donc le test pêcheur à tester tous les groupes dans une analyse

fisher.test(mortal$alv.dead,paste(mortal$Strain,mortal$capsule,mortal$cassette)) 

Comment puis-je configurer une méthode qui crée et teste tous les appariements possibles?

+0

Essai de http://stats.st ackexchange.com/ – mbq

+0

@mbq: c'est vraiment une question de programmation, donc on peut y répondre aussi. Je ne vais pas parler de la justesse de l'approche, ce qui n'est pas vraiment le but de la question. –

+0

@Joris Je suis d'accord; c'est plutôt une publicité. – mbq

Répondre

2

Assez facile en utilisant la fonction combn(). La seule chose à prendre en compte est le fait que combn ne retournera pas correctement les noms des groupes lorsque vous placerez l'appel fisher.test() dans la fonction.

Nous avons donc besoin d'ajuster l'élément dans la liste en conséquence:

Certaines données de jouets:

mortal <- data.frame(
     alv.dead = sample(c("alv","dead"),30,replace=T), 
     train = sample(letters[1:3],30,replace=T), 
     capsule = sample(letters[4:5],30,replace=T), 
     cassette = sample(letters[6:7],30,replace=T) 
    ) 

Certaines variables supplémentaires

mortal$groups <- paste(mortal$train,mortal$capsule,mortal$cassette,sep="") 
unique.groups <- unique(mortal$groups) 

Et l'astuce:

combn(unique.groups,2,function(x){ 
    id <- mortal$groups %in% x 
    test <- fisher.test(table(mortal$alv.dead[id],mortal$groups[id])) 
    test$data.name <- 
     paste(
     unique(
      as.character(mortal$groups[id]) 
     ),collapse="-") 
    return(test)} 
    ,simplify=FALSE) 
+0

Cher Joris, vous êtes un génie! Wow ça a bien marché. Je ne connaissais pas la fonction combn. Je peux penser à tellement d'applications. L'argument simplifier est intéressant. Si laissé à False, il est bon de lire et de réfléchir tranquillement sur les données mais quand on veut les comparer rapidement, simplify = TRUE est étonnant car il place toutes les données dans un tableau. – Farrel