Leer un p-valor muy pequeño en R

Estoy usando R y estaba encontrando problemas para calcular el valor p para una gran cantidad de z para algunos genes. Usé el paquete Rmpfr para que funcione usando el siguiente código (gracias a este foro)

2*Rmpfr::pnorm(mpfr(abs(38.77589104), precBits=100), lower.tail=FALSE, log.p = FALSE)
6.5625457492544973317295147124225e-329

Introduzco el valor anterior como 6.56E-329. Ahora, el problema es cuando estoy tratando de leer el archivo que contiene todos los valores de p, de nuevo lee el valor anterior como 0.

pval <- file$pvalue
pval[1]
[1] 0
pval[1] <- 6.56E-329
pval[1]
[1] 0

Necesito el valor exacto para un análisis más profundo. ¿Hay una manera de leer el valor como está en un archivo?

¡Mucho apreciado! Gracias.

Pregunta hecha hace 3 años, 5 meses, 0 días - Por techtrailblazer


3 Respuestas:

  • ¿Cómo creaste el archivo de p-valores? A menos que usaras save() y load() despojaste la precisión cuando los salvaste:

    library(Rmpfr)
    pval <- 2*Rmpfr::pnorm(mpfr(abs(38.77589104), precBits=100), lower.tail=FALSE, log.p = FALSE)
    pval
    # 1 'mpfr' number of precision  100   bits 
    # [1] 6.5625457492544973317295147124225e-329
    save(pval, file="Test.RData")
    rm(pval)
    pval
    # Error: object 'pval' not found
    load("Test.RData")
    pval
    # 1 'mpfr' number of precision  100   bits 
    # [1] 6.5625457492544973317295147124225e-329
    

    Puede importar valores de precisión extendidos como cadenas de caracteres y mpfr los convertirá:

    example <- c("1.4142135623730951454746218587388", "1.7320508075688771931766041234368", 
    "2.2360679774997898050514777423814", "2.6457513110645907161710965738166", 
    "3.3166247903553998099823729717173")
    mpfr(example)
    # 5 'mpfr' numbers of precision  107   bits 
    # [1] 1.414213562373095145474621858738804 1.732050807568877193176604123436797 2.236067977499789805051477742381394
    # [4] 2.645751311064590716171096573816588 3.316624790355399809982372971717293
    mpfr(example)^2
    # 5 'mpfr' numbers of precision  107   bits 
    # [1] 2.000000000000000273432346306476854 2.999999999999999652374485391952952 5.000000000000000485863154281767975
    # [4] 7.000000000000000664980387281581168 10.99999999999999974042396434698263
    

    Respondida el Dec 17, 2020 a las 04:15 - por logicluminary3c42

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando se debe a que cuando lees los valores del archivo, R los puede interpretar como numéricos en lugar de como caracteres. Cuando los valores son tan pequeños como el que estás intentando leer (6.56E-329), R los puede interpretar como 0 debido a la precisión limitada de los números de punto flotante en R.

    Para evitar que R convierta el valor en 0 al leerlo desde el archivo, puedes leerlo como un caracter y luego convertirlo a tipo de dato numérico. Aquí te muestro cómo puedes hacerlo:

    R
    

    Leer los valores del archivo como caracteres

    pval <- as.character(file$pvalue)

    Mostrar el valor tal como se lee del archivo

    print(pval[1])

    Convertir el valor a tipo de dato numérico

    pval_numeric <- as.numeric(pval[1])

    Mostrar el valor como tipo de dato numérico

    print(pval_numeric)

    De esta forma, podrás leer y conservar el valor exacto del p-valor que deseas utilizar en tu análisis. Espero que esta información te sea útil. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 18, 2020 a las 04:15 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema es que estás intentando almacenar un número de punto flotante muy pequeño en una variable de tipo numérico, que tiene una precisión limitada. Para almacenar números de punto flotante muy pequeños con precisión, debes utilizar el tipo de variable numeric.

    Aquí tienes el código corregido:

    r
    pval <- file$pvalue
    pval[1] <- as.numeric(6.56E-329)
    pval[1]
    [1] 6.562545749254497e-329
    

    Ahora, pval[1] debería contener el valor exacto de 6.562545749254497e-329.

    Respondida el Dec 18, 2020 a las 04:19 - por Gemini

    Votos positivos: 0 | Votos negativos: 0