Data detective work: work out the numerator or denominator given a percentage

Here’s some fun I had today. If you are looking at some published stats and they tell you a percentage but not the numerator & denominator, you can still work them out. That’s to say, you can get your computer to grind through a lot of possible combinations and find which are compatible with the percentage. Usually you have some information about the range in which the numerator or denominator could lie. For example, I was looking at a paper which followed 63 people who had seen a nurse practitioner when they attended hospital, and the paper told me that 18.3% of those who responded had sought further healthcare. But not everyone had answered the question; we weren’t told how many but obviously it was less than or equal to 63. It didn’t take long to knock an R function together to find the compatible numerators given a range of possible denominators and the percentage, and later I did the opposite. Here they are:

 # deducing numerator from percentage and range of possible denominators
   
whatnum<-function(denoms,target,dp) {
	nums<-rep(NA,length(denoms))
	for (i in 1:(length(denoms))) {
		d<-denoms[i]
		lo<-floor(target*d)
		hi<-ceiling(target*d)
		if(round(lo/d, digits=dp)==target) {
			nums[i]<-lo
			if(round(hi/d, digits=dp)==target) {
				warning(paste("More than one numerator is compatible with denominator ",d,"; minima are returned",sep=""))
			}
		}
		else if(round(hi/d, digits=dp)==target) nums[i]<-hi
	}
	res<-cbind(nums[!is.na(nums)],denoms[!is.na(nums)])
	res<-cbind(res,round(res[,1]/res[,2],digits=dp))
	colnames(res)<-c("numerator","denominator","proportion")
	return(res)
}
   
# and the opposite 
whatdenom<-function(nums,target,dp) {
	denoms<-rep(NA,length(nums))
	for (i in 1:(length(nums))) {
		n<-nums[i]
		lo<-floor(n/target)
		hi<-ceiling(n/target)
		if(round(n/lo, digits=dp)==target) {
			denoms[i]<-lo
			if(round(n/hi, digits=dp)==target) {
				warning(paste("More than one denominator is compatible with numerator ",n,"; minima are returned",sep=""))
			}
		}
		else if(round(n/hi, digits=dp)==target) denoms[i]<-hi
	}
	res<-cbind(nums[!is.na(denoms)],denoms[!is.na(denoms)])
	res<-cbind(res,round(res[,1]/res[,2],digits=dp))
	colnames(res)<-c("numerator","denominator","proportion")
	return(res)
}

By typing
whatnum(denoms=(30:63),target=0.183,dp=3)
I could find straight away that the only possibility was 11/60.
That particular paper also had a typo in table 4 ("995.3%") which meant it could be 99.5% or 99.3% or 95.3%. I could run each of those through and establish that it could only possibly have been 95.3%. Handy for those pesky papers that you want to stick in a meta-analysis but are missing the raw numbers!

Advertisements

3 Comments

Filed under R

3 responses to “Data detective work: work out the numerator or denominator given a percentage

  1. Pingback: Data detective work: work out the numerator or denominator given a percentage ← Patient 2 Earn

  2. PN

    which(round(outer(1:63, 1:63, “/”), 3) == .183, arr.ind = TRUE)

    • Evaluates lots of non-starter combinations, takes about 3 times longer to run. You have to bear in mind the longer code is also here because I’m a teacher, so everyone can step through it mentally.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s