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:


> 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@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.

Reply via email to