[R] Generating Replicate Datasets (using loops or other means)

Moshe Olshansky
2007-09-11T00:23:02Z

Hi Jonathan,

What exactly do you mean by replication?
Do you want to keep a1,b1,c1,... unchanged but have 30
different sets of random numbers?

Regards,

Moshe.

--- VTLT1999 <jonathan-beard at uiowa.edu> wrote:

>
> Hello All,
>
> I have searched many help forums, message boards,
> etc. and I just can't
> apply the comments to what I need my program to do.
> I am running R 2.5.1 on
> an XP system, and my desire is to produce replicate
> datasets for a
> simulation study I am running.  Essentially, I have
> sets of parameters (a's,
> b's, and c's) that define a function which produces
> a decimal value.  This
> value is compared to a random uniform value, and is
> coded a 1 if the
> function is greater than the uniform value, 0 if it
> is <= to the uniform
> value.  My code thus far works great, but I just
> need it to run several
> times.    Here we go:
>
> library(mvtnorm)
> library(sm)
> library(ltm)
> library(irtoys)
>
> k<- 5000
> set.seed(271828)
> t <-
>
rmvnorm(n=k,mean=c(-1,0,1),sigma=matrix(c(1,.8,.5,.8,1,.8,.5,.8,1),3,3))
>
>   #Using mv here because of the likely association
> of ability (theta = t)
> across time.
>
> t1<-as.matrix(t[,1])
> t2<-as.matrix(t[,2])
> t3<-as.matrix(t[,3])
>
> set.seed(271828)
>
> #  Population item parameters (n=54)  from which we
> will select relevant
> items
> #  These are the parameters that are used in the
> function
>
> a <- c(1.18120, 0.92613, 0.96886, 0.80503, 1.12384,
>        0.84073, 0.85544, 0.86801, 1.01054, 0.82278,
>        1.10353, 0.78865, 0.98421, 1.76071, 0.89603,
>        0.84671, 0.89737, 0.74775, 0.32190, 0.69730,
>        0.72059, 1.16762, 1.29257, 1.32902, 0.59540,
>        0.51022, 0.59259, 0.93951, 0.68568, 0.55649,
>        0.88084, 0.52940, 0.45735, 0.57560, 1.11779,
>        0.96984, 1.19692, 0.99102, 1.25847, 1.62555,
>        0.63049, 1.07807, 1.04897, 1.23138, 1.14014,
>        1.25230, 1.14844, 0.59287, 0.83143, 0.81723,
>        0.52141, 0.61980, 0.49945, 1.02749)
>
> b <- c(-2.51737, -1.95897, -1.72667, -0.82988,
> -0.36093,
>         0.72554,  0.91442,  0.78061,  0.06088,
> 0.75733,
>        -0.76371,  0.24552, -0.42050,  0.88232,
> -0.81761,
>         0.06466, -0.43866, -0.46042,  0.21636,
> -0.73147,
>        -1.44086, -1.03718,  0.07275, -0.17197,
> 1.53796,
>        -0.45631, -1.69826, -0.66506,  0.98921,
> 0.30714,
>        -0.62245,  0.97253,  1.95894,  0.21277,
> 1.96346,
>         1.18825,  1.59917, -0.28401, -1.23530,
> -0.09671,
>        -0.31581, -0.66149, -0.81284, -0.35399,
> -0.07623,
>         1.06442, -0.68559,  1.07591,  0.97458,
> 0.06436,
>         1.25622,  1.73954,  1.75052,  2.34088)
>
> c <- c(0.00000, 0.00000, 0.00000, 0.00000, 0.19648,
>        0.31302, 0.26454, 0.19714, 0.06813, 0.21344,
>        0.00000, 0.03371, 0.00000, 0.16581, 0.11054,
>        0.08756, 0.07115, 0.26892, 0.00000, 0.06883,
>        0.00000, 0.14815, 0.32389, 0.19616, 0.17597,
>        0.00000, 0.00000, 0.04337, 0.19949, 0.20377,
>        0.00000, 0.06243, 0.13639, 0.00000, 0.18166,
>        0.15996, 0.20184, 0.08331, 0.24453, 0.26114,
>        0.16434, 0.20750, 0.32658, 0.31870, 0.45227,
>        0.35039, 0.31178, 0.17999, 0.22774, 0.21675,
>        0.10153, 0.17764, 0.15205, 0.19858)
>
> #  Item parameters for generating 3PL data for all
> five testing occasions:
> #  This selects the relevant parameters for a
> particular data generation run
> #  Only parameters for the first testing occasion
> are shown to save space
>
> a1 <- as.matrix(a[c(1:5,15:20,22:24,38:44)])
> b1 <- as.matrix(b[c(1:5,15:20,22:24,38:44)])
> c1 <- as.matrix(c[c(1:5,15:20,22:24,38:44)])
>
> #  Here is where I would like to begin my
> replications, but don't know how
> to make R do it.
> #  The code below produces a matrix of 0's and 1's
> (which will be used by
> another program)
> #  I would like to nest this in a "do loop" such
> that, say, 30 replicate
> datasets are produced using the
> #    same parameters.
>
>    N <- nrow(t1)     # number of examinees
>    n <- nrow(a1)     # number of items
>    d <- 1.7
>    theta <- t1
>    response <- matrix (0,N,n)
>    uni <- matrix (runif(N*n),nrow = N)
>
>    for (i in 1:N)
>    {
>      for (j in 1:n)
>      {
>       if (
> c1[j]+(1-c1[j])/(1+exp(-d*a1[j]*(theta[i]-b1[j]))) >
> uni[i,j] )
>          response[i,j] = 1
>        else
>          response[i,j] = 0
>      }
>    }
> write.table(response, file="C:/responses.dat", sep="
> ",row.names=FALSE,
> col.names=FALSE)
>
> I tried earlier nesting this in another for loop,
> but that indexes elements
> of matrices and vectors, and doesn't seem to apply
> to a "global" loop
> methodology.  I am attempting to use replicate as we
> speak, but
> documentation is sparse (help("replicate") is nested
> in lapply information).
> Any guidance is greatly appreciated.
>
> Thanks in advance,
>
> Jonathan Beard
>
> --
> View this message in context:
>
http://www.nabble.com/Generating-Replicate-Datasets-%28using-loops-or-other-means%29-tf4418768.html#a12603580
> Sent from the R help mailing list archive at
> Nabble.com.
>
> ______________________________________________
> R-help at stat.math.ethz.ch 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.
>