Bonjour, est-ce que quelque'un pourrait m'orienter pour réaliser un diagramma de Venn avec le logiciel R? Je voudrais représenter les enfants qui cumulent plusieurs déficits anthropométriques (MUAC<125, WAZ<-2, HAZ<-2, WFH<-2).
J'ai trouvé plusieurs packages pour cela mais je n'arrive pas à trouver des explications sur la façon de paramétrer les échantillons directement de puis la base de données.
Merci par avance pour vos orientations.
Bonjour Cécile,
Voici un paquet appelé ggVennDiagram avec une marche à suivre via ce lien : https://www.datanovia.com/en/blog/beautiful-ggplot-venn-diagram-with-r/
Il existe également un groupe Skype humanitaire d'utilisateurs R qui peut être mieux adapté à cette question, et au dépannage en général, si cela continue d'être un problème : https://join.skype.com/iKzkeiOdnJip
J'espère que cela vous sera utile,
Répondu:
il y a 2 annéesIl existe un certain nombre de packages prenant en charge la production de diagrammes de Venn (par exemple, ggvenn, ggvendiagrams, vendiagram, gplots). J'utilise gplots (voir ci-dessous). Tous vous obligent à compter les cas à inclure dans chaque cellule. Je pense que c'est ce qui peut créer des embûches. Ici, je vais fournir un exemple de code que j'ai utilisé pour les tracés similaires à ceux présentés dans :
Le problème ici est de tracer le nombre de décès associés à différentes définitions de cas anthropométriques. Voici un exemple de code...
## Plotting functions (including Venn diagrams)
library(gplots)
##
## Function to give Venn diagram counts (might be useful .. see below)
##
vennCounts <- function(x, include = "both")
{
x <- as.matrix(x)
include <- match.arg(include,c("both","up","down"))
x <- sign(switch(include, both = abs(x), up = x > 0, down = x < 0))
nprobes <- nrow(x)
ncontrasts <- ncol(x)
group.names <- colnames(x)
if(is.null(group.names))
{
group.names <- paste("Group", 1:ncontrasts)
}
noutcomes <- 2^ncontrasts
outcomes <- matrix(0, noutcomes, ncontrasts)
colnames(outcomes) <- group.names
for (j in 1:ncontrasts)
{
outcomes[,j] <- rep(0:1, times = 2^(j - 1), each=2^(ncontrasts - j))
}
xlist <- list()
for (i in 1:ncontrasts)
{
xlist[[i]] <- factor(x[ ,ncontrasts - i + 1],levels=c(0, 1))
}
counts <- as.vector(table(xlist))
result <- structure(cbind(outcomes, Counts = counts), class = "VennCounts")
return(result)
}
## Select deaths (data are in data.frame 'x')
x <- subset(x, outcome == 1)
## Truth table for Venn diagram
vennData <- cbind(x$whz < -3, x$waz < -3 , x$muac < 115, x$whz < -2 & x$haz < -2)
## Label each column of the truth table
colnames(vennData) <- c("WHZ", "WAZ", "MUAC", "WAST")
## Plot the Venn diagram (using try() suppresses messages)
try(venn(vennData, intersections = TRUE, small = NULL), silent = TRUE)
## We can present the diagram as a table using VennCounts()
vennCounts(vennData)
## We can would with thes counts. For example:
vennDeath <- vennCounts(vennData)
deathsNotPredicted <- vennDeath[1,ncol(vennDeath)]
allDeaths <- sum(vennDeath[,ncol(vennDeath)])
(deathsNotPredicted)
(allDeaths)
Si vous essayez ceci, vous constaterez peut-être (1) que le diagramme est un peu petite sur la page et (2) que la zone des étiquettes est un peu "décousue". vous pouvez corriger (1) en définissant les marges par par(mar = ...) et par(mai = ...). Vous pouvez corriger (2) en définissant l'expansion du caractère d'étiquette et en spécifiant d'autres étiquettes et en ajoutant des espaces et des retours à la ligne si nécessaire.
J'ai du code (fonction R utilisant des graphiques de base R) qui tracera des diagrammes de Venn sans avoir besoin d'utiliser une bibliothèque externe. J'ai utilisé ceci pour :
Je peux partager ce code si cela puisse vous être utile.
J'espère que cela vous sera utile.
Répondu:
il y a 2 annéesMerci beaucoup pour vos réponses. Finalement, j'ai opté pour le package ggVennDiagram assez simple à utiliser et pour séléctionner ma population avec le package dplyr ça va très vite.
je mets le programme si ça peut servir aussi à d'autres personnes
x = list(
ALL_INCLU2 %>% filter(MUAC<125) %>% select(pat_num) %>% unlist(),
ALL_INCLU2 %>% filter(WAZ< -2) %>% select(pat_num) %>% unlist(),
ALL_INCLU2 %>% filter(HAZ< -2) %>% select(pat_num) %>% unlist(),
ALL_INCLU2 %>% filter(WHZ< -2) %>% select(pat_num) %>% unlist())
ggVennDiagram(
x, label_alpha = 0,
category.names = c("MUAC<125 ","WAZ<-2 ","HAZ<-2", "WHZ<-2")
) +
ggplot2::scale_fill_gradient(low="white",high = "orange")
la sortie des graphiques est top.
Merci beaucoup Mark pour vos orientation précises et vos références (sur lesquelles j'étais d'ailleurs en train de me baser pour de futures analyses).
Répondu:
il y a 2 années