es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obtén el exponente que debo utilizar en la escala para hacer que todos los números en el vector sean >= 1.

Digamos que tengo un vector de números, que pueden ser menores que 1 pero nunca menores o iguales que 0.

> x = abs(rnorm(30))
> x
 [1] 0.32590946 0.05018667 1.54354863 0.28925652 0.61712682 0.09444528
 [7] 0.87951971 1.46243702 0.87099892 1.28553745 0.70360649 0.58973942
[13] 1.20054389 0.94429737 0.64038139 1.04173338 0.24249771 1.67273503
[19] 0.77546385 0.33547348 1.73480609 0.20757933 1.94491872 1.10547259
[25] 1.28570768 1.37621399 0.99389595 2.14107987 2.31719369 1.24458788

Y cuando registro el vector completo, obtengo valores negativos:

> log(x)
 [1] -1.121135658 -2.992005742  0.434084070 -1.240441366 -0.482680726
 [6] -2.359734671 -0.128379302  0.380104238 -0.138114546  0.251176883
[11] -0.351536037 -0.528074505  0.182774695 -0.057314153 -0.445691353
[16]  0.040886038 -1.416763021  0.514460030 -0.254293908 -1.092212359
[21]  0.550895644 -1.572241722  0.665220187  0.100272928  0.251309290
[26]  0.319336240 -0.006122756  0.761310314  0.840356837  0.218804452

Ahora, el mínimo de este vector es:

> min(x)
[1] 0.05018667

Mi pregunta es la siguiente. Quiero escalar los datos por 10^x o por 2^x (dependiendo del registro), de manera que el registro realizado en este conjunto escalado produzca solo números positivos (o no negativos). ¿Cómo puedo obtener el exponente más bajo que lo haga?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para escalar los datos por 10^x o 2^x, es necesario determinar el exponente más bajo que garantice que el registro realizado en el conjunto escalado producirá solo números positivos (o no negativos). Este exponente se puede obtener siguiendo los siguientes pasos:

    1. Determinar la base del logaritmo utilizado en log(x). Si no se especifica una base, se asume que es el logaritmo natural (base e).
    2. Calcular el valor mínimo de log(x).
    3. Calcular el valor mínimo de x.
    4. Derivar el factor de escala tomando el inverso del valor mínimo de log(x) y elevando la base del logaritmo a esta potencia. Si el valor mínimo de log(x) es negativo, se debe tomar el valor absoluto antes de encontrar su inverso.
    5. Escalar el vector original multiplicando cada elemento por el factor de escala.

    Aquí hay un código R que implementa estos pasos:

    # Paso 1: Determinar la base del logaritmo
    log_base <- attr(log(x), "base")  # por defecto: base e
    
    # Paso 2: Calcular el valor mínimo de log(x)
    min_log <- min(log(x))
    
    # Paso 3: Calcular el valor mínimo de x
    min_x <- min(x)
    
    # Paso 4: Derivar el factor de escala
    if (min_log >= 0) {
      # Todos los valores de log(x) son no negativos; no se necesita escala
      scaling_factor <- 1
    } else {
      scaling_factor <- ifelse(log_base == exp(1),
                               exp(abs(min_log)),  # logaritmo natural
                               log_base^abs(min_log))  # otra base
    
      # verificar que el factor de escala produzca valores no negativos
      stopifnot(all(scaling_factor * x >= 0))
    }
    
    # Paso 5: Escalar el vector original
    scaled_x <- scaling_factor * x
    

    Si deseamos escalar los datos por 2^x, es necesario especificar la base del logaritmo como 2 en el Paso 1.

Comments are closed.