我是编程新手,正在做一些基因表达分析。我有一个非常天真的问题。我有几个基因表达数据框,以基因名称为行,以细胞名称为列Example gene exp. data frame。我想对数据进行对数转换,但是把log2和log+1搞混了。如何对R中的数据帧执行log2+1 ( log (x + 1))转换?它和log2转换是一样的吗?我应该做t=log(v+1)
吗?任何帮助都将不胜感激。
发布于 2021-10-12 06:46:31
Park's answer提供了对仅数值的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
发布于 2021-10-12 05:49:35
例如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
https://stackoverflow.com/questions/69535558
复制相似问题