[R] Conditional assignment of values to vector using ifelse

David Winsemius dwinsemius at comcast.net
Sat May 24 17:35:04 CEST 2014


On May 24, 2014, at 6:58 AM, Jason Stout, M.D. wrote:

> Hi R-users,
> 
> I'm trying to simulate the outcome of several diagnostic tests with binary outcomes (positive/negative) and different performance characteristics.  What I would like to generate is a dataframe with the first column representing the result of a "perfect" test, and different columns to the right simulating tests with different combinations of sensitivity and specificity.  Here's the code I used to attempt this:
> 
> x3<-rmvbin(10000,margprob=0.2) # results of perfect test, disease prevalence 20%
> sens1<-0.7 # sensitivity of test 1
> spec1<-0.8 # specificity of test 1
> sens2<-0.8 # sensitivity of test 2
> spec2<-0.7 # specificity of test 2
> funcsensspec<-function(x,sens,spec) {
>  result<-ifelse(x==1,ifelse(runif(1,0,1)<=sens,1,0),
>                 ifelse(runif(1,0,1)<=spec,0,1))
>  return(result)
> }
> x4<-funcsensspec(x3,sens1,spec1)
> x5<-funcsensspec(x3,sens2,spec2)
> xx<-cbind(x3,x4,x5)
> 
> The problem is that this is not behaving as I expected.  Ideally I wanted R to randomly reassign values for each row with probability based on test characteristics, but what I think it is doing is generating one random value and using that to reassign the entire vector.  Here is sample output:

I think you need to re-examine your understanding of sensitivity and specificity. They are mappings from data to a continuous variable in [0,1] for  varying choice of a continuously variable threshold, rather than a sampling parameter. The typical display of ROC curves is if no help to physicians because it obscures this relationship by failing to include annotations with the threshold values.

-- 
David Winsemius, MD
> 
> 
>> head(xx,30)
>      [,1] [,2] [,3]
> [1,]    0    1    0
> [2,]    0    1    0
> [3,]    0    1    0
> [4,]    0    1    0
> [5,]    0    1    0
> [6,]    0    1    0
> [7,]    1    1    1
> [8,]    0    1    0
> [9,]    1    1    1
> [10,]    0    1    0
> [11,]    1    1    1
> [12,]    0    1    0
> [13,]    0    1    0
> [14,]    1    1    1
> [15,]    0    1    0
> [16,]    1    1    1
> [17,]    0    1    0
> [18,]    0    1    0
> [19,]    0    1    0
> [20,]    0    1    0
> [21,]    0    1    0
> [22,]    0    1    0
> [23,]    0    1    0
> [24,]    1    1    1
> [25,]    0    1    0
> [26,]    0    1    0
> [27,]    0    1    0
> [28,]    0    1    0
> [29,]    0    1    0
> [30,]    0    1    0
> 
> I know I could do this task by creating two actual vectors of random numbers and using them to assign probabilities, but am wondering if there is a simpler and more elegant way to accomplish the task (and this would provide some insight into how ifelse is working within this function).
> 
> Thanks for any assistance.
> 
> 
> Jason Stout, MD, MHS
> Box 102359-DUMC
> Durham, NC 27710
> FAX 919-681-7494
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

David Winsemius
Alameda, CA, USA



More information about the R-help mailing list