Saltar al contenido principal

Cómo obtener un valor p en R

R tiene una función de valor p para cada distribución y una función de contraste para cada diseño habitual. Aquí está el mapa completo, más el argumento que decide en silencio si tu respuesta es exacta en la cola lejana.

8 min de lectura · Última revisión: 7 de agosto de 2026

La respuesta corta

Si ya tienes un estadístico de contraste, R lo convierte con una función de distribución. Todas aceptan lower.tail = FALSE para darte directamente el área de la cola superior.

EstadísticoLlamada en R (unilateral, superior)
zpnorm(z, lower.tail = FALSE)
tpt(t, df, lower.tail = FALSE)
chi-cuadradopchisq(x, df, lower.tail = FALSE)
Fpf(f, df1, df2, lower.tail = FALSE)

Para un contraste bilateral sobre una distribución simétrica, duplica la cola del valor absoluto:

2 * pt(-abs(2.31), 27)
#> 0.02876857

Chi-cuadrado y F son la excepción. Ya son de cola derecha, y duplicarlas no es una opción conservadora: carece de sentido. El conversor de chi-cuadrado explica por qué.

El argumento que decide tu exactitud

Hay dos formas de escribir una cola superior en R, y no son igual de buenas:

# Correcto
pnorm(9, lower.tail = FALSE)
#> 1.128588e-19

# Incorrecto en la cola lejana
1 - pnorm(9)
#> 0

La segunda forma calcula un número muy cercano a 1 y luego lo resta de 1. La doble precisión no puede representar la diferencia, así que la respuesta se desploma exactamente a cero, y R informa de que un resultado que debería ser 1.13 × 10⁻¹⁹ es imposible.

lower.tail = FALSE calcula la cola directamente y nunca forma la diferencia. Úsalo siempre. Esta calculadora está construida sobre el mismo principio, y por eso no imprime p = 0.000; la página de metodología muestra las comparaciones publicadas.

A partir de datos en bruto

Si tienes las observaciones en lugar del estadístico, las funciones de contraste hacen los dos pasos:

# Prueba t de Welch: la opción predeterminada de R, y la más segura
t.test(group_a, group_b)

# Prueba t de Student, suponiendo varianzas iguales
t.test(group_a, group_b, var.equal = TRUE)

# Emparejada
t.test(before, after, paired = TRUE)

# Una muestra frente a un valor objetivo
t.test(x, mu = 100)

# Chi-cuadrado sobre una tabla de contingencia
chisq.test(matrix(c(31, 19, 22, 28), nrow = 2))

# Correlación de Pearson
cor.test(x, y)

# ANOVA de un factor
summary(aov(value ~ group, data = df))

Merece la pena conocer dos valores predeterminados. t.test ejecuta la versión de Welch salvo que pidas otra cosa, que es la opción correcta porque no supone varianzas iguales. Y chisq.test aplica la corrección de continuidad de Yates a las tablas de 2 × 2 de forma predeterminada, así que su valor p será algo mayor que uno sin corregir. Pasa correct = FALSE para desactivarla si estás comparando contra una calculadora que no la aplica.

Cómo extraer el número

Todo objeto htest lleva el valor p como un elemento con nombre, así que nunca necesitas leerlo de lo impreso:

result <- t.test(group_a, group_b)
result$p.value
#> 0.02876857

result$conf.int
result$estimate

Para una regresión, los tiene la tabla de coeficientes:

coef(summary(model))[, "Pr(>|t|)"]

Por qué R imprime "< 2.2e-16"

Los métodos de impresión de R ponen un suelo de 2.2e-16 a los valores p muy pequeños, que es el épsilon de máquina de la doble precisión. Es una convención de presentación, no el valor real: el número que hay en result$p.value suele ser mucho menor y perfectamente utilizable. Si necesitas informarlo, imprime el elemento directamente en lugar del objeto.

De todos modos, un valor p así de pequeño rara vez es la parte interesante de un resultado. Dice que la nula es implausible; no dice nada sobre si el efecto es lo bastante grande como para importar. Informa el tamaño del efecto y el intervalo a su lado.

Cómo contrastar R con otra cosa

R, SciPy y esta calculadora coinciden dentro del ruido de coma flotante, porque implementan las mismas funciones subyacentes. Si quieres verificar un resultado concreto, pega tu estadístico y sus grados de libertad en la calculadora y compara. Una discrepancia en la tercera cifra significativa casi siempre significa que se ejecutó un contraste distinto —Welch frente a Student, con corrección frente a sin ella, una cola frente a dos— y no un error numérico.

Seguir leyendo

¿Listo para hacer los cálculos?

Nuestra calculadora muestra la distribución sombreada, el valor p exacto y una lectura en lenguaje claro de lo que respalda.

Abrir la calculadora de valor p

Preguntas frecuentes

¿Cómo calculo un valor p a partir de un estadístico t en R?

Usa pt con lower.tail = FALSE. Para un contraste unilateral, pt(t, df, lower.tail = FALSE). Para uno bilateral, el modismo seguro es 2 * pt(-abs(t), df), que trabaja desde la cola inferior y evita cualquier cancelación. Con t = 2.31 y df = 27 eso devuelve 0.02876857.

¿Cuál es la diferencia entre pt y qt?

pt va de un estadístico a una probabilidad, y qt va en sentido contrario. pt(2.31, 27, lower.tail = FALSE) da el área de la cola más allá de t = 2.31. qt(0.975, 27) da el valor crítico que deja un 2.5% en la cola superior, que es 2.051831. El prefijo p es la función de distribución y el prefijo q es la función cuantil, y la misma convención vale para norm, chisq y f.

¿Por qué 1 - pnorm(x) da cero?

Porque pnorm(x) se redondea exactamente a 1 en doble precisión en cuanto x es lo bastante grande, y 1 menos 1 es 0. La resta destruye la información que querías. pnorm(9, lower.tail = FALSE) calcula la cola directamente y devuelve 1.128588e-19. Usa siempre lower.tail = FALSE en lugar de restar de uno.

¿R usa Welch o Student de forma predeterminada?

Welch. El t.test de R no supone varianzas iguales salvo que pases var.equal = TRUE. Por eso los grados de libertad de R son a menudo fraccionarios: Welch los estima a partir de las dos varianzas muestrales en lugar de usar n1 + n2 − 2. Es la opción predeterminada más segura y esta calculadora toma la misma decisión.

¿Cómo saco el p valor de un objeto de contraste de R?

Asigna el contraste a una variable y lee su elemento p.value: result <- t.test(a, b); result$p.value. Todo objeto htest de R lleva p.value, y la mayoría llevan también conf.int, estimate y statistic. Leer el elemento te da la precisión completa, a diferencia de la salida impresa, que tiene un suelo en 2.2e-16.

¿Por qué chisq.test no coincide con mi calculadora?

Casi siempre por la corrección de continuidad de Yates, que R aplica a las tablas de 2 × 2 de forma predeterminada y que muchas calculadoras no aplican. Pasa correct = FALSE a chisq.test para desactivarla, y entonces ambas deberían coincidir hasta la precisión de coma flotante. El valor p corregido es el mayor y el más conservador de los dos.