web-dev-qa-db-fra.com

R: fractionnement du jeu de données en quartiles/déciles. Quelle est la bonne méthode?

Je suis très nouveau avec R, alors j'espère avoir quelques indications sur la manière de réaliser la manipulation souhaitée de mes données. 

J'ai un tableau de données avec trois variables.

  gene_id       fpkm  meth_val
1 100629094     0.000 0.0063
2 100628995     0.000 0.0000
3 102655614   111.406 0.0021

Je voudrais tracer la meth_val moyenne après stratifier mes gene_ids basés sur fpkm en quartiles ou déciles.

Une fois que je charge mes données dans une base de données ... 

data <- read.delim("myfile.tsv", sep='\t')

Je peux déterminer les déciles fpkm en utilisant:

quantile(data$fpkm, prob = seq(0, 1, length = 11), type = 5

qui donne

          0%          10%          20%          30%          40%          50%
0.000000e+00 9.783032e-01 7.566164e+00 3.667630e+01 1.379986e+02 3.076280e+02
         60%          70%          80%          90%         100%
5.470552e+02 8.875592e+02 1.486200e+03 2.974264e+03 1.958740e+05

À partir de là, j'aimerais essentiellement scinder le cadre de données en 10 groupes en fonction de la possibilité d'insérer fpkm_val dans l'un de ces déciles. Ensuite, j'aimerais tracer la meth_val de chaque décile dans ggplot sous forme de diagramme à parcelles et effectuer un test statistique sur tous les déciles.

La principale chose sur laquelle je suis vraiment coincé est de savoir comment fractionner mon jeu de données de manière appropriée. Toute aide serait grandement appréciée!

Merci beaucoup!

9
user1995839

Une autre façon serait ntile() dans dplyr.

library(tidyverse)

foo <- data.frame(a = 1:100,
                  b = runif(100, 50, 200),
                  stringsAsFactors = FALSE)

foo %>%
    mutate(quantile = ntile(b, 10))

#  a         b quantile
#1 1  93.94754        2
#2 2 172.51323        8
#3 3  99.79261        3
#4 4  81.55288        2
#5 5 116.59942        5
#6 6 128.75947        6
24
jazzurro

vous pouvez essayer d'utiliser la bibliothèque Hmisc et la fonction cut2. Vous pouvez couper un vecteur en différents groupes en indiquant les points de coupe. Voici un exemple:

library(Hmisc)
data <- data.frame(gene_id=sample(c("A","B","D", 100), 100, replace=TRUE),
               fpkm=abs(rnorm(100, 100, 10)),
               meth_val=abs(rnorm(100, 10, 1)))
quantiles <- quantile(data$fpkm, prob = seq(0, 1, length = 11), type = 5)
data$cutted <- cut2(data$fpkm, cuts = as.numeric(quantiles))

Et vous obtiendrez le même cadre de données avec des colonnes supplémentaires pour le fractionnement:

    gene_id      fpkm  meth_val        cutted
1         B 102.16511  8.477469 [100.4,103.2)
2         A 110.59269  9.256172 [106.4,110.9)
3         B  93.15691 10.560936 [ 92.9, 95.3)
4         B 105.74879 10.301358 [103.2,106.4)
5         A  96.12755 11.336484 [ 95.3, 96.8)
6         B 106.29204  8.286120 [103.2,106.4)
...

De plus, vous pouvez également utiliser cut2 en spécifiant par groupes de quantiles. En savoir plus ?cut2.

2
adomasb