Intro
Reporting results of statistical analyses usually goes along with reporting p-values which indicate the probability under the null hypothesis of sampling a test statistic at least as extreme as that which was observed.
R offers quite a lot of options to format p-values. This blog post will give an overview (which is by no means comprehensive).
First, we compute a vector with six p-values and one missing value.
p <- c(0.50, 0.12, 0.045, 0.011, 0.009, 0.0000234, NA) options(scipen = 9999) # suppress scientific notation
Formatting p-values
base package (Base R)
The first function I'm going to introduce, is part of the base package, which is part of the default R installation. Thus, no install.packages() and library() function is required to use it.
Using the digits option, the number of significant digits can be specified.
format.pval(p)
## [1] "0.500" "0.120" "0.045" "0.011" "0.009" "0.00002" "NA"
format.pval(p,
digits = 2) # how many significant digits are to be used
## [1] "0.50" "0.12" "0.04" "0.01" "0.01" "0" "NA"
Hmisc package
With nsmall, the format.pval() function of the popular Hmisc package includes an option to specify the minimum number of digits to the right of the decimal point.
library(Hmisc) Hmisc::format.pval(p)
## [1] "0.500" "0.120" "0.045" "0.011" "0.009" "0.00002" "NA"
Hmisc::format.pval(p,
nsmall=3, # the minimum number of digits to the right of the decimal point
digits = 2) # how many significant digits are to be used
## [1] "0.500" "0.120" "0.040" "0.010" "0.010" "0.000" "NA"
scales package
In addition, the pvalue() function of the scales package, has got an option to specify a threshold for rounding the p-value according to a given significance level.
library(scales) scales::pvalue(p)
## [1] "0.500" "0.120" "0.045" "0.011" "0.009" "<0.001" "NA"
scales::pvalue(p,
accuracy = 0.05, # Number to round to
decimal.mark = ".", # The character to be used to indicate the numeric decimal point
add_p = TRUE) # Add "p=" before the value?
## [1] "p=0.50" "p=0.10" "p<0.05" "p<0.05" "p<0.05" "p<0.05" "p=NA"
finalfit package
The p_tidy function of the finalfit package doesn't have an option to specify the number of significant digits. With the digits option, a value for rounding the p-value can be specified.
library(finalfit) finalfit::p_tidy(p, digits = 2)
## [1] "=0.50" "=0.12" "=0.04" "=0.01" "=0.01" "<0.01" "=NA"
finalfit::p_tidy(p,
digits = 3, # value to round to, no default
prefix = NULL) # suppress prefix
## [1] "0.500" "0.120" "0.045" "0.011" "0.009" "<0.001" "NA"
psycho package
The format_p function of the psycho package formats the p-values according to predefined significance levels (<0.5, <0.1, <0.01). In addition, stars may be added.
library(psycho) psycho::format_p(p)
## [1] "> .1" "> .1" "< .05*" "< .05*" "< .01**" "< .001***" ## [7] NA
psycho::format_p(p,
stars = FALSE) # remove significance stars
## [1] "> .1" "> .1" "< .05" "< .05" "< .01" "< .001" NA
psycho::format_p(p,
stars_only = TRUE) # return only significance stars
## [1] "" "" "*" "*" "**" "***" NA