24 votos

¿Cómo transformar valores negativos en logaritmos?

Me gustaría saber cómo transformar valores negativos a log() ya que tengo datos heteroscedásticos. He leído que log(x+1) resuelve el problema pero no funciona con mis datos y sigo obteniendo NaNs como resultado.

Por ejemplo, recibo este mensaje de advertencia (no he puesto mi base de datos completa porque creo que uno de mis valores negativos es suficiente para mostrar el problema):

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

ACTUALIZACIÓN:

He aquí un histograma de mis datos. Estoy trabajando con series temporales paleontológicas de mediciones químicas. Si la diferencia entre (por ejemplo) variables como Ca y Zn es demasiado grande, necesito algún tipo de normalización de los datos, que es por lo que estoy probando el log() función.

enter image description here

Estos son mis datos en bruto

15voto

user44171 Puntos 11

Como el logaritmo sólo se define para números positivos, no se puede tomar el logaritmo de valores negativos. Sin embargo, si tu objetivo es obtener una mejor distribución para tus datos, puedes aplicar la siguiente transformación.

Suponga que tiene datos negativos sesgados:

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

entonces puede aplicar una primera transformación para que sus datos estén en $(-1,1)$ :

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

y finalmente aplicar la tangente hiperbólica inversa:

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

Ahora, sus datos parecen aproximadamente distribuidos normalmente. Esto también se llama transformación de Fisher.

11voto

mkt Puntos 688

Esto se ha tratado en detalle en los comentarios, pero todavía no hay una respuesta que lo establezca. Así que para el beneficio de los futuros lectores:

Por favor, NO manipule sus valores negativos (¡especialmente las diferencias!) para poder aplicar una transformación logarítmica . Estrategias como la adición de constantes introducen sesgos; esto puede funcionan bien si se hacen con cuidado, pero también pueden conducir a resultados completamente incorrectos e ininterpretables. Consulte este hilo para obtener más información al respecto: Interpretación de la regresión logarítmica con log(1+x) como variable independiente .

En su lugar, utilizar una transformación que trate los valores negativos de forma natural. La transformación de la raíz cúbica es un candidato obvio aquí, ya que es simple, más fácil de interpretar que opciones complejas como las tangentes hiperbólicas inversas reescaladas, y tiene la ventaja de que se conserva el caso interesante y especial de 0.

Como menciona Nick Cox, tendrá que ponerlo en práctica usted mismo con cuidado porque elevar simplemente sus valores a la potencia de 1/3 no funcionará en R . En su lugar, necesitará algo como sign(x) * (abs(x))^(1/3) .

En términos más generales, lo mejor es pensar detenidamente en la naturaleza de los datos y el objetivo del análisis a la hora de decidir una transformación, y no dejar que los procedimientos enlatados guíen la forma de tratar los datos.

-1voto

Heiko Hatzfeld Puntos 151

Para transformarlo a una escala logarítmica, primero encuentra el logaritmo del número positivo y luego multiplícalo por su signo, el siguiente código debería hacerlo.

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

Utilizando el ejemplo anterior podemos trazar la siguiente distribución sesgada

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

enter image description here

Tras utilizar la función de transformación de la forma siguiente, obtenemos una distribución que parece más "normal

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

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X