如何在 R 中记录 (x + 1) 数据框或矩阵

How to log(x + 1) a data frame or matrix in R

我是编码新手,正在做一些基因表达分析。我有一个非常天真的问题。我有一些基因表达数据框,其中基因名称作为行,细胞名称作为列 Example gene exp. data frame。我想对数据进行 log2 转换,但对 log 和 log+1 感到困惑。如何在 R 中对数据框执行 log2+1 (log(x + 1)) 转换?它与 log2 转换相同吗?我应该做 t=log(v+1) 吗? 任何帮助将不胜感激。

例如dummy数据

dummy <- data.frame(
  x = c(1,2,3,4,5),
  y = c(2,3,4,5,6)
)
dummy 
  x y
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6

如果您只想 log2 转换数据,只需使用 log(., base = 2) 就像

log(dummy, base = 2)
         x        y
1 0.000000 1.000000
2 1.000000 1.584963
3 1.584963 2.000000
4 2.000000 2.321928
5 2.321928 2.584963

如果你想要 log2(x+1) 然后 log(dummy+1, base = 2),或者如果你想要 log2(x)+1log(dummy, base = 2) + 1

给出了最简单的方法来记录转换数字 data.frame 但 log(x+1, base = b) 是一个不同的问题。

log(x + 1)

但是如果转换是 y <- log(x + 1)(可以是基数 2),那么要小心浮点问题。对于非常小的 abs(x) 值,log(x + 1, base = b) 的结果不可靠。

x <- seq(.Machine$double.eps, .Machine$double.eps^0.5, length.out = 10)
eq <- log(x + 1) == log1p(x)
eq
#[1]  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE
which(eq)
#[1]  1  4  7 10

这就是为什么基数 R 有一个函数 log1p。要计算 log(x + 1, base = 2) 或等效地计算 log2(x + 1),请使用

log2p1 <- function(x) log1p(x)/log(2)

eq2 <- log2(x + 1) == log2p1(x)

eq2
# [1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE
which(eq2)
#[1]  7 10

在这两种情况下,log(x + 1) 和数值上更准确的版本之间的差异绝对值小于 .Machine$double.eps

abs(log(x + 1) - log1p(x)) < .Machine$double.eps
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
abs(log2(x + 1) - log2p1(x)) < .Machine$double.eps
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE