Test comparaison de 2 proportions - tableau de contingence

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

Aline Deschamps
Messages : 133
Enregistré le : 11 Mai 2010, 07:49
Contact :

Test comparaison de 2 proportions - tableau de contingence

Messagepar Aline Deschamps » 06 Juin 2011, 15:14

Bonjour à tous,

Je travaille actuellement sur des tableaux de contingence de deux variables qualitatives, créés à partir de la fonction "table".

Pour tester la dépendance entre mes deux variables, j'utilise un test du Khi-deux. Si celui-ci est significatif, ie. si mes deux variables qualitatives sont liées, je souhaite ensuite réaliser des tests de comparaison de deux proportions (je ne sais pas s'il y a un terme plus approprié pour ce genre de test, désolée...), ie. je souhaite, pour chaque ligne de mon tableau, comparer les proportions d'une valeur/case avec une autre, afin de déterminer si la différence entre ces deux proportions est significative ou non.

Ma question est la suivante : existe-t-il une fonction R permettant d'effectuer ce travail directement? Un genre de fonction qui prendrait en argument un objet de type "table" en entrée et nous renverrait en sortie une table avec les p-values?

Pour le moment je n'ai rien trouvé qui corresponde, j'ai donc commencé à programmer une fonction de ce genre moi-même, mais au cas où, je suis curieuse de savoir si cela existe déjà.

Merci d'avance :)


Cordialement,

A.D.

Eric Wajnberg
Messages : 786
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: Test comparaison de 2 proportions - tableau de contingen

Messagepar Eric Wajnberg » 06 Juin 2011, 15:22

Aline Deschamps a écrit :Ma question est la suivante : existe-t-il une fonction R permettant d'effectuer ce travail directement? Un genre de fonction qui prendrait en argument un objet de type "table" en entrée et nous renverrait en sortie une table avec les p-values?
A.D.


Ou bien j'ai mal compris la question, ou bien chisq.test() fait exactement cela (voir l'utilisation des différents arguments).

Eric.

Aline Deschamps
Messages : 133
Enregistré le : 11 Mai 2010, 07:49
Contact :

Re: Test comparaison de 2 proportions - tableau de contingen

Messagepar Aline Deschamps » 06 Juin 2011, 15:48

Eric Wajnberg a écrit :Ou bien j'ai mal compris la question, ou bien chisq.test() fait exactement cela (voir l'utilisation des différents arguments).

Eric.

Peut-être que c'est moi qui m'exprime mal ou bien qui ai du mal à comprendre, désolée :/
J'ai re-regardé l'aide en détails de la fonction "chisq.test" et je ne vois pas comment elle pourrait me permettre de réaliser ce que je souhaite, alors je vais essayer de m'expliquer autrement.

Disons par exemple que mes deux variables qualitatives étudiées sont les suivantes : la couleur des cheveux (lignes) qui peut prendre les valeurs : blond, brun, roux, et la couleur des yeux (colonnes) qui peut prendre les valeurs : vert, bleu, marron.

Un test du Khi-deux sur le tableau de contingence créé à partir de ces deux variables me permettra de déterminer si la couleur des yeux et celle des cheveux sont indépendantes ou non.

Ce que je souhaite déterminer c'est, si nous sommes dans le cas où le test de Khi-deux est significatif, ie. nos deux variables sont liées, quelles modalités de chaque variable sont liées entre elles.
Pour cela, je vais effectuer des tests par exemple entre la proportion de blonds aux yeux bleus et celle de blonds aux yeux verts, afin de déterminer si la différence entre ces deux proportions est significative ou non.

Désolée si tout ceci n'est pas très clair, je dois avouer avoir du mal à bien saisir le principe d'un tel test...

Encore merci à ceux qui pourront m'aider :)


Cordialement,

A.D.

Maxime Hervé
Messages : 427
Enregistré le : 03 Mar 2010, 14:21
Contact :

Messagepar Maxime Hervé » 06 Juin 2011, 16:38

Bonjour,

