Comment puis-je définir des variables en tant que groupe de comparaison incluant toutes les variables sauf X ?
J'ai une base de données avec une colonne qui a le pays d'occurrence différent et une autre colonne avec le type d'événement qui s'est produit (plus de 3000 entrées) et est structurée comme illustré ci-dessous :
#> country event
#> 1 USA Abdominal discomfort
#> 2 USA Abdominal discomfort
#> 3 Canada Vomiting
#> 4 UK Alopecia
#> 5 Hungary Agitation
#> 6 France Abscess
Donc, comme vous pouvez l'imaginer, j'ai des milliers de variables différentes !
Je veux calculer les valeurs d'un tableau de contingence comme celui-ci:
X événement | Pas X événement | |
---|---|---|
S | un | b |
C | c | ré |
Solution du problème
Il semble que vos données soient dans ce format :
df <- data.frame(country = c('USA', 'USA', 'Canada', 'UK', 'UK', 'France',
'Hungary', 'Hungary', 'France', 'Canada'),
event = c('Vomiting', 'Agitation', 'Headache', 'Headache',
'Abdominal pain', 'Vomiting', 'Agitation',
'Abdominal pain', 'Anaphylaxis', 'Vomiting'))
df
#> country event
#> 1 USA Vomiting
#> 2 USA Agitation
#> 3 Canada Headache
#> 4 UK Headache
#> 5 UK Abdominal pain
#> 6 France Vomiting
#> 7 Hungary Agitation
#> 8 Hungary Abdominal pain
#> 9 France Anaphylaxis
#> 10 Canada Vomiting
Cela étant, vous auriez besoin d'un tableau pour chaque condition dans chaque pays, ce qui peut entraîner des dizaines ou des centaines de tableaux différents à traiter (par exemple, il y aurait 25 tableaux même pour ce petit exemple de jouet).
Pour vous aider à résumer vos données, vous pouvez obtenir directement le rapport de cotes et la valeur p pour chaque condition dans chaque pays en créant chaque tableau dans un lapply
appel et en effectuant un test de Fisher pour en extraire les statistiques. Ensuite, vous pouvez transformer le tout en une trame de données :
`row.names<-`(do.call(rbind, lapply(sort(unique(df$event)), function(x) {
do.call(rbind, lapply(sort(unique(df$country)), function(y) {
tab <- table(df$country == y, df$event == x)
ft <- fisher.test(tab)
data.frame(country = y, condition = x, event = tab[2, 2], no_event = tab[2, 1],
ROW_event = tab[1, 2], ROW_no_event = tab[1, 1],
odds_ratio = ft$estimate,
p_value = ft$p.value)
}))
})), NULL)
#> country condition event no_event ROW_event ROW_no_event odds_ratio
#> 1 Canada Abdominal pain 0 2 2 6 0.000000
#> 2 France Abdominal pain 0 2 2 6 0.000000
#> 3 Hungary Abdominal pain 1 1 1 7 5.291552
#> 4 UK Abdominal pain 1 1 1 7 5.291552
#> 5 USA Abdominal pain 0 2 2 6 0.000000
#> 6 Canada Agitation 0 2 2 6 0.000000
#> 7 France Agitation 0 2 2 6 0.000000
#> 8 Hungary Agitation 1 1 1 7 5.291552
#> 9 UK Agitation 0 2 2 6 0.000000
#> 10 USA Agitation 1 1 1 7 5.291552
#> 11 Canada Anaphylaxis 0 2 1 7 0.000000
#> 12 France Anaphylaxis 1 1 0 8 Inf
#> 13 Hungary Anaphylaxis 0 2 1 7 0.000000
#> 14 UK Anaphylaxis 0 2 1 7 0.000000
#> 15 USA Anaphylaxis 0 2 1 7 0.000000
#> 16 Canada Headache 1 1 1 7 5.291552
#> 17 France Headache 0 2 2 6 0.000000
#> 18 Hungary Headache 0 2 2 6 0.000000
#> 19 UK Headache 1 1 1 7 5.291552
#> 20 USA Headache 0 2 2 6 0.000000
#> 21 Canada Vomiting 1 1 2 6 2.645752
#> 22 France Vomiting 1 1 2 6 2.645752
#> 23 Hungary Vomiting 0 2 3 5 0.000000
#> 24 UK Vomiting 0 2 3 5 0.000000
#> 25 USA Vomiting 1 1 2 6 2.645752
#> p_value
#> 1 1.0000000
#> 2 1.0000000
#> 3 0.3777778
#> 4 0.3777778
#> 5 1.0000000
#> 6 1.0000000
#> 7 1.0000000
#> 8 0.3777778
#> 9 1.0000000
#> 10 0.3777778
#> 11 1.0000000
#> 12 0.2000000
#> 13 1.0000000
#> 14 1.0000000
#> 15 1.0000000
#> 16 0.3777778
#> 17 1.0000000
#> 18 1.0000000
#> 19 0.3777778
#> 20 1.0000000
#> 21 1.0000000
#> 22 1.0000000
#> 23 1.0000000
#> 24 1.0000000
#> 25 1.0000000
Créé le 2022-04-14 par le paquet reprex (v2.0.1)
Commentaires
Enregistrer un commentaire