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()
yload()
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