à ma connaissance il n'existe aucune fonction qui fait ça directement. C'est pour ça que j'en ai écrit une...hier ! Le principe (qui ne vient pas de moi) est de créer tous les tableaux de contingence possible entre 2 niveaux de chaque facteur, de réaliser un test exact de Fisher par tableau, et de corriger les p-values obtenues ensuite. En regardant le résultat de chaque test vous pouvez revenir aux classes qui sont liées.
Avec un exemple comme le vôtre, ça donne :

Code : Tout sélectionner

> tab.cont
      bleu marron vert
blond   25      6    9
brun    10     15   16
roux    12     14    9
> chisq.test(tab.cont)

        Pearson's Chi-squared test

data:  tab.cont
X-squared = 14.5763, df = 4, p-value = 0.005666

> fisher.multcomp(tab.cont)

Pairwise comparisons by Fisher's exact test for count data
  (correction: fdr)

        rows     columns odds.ratio  p.value
1 blond-brun bleu-marron    6.02006 0.022113
2 blond-brun   bleu-vert    4.32406 0.034353
3 blond-brun marron-vert    0.71640 0.779349
4 blond-roux bleu-marron    4.71441 0.034353
5 blond-roux   bleu-vert    2.05451 0.446549
6 blond-roux marron-vert    0.43854 0.480143
7  brun-roux bleu-marron    0.78164 0.779349
8  brun-roux   bleu-vert    0.47656 0.446549
9  brun-roux marron-vert    0.60841 0.536177

Vous voyez que tous les test deux-à-deux qui ont une p-value significative font intervenir la classe "blond" pour la couleur des cheveux et la classe "bleu" pour la couleur des yeux --> ce sont ces 2 classes qui sont liées.

Voici le code de la fonction, elle nécessite le package gtools :

Code : Tout sélectionner

fisher.multcomp <- function(tab.cont,p.method="fdr") {
  if (is.matrix(tab.cont)) {tab.cont<-as.table(tab.cont)}
  if (!is.table(tab.cont)) {stop("'tab.cont' is not a \"table\" object")}
  f1<-dimnames(tab.cont)[[1]]
  f2<-dimnames(tab.cont)[[2]]
  comb1<-combinations(length(f1),2,f1)
  comb2<-combinations(length(f2),2,f2)
  f1.lev=character(nrow(comb1)*nrow(comb2))
  f2.lev=character(nrow(comb1)*nrow(comb2))
  odr<-integer(nrow(comb1)*nrow(comb2))
  p<-integer(nrow(comb1)*nrow(comb2))
  for (i in 1:nrow(comb1)) {
    for (j in 1:nrow(comb2)) {
   tab<-tab.cont[c(comb1[i,1],comb1[i,2]),c(comb2[j,1],comb2[j,2])]
   f1.lev[i*nrow(comb2)-nrow(comb2)+j]<-paste(dimnames(tab)[[1]],collapse="-")
   f2.lev[i*nrow(comb2)-nrow(comb2)+j]<-paste(dimnames(tab)[[2]],collapse="-")
   test<-fisher.test(tab)
   odr[i*nrow(comb2)-nrow(comb2)+j]<-test$estimate
   p[i*nrow(comb2)-nrow(comb2)+j]<-test$p.value
    }
  }
  p.adj<-p.adjust(p,method=p.method)
  recap<-data.frame(f1.lev,f2.lev,odr,p.adj)
  names(recap)<-c("rows","columns","odds.ratio","p.value")
  result<-list(p.method=p.method,levels=recap[,1:2],odds.ratio=odr,p.value=p.adj,multcomp=recap)
  class(result)<-c("fisher.multcomp","list")
  return(result)
}

print.fisher.multcomp <- function(x) {
  cat(paste("\nPairwise comparisons by Fisher's exact test for count data\n  (correction: ",x$p.method,")\n\n",sep=""))
  print(x$multcomp,digits=5)
  cat("\n")
}


Maxime

Aline Deschamps
Messages : 133
Enregistré le : 11 Mai 2010, 07:49
Contact :

Messagepar Aline Deschamps » 08 Juin 2011, 12:29

Bonjour,

Tout d'abord, merci beaucoup pour votre réponse :)

