如何将负值转换为对数?

机器算法验证 r 对数
2022-02-15 04:14:25

我想知道如何将负值转换为Log(),因为我有异方差数据。我读到它适用于公式Log(x+1),但这不适用于我的数据库,因此我继续获得 NaN。例如,我收到此警告消息(我没有放置完整的数据库,因为我认为我的负值之一足以显示示例):

> log(-1.27+1)
[1] NaN
Warning message:
In log(-1.27 + 1) : NaNs produced
> 

提前致谢

更新:

这是我的数据的直方图。我正在使用古生物学时间序列的化学测量,例如 Ca 和 Zn 等变量之间的差异太大,那么我需要某种类型的数据标准化,这就是我测试log()函数的原因。 在此处输入图像描述

这是我的原始数据

2个回答

由于对数仅针对正数定义,因此不能取负值的对数。但是,如果您的目标是获得更好的数据分布,则可以应用以下转换。

假设您已经扭曲了负面数据:

x <- rlnorm(n = 1e2, meanlog = 0, sdlog = 1)
x <- x - 5
plot(density(x))

然后您可以应用第一个转换来使您的数据位于(1,1)

z <- (x - min(x)) / (max(x) - min(x)) * 2 - 1
z <- z[-min(z)]
z <- z[-max(z)]
min(z); max(z)

最后应用反双曲正切:

t <- atanh(z)
plot(density(t))

现在,您的数据看起来大致呈正态分布。这也称为费希尔变换。

要将其转换为对数刻度,首先找到正数的对数,然后乘以它的符号,下面的代码应该做到这一点。

transform_to_log_scale <- function(x){
    if(x==0){
        y <- 1
    } else {
        y <- (sign(x)) * (log(abs(x)))
    }
        y 
    }

使用上面的示例,我们可以绘制以下偏态分布

x <- rlnorm(n = 1e2, meanlog = 0, sdlog = 1)
x <- x - 5
plot(density(x))

在此处输入图像描述

使用如下变换函数后,我们得到一个看起来更“正常”的分布

plot(density(sapply(x,FUN=transform_logs_scale)))

在此处输入图像描述