如何计算重复的 z 分数?

问题描述 投票:0回答:1

我有一篇论文的数据。该测定针对 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 分数,因为存在重复,然后将这些值放在一起。

r statistics heatmap z-score
1个回答
0
投票

您可以根据您的数据制作

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

enter image description here


数据:

> 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))
© www.soinside.com 2019 - 2024. All rights reserved.