R/pvalueTools.R

Defines functions `as.PvalueText` p.combine.stouffer p.combine.fisher p.combine `p.valid`

# pvalueTools.R	-- assorted tools for combining P values


`p.valid` <- function( x, min.p.value=1e-300, max.p.value=1.0) {

	# zeros and negative break most p-values
	# trap at smallest positive seen
	useX <- x
	useX[ x < 0] <- NA
	useX[ x < min.p.value] <- min.p.value
	useX[ x > max.p.value] <- max.p.value
	return( useX)
}


p.combine <- function( x) {

	x <- p.valid(x, max.p.value=0.99999)
	ansFisher <- p.combine.fisher( x, check.valid=F)
	ansStouffer <- p.combine.stouffer( x, check.valid=F)
	ansLogmean <- logmean( x, na.rm=T)
	return( max( c( ansLogmean, ansFisher, ansStouffer), na.rm=T))
}


p.combine.fisher <- function( x, check.valid=TRUE) {

	if (check.valid) x <- p.valid(x)
	return( pchisq( (sum( log(x)) * -2), df=length(x)*2, lower.tail=F))
}


p.combine.stouffer <- function( x, check.valid=TRUE) {

	if (check.valid) x <- p.valid(x, max.p.value=0.99999)
	return( pnorm( sum( qnorm( x)) / sqrt( length( x))))
}


`as.PvalueText` <- function( pvalue, digits=4) {

	# format the P-value based on how significant
	pvalue <- as.numeric(pvalue)
	out <- formatC( round( pvalue, digits=digits), format="f", digits=digits)
	logMag <- -log10( pvalue)
	needs.E <- which( logMag > digits)
	if ( length( needs.E)) {
		e.digits <- max( 1, digits-2)
		out[needs.E] <- formatC( pvalue[needs.E], format="e", digits=e.digits)
	}
	out
}
robertdouglasmorrison/DuffyTools documentation built on Sept. 13, 2024, 4:51 p.m.