如何获得3个数据帧的z得分分布并在一张图中绘制所有内容

时间:2018-10-30 15:55:15

标签: r dataframe normalization

我正在尝试创建一个包含3种不同变体类型(同义,错义和废话)的基因表达盒图的图形。当前,这些变量类型被分为3个不同的数据帧,每个数据帧包含一个GeneSampleIDExpression列。

为了在单个图形上绘制所有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)

这是正确的方法吗?如果是这样,我从这里去哪里?

示例数据框(未命中):

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

2 个答案:

答案 0 :(得分:2)

使用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()

答案 1 :(得分:1)

如果每个相应数据框中的所有基因都相同,则不需要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"))

甚至考虑将行绑定所有数据帧,但为 variant_type 指示器添加新列。然后使用ave,因为现在基因在数据框中会有所不同。甚至使用公式样式代替list()的{​​{1}}:

boxplot

Box Plot Output

数据

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")