Как получить распределение z-показателей для 3-х информационных фреймов и построить все на одном графике - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь создать один график, который содержит коробчатые участки экспрессии генов для 3 различных типов вариантов (синоним, мисс и нонсенс). В настоящее время эти типы вариантов разделены на 3 разных фрейма данных, каждый из которых содержит столбцы Gene, SampleID и Expression.

Для того, чтобы построить все 3 боксплота на одном графике, мне нужно нормализовать все данные выражений для каждого варианта варианта, что означает, что мне нужно получить z-оценки. У меня вопрос, как мне это сделать, а затем как я могу построить все 3 варианта типа на одном графике?

Я нашел решение:

missense$Zscore <- ave(m$expr, m$Gene, FUN = scale)
nonsense$Zscore <- ave(n$expr, n$Gene, FUN = scale)
synonymous$Zscore <- ave(s$expr, s$Gene, FUN = scale)

Это правильный подход? Если так, куда мне идти отсюда?

Пример кадра данных (missense):

SampleID     Expression   Gene       
HSB100       5.239237     ENSG00000188976 
HSB105       4.443808     ENSG00000188976
HSB104       4.425764     ENSG00000188976
HSB121       4.063259     ENSG00000188976

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Если все гены одинаковы в каждом соответствующем фрейме данных, то ave не требуется, так как не существует нескольких групп. Следовательно, вы можете запустить простой расчет: m$Zscore <- scale(m$expr). Оттуда, как @ emilliman5 комментарии, нарисуйте все три вектора со списком и даже назовите ось X с именованным списком:

# WITH SEABORN COLORS
boxplot(list(missense=m$Zscore, nonsense=n$Zscore, synonymous=s$Zscore),
        col = c("#4c72b0","#55a868","#c44e52"))

Даже рассмотрите возможность привязки строки ко всем фреймам данных, но добавьте новый столбец для индикатора variable_type . Затем используйте ave, так как теперь гены будут различаться в пределах фрейма данных. И даже используйте стиль формулы вместо list() для boxplot:

all_gene_df <- rbind(transform(m, variant_type='missense'), 
                     transform(n, variant_type='nonsense'), 
                     transform(s, variant_type='synonymous'))

all_gene_df$Zscore <- with(all_gene_df, ave(expr, variant_type, FUN = scale))

# WITH SEABORN COLORS
boxplot(Zscore ~ variant_type, data = all_gene_df,
        col = c("#4c72b0","#55a868","#c44e52"),
        main = "ZScore Boxplots by Gene",
        xlab = "Genes",
        ylab = "ZScore")

Box Plot Output

Данные

set.seed(103018)
m <- data.frame(SampleID = paste0(sample(LETTERS, 50, replace=TRUE), sample(LETTERS, 50, replace=TRUE),
                                  sample(LETTERS, 50, replace=TRUE), sample(100:999, 50, replace=TRUE)),
                expr = runif(50)*10,
                gene = 'MISSENSE0001')

n <- data.frame(SampleID = paste0(sample(LETTERS, 50, replace=TRUE), sample(LETTERS, 50, replace=TRUE),
                                  sample(LETTERS, 50, replace=TRUE), sample(100:999, 50, replace=TRUE)),
                expr = runif(50)*10,
                gene = 'NONSENSE0001')

s <- data.frame(SampleID = paste0(sample(LETTERS, 50, replace=TRUE), sample(LETTERS, 50, replace=TRUE),
                                  sample(LETTERS, 50, replace=TRUE), sample(100:999, 50, replace=TRUE)),
                expr = runif(50)*10,
                gene = 'SYNONYMOUS0001')
0 голосов
/ 30 октября 2018

Используйте функцию scale для получения Z-баллов.

missense <- data.frame(SampleID = c('HSB100', 'HSB105', 'HSB104', 'HSB121'),
                    Expression = c(5.239237, 4.443808, 4.425764, 4.063259),
                    Gene = c('ENSG00000188976', 'ENSG00000188976', 'ENSG00000188976', 'ENSG00000188976'))
missense$Zscore <- scale(missense$Expression)

missense

mean(missense$Zscore)
sd(missense$Zscore)

# Create fake data here

nonsense <- 
        data.frame(SampleID = c('HSB100', 'HSB105', 'HSB104', 'HSB121'),
                   Expression = c(1, 2, 3, 4),
                   Gene = c('ENSG00000188976', 'ENSG00000188976', 'ENSG00000188976', 'ENSG00000188976'))
nonsense$Zscore <- scale(nonsense$Expression)
synonymous <- 
        data.frame(SampleID = c('HSB100', 'HSB105', 'HSB104', 'HSB121'),
                   Expression = c(3, 4, 5, 6),
                   Gene = c('ENSG00000188976', 'ENSG00000188976', 'ENSG00000188976', 'ENSG00000188976'))
synonymous$Zscore <- scale(synonymous$Expression)

Хитрость заключается в том, чтобы связать все три фрейма данных вместе, а затем построить график с помощью ggplot. Не знаком с базовым сюжетом, но вот что я бы сделал:

# Add identifyer

missense$Type <- 'missense'
nonsense$Type <- 'nonsense'
synonymous$Type <- 'synonymous'


# Bind three together

data_all <- rbind(missense, nonsense, synonymous)

# Use ggplot to plot boxscores

library(ggplot2)

ggplot(data = data_all, aes(x = Type, y = Zscore)) + geom_boxplot()
...