J'avais déjà rencontré la méthode que vous proposez (dans l'ouvrage "Comprendre et réaliser les tests statistiques avec R: Manuel pour les débutants", de Gaël Millot, section 5.4.3, partiellement accessible via google books), mais je n'en comprenais pas bien la signification.
En clair, si pour une combinaison de modalités données, par exemple cheveux blonds - yeux bleus, toutes les p-value sont significatives, alors ces deux classes sont liées.

Le soucis, je trouve mais il y a peut-être moyen d'y remédier en programmant les choses différemment, c'est que cette approche demande une "lecture" du tableau obtenu en sortie afin de regrouper les classes liées.
Ce que je voulais faire, idéalement, c'est reproduire un format de sortie fourni par un autre logiciel de tabulation, mais en utilisant R. Ce logiciel fourni le tableau d'effectif, et pour chaque case du tableau, il ajoute les noms des classes qui sont liées à celle correspondant à la colonne où l'on se trouve.

De plus, les tests que je souhaite effectuer sont sur ce principe : tester si "blond-bleu" et "blon-marron" sont liées, "blond-bleu" et "blond-vert", "blond-marron" et "blond-vert", "brun-bleu" et "brun-marron", etc...


Je ne sais pas si tout ceci est très clair, veuillez m'excusez pour ma confusion...

Encore merci pour votre réponse.


Cordialement,

A.D.

Maxime Hervé
Messages : 427
Enregistré le : 03 Mar 2010, 14:21
Contact :

Messagepar Maxime Hervé » 08 Juin 2011, 13:02

Aline Deschamps a écrit :J'avais déjà rencontré la méthode que vous proposez (dans l'ouvrage "Comprendre et réaliser les tests statistiques avec R: Manuel pour les débutants", de Gaël Millot, section 5.4.3, partiellement accessible via google books), mais je n'en comprenais pas bien la signification.

C'est de là que me vient l'idée :)

Aline Deschamps a écrit :En clair, si pour une combinaison de modalités données, par exemple cheveux blonds - yeux bleus, toutes les p-value sont significatives, alors ces deux classes sont liées.

Oui c'est bien ça.

Aline Deschamps a écrit :Le soucis, je trouve mais il y a peut-être moyen d'y remédier en programmant les choses différemment, c'est que cette approche demande une "lecture" du tableau obtenu en sortie afin de regrouper les classes liées.
Ce que je voulais faire, idéalement, c'est reproduire un format de sortie fourni par un autre logiciel de tabulation, mais en utilisant R. Ce logiciel fourni le tableau d'effectif, et pour chaque case du tableau, il ajoute les noms des classes qui sont liées à celle correspondant à la colonne où l'on se trouve.

Ca peut être fastidieux, mais c'est l'approche que j'ai choisie pour laisser l'utilisateur interpréter lui-même les résultats. Cela me gênait de renvoyer directement un truc du genre "telle classe et telle classe sont liées", je trouve que ce n'est pas tellement la philosophie des sorties R. Et je pense que dans des cas un peu limites où les classes liées ne ressortent pas aussi clairement que dans mon exemple caricatural, l'interprétation "automatique" par la fonction pourrait induire en erreur...

Aline Deschamps a écrit :De plus, les tests que je souhaite effectuer sont sur ce principe : tester si "blond-bleu" et "blon-marron" sont liées, "blond-bleu" et "blond-vert", "blond-marron" et "blond-vert", "brun-bleu" et "brun-marron", etc...

A mon avis c'est une autre approche qui mène au même résultat. N'étant pas statisticien j'ai suivi la procédure proposée par G. Millot, peut-être y a-t-il mieux !

Cordialement,
Maxime

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Re: Test comparaison de 2 proportions - tableau de contingen

Messagepar Renaud Lancelot » 08 Juin 2011, 13:20

Aline Deschamps a écrit :
Eric Wajnberg a écrit :Ou bien j'ai mal compris la question, ou bien chisq.test() fait exactement cela (voir l'utilisation des différents arguments).

Eric.

Peut-être que c'est moi qui m'exprime mal ou bien qui ai du mal à comprendre, désolée :/
J'ai re-regardé l'aide en détails de la fonction "chisq.test" et je ne vois pas comment elle pourrait me permettre de réaliser ce que je souhaite, alors je vais essayer de m'expliquer autrement.

