R tiene un problema de comunicación: ejecutas summary(modelo) y te devuelve un bloque de números, asteriscos y expresiones como Pr(>|t|) o «p-value: < 2.2e-16», sin una sola palabra sobre qué significa nada de eso. El resultado predecible: muchos investigadores copian los números con asteriscos y esquivan el resto, con la sensación incómoda de reportar cifras que no entienden del todo.
Esta guía desmonta ese bloque pieza a pieza: qué es cada columna de la tabla de coeficientes, qué dicen las tres líneas finales de un summary(), cómo se leen los outputs de lm(), glm(), aov() y cor.test() con ejemplos numéricos completos, qué warnings de R sí deben preocuparte y cómo se traduce todo a una frase de resultados en APA 7. No necesitas saber programar para seguirla: trabajamos sobre el output ya generado, que es exactamente donde la mayoría se atasca.
Casi todo lo que R te muestra tras ajustar un modelo pasa por la misma estructura: una tabla de Coefficients con una fila por predictor (más el intercepto) y cuatro columnas fijas. Entender esas cuatro columnas resuelve el 80% del output de R, porque lm(), glm() y la mayoría de paquetes de modelado las reutilizan casi idénticas.
Los asteriscos de la derecha son solo un semáforo del p-valor: tres para p < .001, dos para p < .01, uno para p < .05 y un punto para p < .10. Sirven para escanear la tabla, pero en el texto se reporta el p-valor, no las estrellas. Y un aviso que ahorra disgustos con revisores: tres asteriscos frente a uno no significan un efecto «más grande», sino un cociente t mayor, que depende tanto del efecto como del error estándar.
Tras la tabla de coeficientes, un summary() de lm() cierra con tres líneas sobre el modelo completo. Residual standard error es el error típico de predicción en las unidades de tu variable dependiente: si predices una escala de estrés y el RSE es 5.24, tus predicciones fallan en promedio unos 5 puntos. Multiple R-squared es la proporción de varianza explicada por el conjunto de predictores; Adjusted R-squared la corrige penalizando el número de predictores. La F-statistic contrasta el modelo entero contra uno sin predictores: su p-valor dice si el modelo, como bloque, explica algo. Y un detalle que se escapa a menudo: los grados de libertad que la acompañan, «on 2 and 139 DF», son exactamente los que necesitas para reportarla como F(2, 139).
Supón que ajustas lm(estres ~ horas_sueno + edad) con 142 estudiantes universitarios y summary() te devuelve esta tabla de coeficientes: el intercepto con Estimate 24.813, error estándar 2.107, t = 11.776 y Pr(>|t|) < 2e-16; horas_sueno con Estimate −1.924, error estándar 0.413, t = −4.659 y Pr(>|t|) = 7.3e-06; y edad con Estimate 0.118, error estándar 0.077, t = 1.532 y Pr(>|t|) = 0.128. Debajo: Residual standard error 5.24 on 139 degrees of freedom, Multiple R-squared 0.176, Adjusted R-squared 0.164 y F-statistic 14.84 on 2 and 139 DF con p-value 1.4e-06.
La lectura sustantiva: por cada hora adicional de sueño, la puntuación de estrés baja en promedio 1.92 puntos, controlando la edad, y ese efecto es estadísticamente distinto de cero (p < .001). La edad no muestra un efecto detectable (p = .128): no puedes afirmar que no exista, solo que con estos datos no se distingue de cero. El intercepto, el estrés predicho para alguien con cero horas de sueño y cero años, es matemáticamente necesario pero sustantivamente absurdo, y no se interpreta. El modelo completo explica el 17.6% de la varianza, F(2, 139) = 14.84, p < .001, una magnitud típica en psicología, donde los R² por encima de .40 son la excepción, no la norma.
Antes de escribir nada, pide los intervalos con confint(modelo): para horas_sueno devuelve [−2.74, −1.11], la horquilla de valores plausibles del efecto que APA 7 espera junto al coeficiente.
El summary() de una regresión logística, glm(.., family = binomial), tiene la misma tabla de coeficientes, con dos trampas. La primera: la columna se llama «z value» en lugar de «t value», porque el contraste usa la distribución normal, y la última pasa a ser Pr(>|z|). La segunda y más grave: los Estimate están en log-odds, una escala en la que nadie piensa. Un Estimate de −0.482 no significa «baja 0.482 la probabilidad»: significa que el logaritmo del odds baja 0.482, que no dice nada hasta que lo exponencias.
Ejemplo: modelas abandono terapéutico (sí/no) con la alianza terapéutica como predictor en 160 pacientes, y obtienes para alianza un Estimate de −0.482, error estándar 0.131, z = −3.679 y Pr(>|z|) = 0.000234. Ejecutas exp(coef(modelo)) y obtienes 0.62: por cada punto adicional de alianza terapéutica, el odds de abandonar el tratamiento se multiplica por 0.62, es decir, se reduce un 38%. Con exp(confint(modelo)) obtienes el intervalo del odds ratio, [0.48, 0.80]: como no incluye el 1, el valor nulo en escala de odds ratio, no el 0, el efecto es estadísticamente significativo.
El pie del output también cambia: no hay R² ni F. Encontrarás Null deviance (el desajuste del modelo vacío), Residual deviance (el de tu modelo: cuanto más baje respecto a la nula, más aporta) y AIC, que solo sirve para comparar modelos entre sí: menor AIC, mejor modelo. Si tu revista pide un pseudo-R², calcúlalo aparte (McFadden o Nagelkerke); R base no lo da y no es un olvido tuyo.
No todo en R es una tabla de coeficientes: los dos análisis más frecuentes en tesis de psicología y ciencias de la salud tienen formatos propios que conviene leer de un vistazo.
Un summary() sobre aov() devuelve una tabla con Df, Sum Sq, Mean Sq, F value y Pr(>F). Ejemplo: comparas depresión post-tratamiento entre tres condiciones (TCC, ACT y lista de espera) con 90 participantes, y la fila del factor grupo muestra Df 2, Sum Sq 412.6, Mean Sq 206.3, F value 8.42 y Pr(>F) 0.000442; la fila Residuals, Df 87 y Sum Sq 2131.5. La lectura: las medias de los tres grupos no son todas iguales, F(2, 87) = 8.42, p < .001. Y ahí se acaba lo que el output dice: la F es un test ómnibus que no indica qué grupos difieren, para eso, comparaciones post hoc como TukeyHSD(modelo), . El tamaño del efecto tampoco viene de serie, pero está escondido en la tabla: eta cuadrado es la Sum Sq del factor entre la suma total, aquí 412.6 / (412.6 + 2131.5) = .16, un efecto grande según las convenciones habituales.
cor.test() es la excepción amable: lo da casi todo hecho. Correlacionas rumiación e insomnio en 96 participantes y devuelve t = 4.36, df = 94, p-value = 3.3e-05, un 95 percent confidence interval de [0.23, 0.56] y, bajo sample estimates, cor = 0.41. La r está al final, no al principio: el número importante es ese 0.41, una correlación moderada-alta para estándares de psicología, junto a su intervalo, que dice que el dato es compatible con un efecto entre modesto y fuerte; la t y sus grados de libertad son el mecanismo del contraste. Ojo si usas method = "spearman" con datos empatados: R avisará de que no puede calcular el p-valor exacto, un warning benigno del que hablamos a continuación.
R avisa mucho y explica poco: la habilidad crítica no es leer los warnings sino clasificarlos, cuáles invalidan el análisis, cuáles piden una decisión y cuáles son ruido, . Los que más aparecen en outputs de modelado:
Interpretar bien el output es la mitad del trabajo; la otra mitad es transcribirlo sin traicionarlo. No es un detalle cosmético: de 346 manuscritos que hemos analizado con criterios de revista Q1, el 84% recibió el equivalente a Major revisions, y el 62% de las debilidades se concentran en método y análisis, con la transcripción de resultados como sospechoso habitual: p-valores imposibles, intervalos ausentes, log-odds interpretados como probabilidades.
La estructura de una frase de resultados APA es siempre la misma: qué se encontró en lenguaje sustantivo, seguido de la evidencia estadística entre comas. Con el lm() del ejemplo: «Las horas de sueño predijeron negativamente el estrés percibido, b = −1.92, ET = 0.41, t(139) = −4.66, p < .001, IC 95% [−2.74, −1.11], y el modelo explicó una proporción significativa de la varianza, F(2, 139) = 14.84, p < .001, R² = .18». Con el glm(): «Una mayor alianza terapéutica se asoció con menor probabilidad de abandono, OR = 0.62, IC 95% [0.48, 0.80], p < .001». Cada número tiene su casilla exacta en el output: Estimate es b, Std. Error es ET y los grados de libertad salen de las líneas del RSE y de la F.
Es el p-valor bilateral del coeficiente: la probabilidad de obtener un t tan alejado de cero como el observado, en cualquier dirección, si el efecto real fuera nulo. La notación intimida pero es literal: probabilidad de que |t| supere el valor obtenido. Cuidado con la notación científica: 7.3e-06 es 0.0000073.
Como p < .001. Ese 2.2e-16 es el número más pequeño que la máquina representa con precisión, no tu p-valor real, y no significa p = 0, que es matemáticamente imposible en un contraste de hipótesis. Copiar «p < 2.2e-16» en un manuscrito delata que se transcribió el output sin interpretarlo.
Para describir tu modelo final suele reportarse el Multiple R-squared (el R² a secas en APA), y muchas revistas agradecen ambos. El ajustado es imprescindible al comparar modelos con distinto número de predictores: el múltiple siempre sube al añadir variables, aunque sean ruido; el ajustado puede bajar.
Porque glm() no se estima por mínimos cuadrados y esos índices no existen en su forma clásica. R base ofrece deviance y AIC para comparar modelos. Si necesitas un índice tipo R², calcula un pseudo-R² (McFadden con el paquete pscl, o Nagelkerke) y nómbralo explícitamente, porque no es intercambiable con el R² de una regresión lineal.