我正在尝试创建一个包含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)
这是正确的方法吗?如果是这样,我从这里去哪里?
示例数据框(未命中):
SampleID Expression Gene
HSB100 5.239237 ENSG00000188976
HSB105 4.443808 ENSG00000188976
HSB104 4.425764 ENSG00000188976
HSB121 4.063259 ENSG00000188976
答案 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
数据
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")