Comment puis-je calculer un CDF empirique en R?
-
29-09-2019 - |
Question
Je lis une table clairsemée d'un fichier qui ressemble à:
1 0 7 0 0 1 0 0 0 5 0 0 0 0 2 0 0 0 0 1 0 0 0 1
1 0 0 1 0 0 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1
1 0 0 1 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 2 1 0 1 0 1
Remarque longueurs de ligne sont différentes.
Chaque ligne représente une seule simulation. La valeur du i-ième colonne de chaque ligne indique combien de fois la valeur i-1 a été observée dans cette simulation. Par exemple, dans la première simulation (première ligne), nous avons obtenu un seul résultat avec la valeur « 0 » (première colonne), 7 résultats à valeur « 2 » (troisième colonne) etc.
Je souhaite créer une fonction de distribution cumulative moyenne (CDF) pour tous les résultats de la simulation, afin que je puisse l'utiliser plus tard pour calculer une p-valeur empirique pour les vrais résultats.
Pour ce faire, je peux d'abord résumer chaque colonne, mais je dois prendre des zéros pour les colonnes FNUD.
Comment puis-je lire une telle table avec différentes longueurs de ligne? Comment puis-je résumer des colonnes remplaçant « FNUD » valeurs avec 0' ? Et enfin, comment puis-je créer la CDF? (Je peux le faire manuellement mais je suppose qu'il ya un certain paquet qui peut le faire).
La solution
lira les données:
dat <- textConnection("1 0 7 0 0 1 0 0 0 5 0 0 0 0 2 0 0 0 0 1 0 0 0 1
1 0 0 1 0 0 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1
1 0 0 1 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 2 1 0 1 0 1")
df <- data.frame(scan(dat, fill = TRUE, what = as.list(rep(1, 29))))
names(df) <- paste("Val", 1:29)
close(dat)
Entraînant:
> head(df)
Val 1 Val 2 Val 3 Val 4 Val 5 Val 6 Val 7 Val 8 Val 9 Val 10 Val 11 Val 12
1 1 0 7 0 0 1 0 0 0 5 0 0
2 1 0 0 1 0 0 0 3 0 0 0 0
3 0 0 0 1 0 0 0 2 0 0 0 0
4 1 0 0 1 0 3 0 0 0 0 1 0
5 0 0 0 1 0 0 0 2 0 0 0 0
....
Si les données sont dans un fichier, indiquez le nom de fichier au lieu de dat
. Ce code suppose que il y a un maximum de 29 colonnes, selon les données fournies. Modifier la 29
en fonction des données réelles.
Nous obtenons les sommes des colonnes en utilisant
df.csum <- colSums(df, na.rm = TRUE)
la fonction ecdf()
génère le ECDF que vous vouliez,
df.ecdf <- ecdf(df.csum)
et nous pouvons tracer à l'aide de la méthode plot()
:
plot(df.ecdf, verticals = TRUE)
Autres conseils
Vous pouvez utiliser le ecdf()
(en base R) ou Ecdf()
(à partir du Hmisc fonctions de paquets).