我有一篇论文的数据。该测定针对 6 种不同的细胞培养条件(列)和 6 个基因(行)进行。然而,每个基因也执行了 4 次(出于统计目的)。
我们的数据示例:
基因 | 条件1 | 条件2 |
---|---|---|
基因1复制1 | 0.22 | 120 |
基因1复制2 | 0.34 | 122 |
基因1重复3次 | 0.45 | 119 |
基因1重复4次 | 0.55 | 90 |
基因2复制1 | 12 | 0.1 |
基因2复制2 | 19.3 | 0.45 |
基因2复制3 | 23.4 | 不适用 |
基因2复制4次 | 11.7 | 0.89 |
依此类推...6 个基因和 6 个条件。不幸的是,我们还有 2 个 NA 值,这并不意味着它们是 0,只是机器无法检测到它们(低于可检测值)。
现在。有了这些数据,我必须制作一个热图,为此我需要 z 分数。虽然我知道如何计算 z 分数,但我不确定当存在多个重复时该怎么办。你有这个意思吗?在另一个案例中,我看到了 Pearson 的一些东西(?)。
最后的想法是为每个基因和每个条件获得 1 个 z 分数,以便我可以制作热图。此外,存在异常值(重复 4),因此使用中位数而不是平均值可能更有意义。
最终的热图将代表这些基因在不同条件下表达的变化。基本上最后我们要根据基因表达来比较条件,并声明“此细胞培养条件具有此基因模式,这与该细胞培养条件不同”
我尝试了一些代码来计算 z 分数,但我不确定它们是否正确。
我很难告诉 R 使用什么平均值(或中位数)来计算 z 分数,因为存在重复,然后将这些值放在一起。
您可以根据您的数据制作
array
,
> A <- array(unlist(dat[-1]),
+ dim=c(n_reps, n_cond, n_genes),
+ dimnames=list(NULL,
+ unique(sub('\\srepli.*', '', dat$Genes)),
+ names(dat)[-1])) |>
+ aperm(c(1, 3, 2))
> A
, , Gene 1
Condition.1 Condition.2
[1,] 0.22 120
[2,] 0.34 122
[3,] 0.45 119
[4,] 0.55 90
, , Gene 2
Condition.1 Condition.2
[1,] 12.0 0.10
[2,] 19.3 0.45
[3,] 23.4 NA
[4,] 11.7 0.89
可以轻松地用中位数进行估算,
> ## impute with median
> A <- apply(A, c(2, 3), \(x) replace(x, is.na(x), median(x, na.rm=TRUE)))
计算z-分数
> ## z-scores from gene-means
> z <- \(x) {(x - mean(x))/sd(x)}
> (m <- colMeans(A) |> t() |> z())
Condition.1 Condition.2
Gene 1 -0.5955564 1.4849852
Gene 2 -0.2954000 -0.5940288
并绘制
heatmap
。
> ## heatmap
> png('foo.png')
> m |> heatmap(margins=c(17, 12))
> dev.off()
数据:
> dput(dat)
structure(list(Genes = c("Gene 1 replicate 1", "Gene 1 replicate 2",
"Gene 1 replicate 3", "Gene 1 replicate 4", "Gene 2 replicate 1",
"Gene 2 replicate 2", "Gene 2 replicate 3", "Gene 2 replicate 4"
), Condition.1 = c(0.22, 0.34, 0.45, 0.55, 12, 19.3, 23.4, 11.7
), Condition.2 = c(120, 122, 119, 90, 0.1, 0.45, NA, 0.89)), class = "data.frame", row.names = c(NA,
-8L))