如何在 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)+1
就 log(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
我是编码新手,正在做一些基因表达分析。我有一个非常天真的问题。我有一些基因表达数据框,其中基因名称作为行,细胞名称作为列 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)+1
就 log(dummy, base = 2) + 1
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