Disons par exemple que mes deux variables qualitatives étudiées sont les suivantes : la couleur des cheveux (lignes) qui peut prendre les valeurs : blond, brun, roux, et la couleur des yeux (colonnes) qui peut prendre les valeurs : vert, bleu, marron.

Un test du Khi-deux sur le tableau de contingence créé à partir de ces deux variables me permettra de déterminer si la couleur des yeux et celle des cheveux sont indépendantes ou non.

Ce que je souhaite déterminer c'est, si nous sommes dans le cas où le test de Khi-deux est significatif, ie. nos deux variables sont liées, quelles modalités de chaque variable sont liées entre elles.
Pour cela, je vais effectuer des tests par exemple entre la proportion de blonds aux yeux bleus et celle de blonds aux yeux verts, afin de déterminer si la différence entre ces deux proportions est significative ou non.

Désolée si tout ceci n'est pas très clair, je dois avouer avoir du mal à bien saisir le principe d'un tel test...

Encore merci à ceux qui pourront m'aider :)


Cordialement,

A.D.


Je pense comme Eric que le test du chi2 (chisq.test) est approprié: vous faites d'abord le test global d'indépendance, puis des tests partiels sur des sous-ensembles du tableau. C'est classique.

Autrement penser aussi à l'analyse factorielle des correspondances qui vous donnera une vision simultanée des proximités des modalités des lignes et des colonnes. Vous pouvez ensuite reboucler sur le point précédent en faisant des tests partiels.
Renaud

Maxime Hervé
Messages : 427
Enregistré le : 03 Mar 2010, 14:21
Contact :

Re: Test comparaison de 2 proportions - tableau de contingen

Messagepar Maxime Hervé » 08 Juin 2011, 13:39

Renaud Lancelot a écrit :Je pense comme Eric que le test du chi2 (chisq.test) est approprié: vous faites d'abord le test global d'indépendance, puis des tests partiels sur des sous-ensembles du tableau. C'est classique

Ca revient exactement à ce que j'ai fait non ? Avec un test exact de Fisher au lieu d'un chi2 sur les sous-ensembles, car vu que la procédure est automatique elle reste valable en cas de classes à faibles effectifs.

Maxime

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 08 Juin 2011, 16:25

Oui je pense.
Renaud

Aline Deschamps
Messages : 133
Enregistré le : 11 Mai 2010, 07:49
Contact :

Messagepar Aline Deschamps » 13 Juin 2011, 09:16

Bonjour,

Merci à tous pour vos réponses :)

Lors de mes recherches, j'ai rencontré une autre manière de procéder (cf. "La procédure FREQ de SAS - Test d'indépendance et mesures d'association dans un tableau de contingence", par Josiane CONFAIS, Yvette GRELET et Monique LE GUEN), il s'agit d'un test de comparaison de deux proportions qui est effectué comme suit :

Pour une ligne donnée d'un tableau de contingence, on sélectionne les proportions associées à deux "cases" (colonnes) de cette ligne : p1 et p2. On a p = la proportion "globale" de la ligne.
On a alors : p1 - p2 qui suit une loi normale de moyenne 0 et d'écart-type sigma = sqrt [ p (1-p) ( (1/N1) + (1/N2) ) ].

Avec : N1 = effectif de la colonne à laquelle est associée p1 , et idem pour N2 et p2.

On a ensuite : si | p1 - p2 | > 1.96 * sigma, alors au risque 5% on rejettera l'hypothèse H0 : "Il n'y a pas de différence significative entre les proportions p1 et p2".

Bien sûr, cela est vrai sous certaines conditions, la normalité ou une grande taille des échantillons.

Je pense que ceci peut être aisément programmé dans R.
En effet, mon objectif (qui peut paraître limité, mais il m'est imposé...) est de reproduire avec R ce qui est fait avec un autre logiciel de tabulations en ce qui concerne les tableaux de contingence, et ce logiciel effectue des tests tels que je vous l'ai décrit dans mon premier message...


Cordialement,

A.D.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité