[R] Help vectorizing data generation for IRT graded response model

drj571 jared.harpole at gmail.com
Mon Nov 19 17:40:51 CET 2012


Hello, 

I have code that will generate data for a 5 category IRT graded response
model.  However, the code could be improved through vectorizing.  Here is
the code below:

###Inputs
N <- 100 #Number of people taking test
n <- 10 #Number of items
nCat <- 5  #number of categories
###Generate Item parameters for 10 items
a.1 <- rlnorm(n, .25, .5)
b.1 <- matrix(0, n, (nCat - 1))
theta <- rnorm(N, mean = 0, sd =1)
###Generate threhold parameters for b.1 GRM with 10 items there are 4
thresholds for 5 categories
###Using this method is for b dist as N(0,1) since b.1[,1] mean is -.6
###and b.1[,2] to b.1[,4] are all .2
b.1[, 1] <- rnorm(n, -.6, 1)
for(j in 1:n) {
    b.1[j, 2] <- b.1[j,1] + runif(1, .5, .9)
    b.1[j, 3] <- b.1[j,2] + runif(1, .5, .9)
    b.1[j, 4] <- b.1[j,3] + runif(1, .5, .9)
}

###This code simulates participants taking a test and generates the 5
category item responses
    p <- array(0,c(N,n,nCat))
    pstar <- array(1,c(N,n,nCat))
    u <- matrix(0,N,n)
    for (i in 1:N) {
        for (j in 1:n) {
            #Draw a random number to determine categories
            r <- runif(1, 0, 1)
            for (k in 2:nCat) {
                pstar[i, j, k] <- 1 / (1 + exp(-a.1[j] * (theta[i] - b.1[j,
(k-1)])))
                p[i,j,(k-1)] <- pstar[i, j, (k-1)] - pstar[i, j, k]
            }
            p[i, j, nCat] <- pstar[i, j, 5] #probability of last category or
higher is that category
            
            if (r <= p[i, j, 1]) {
                u[i,j] <- 1
            } else
                if (r <= p[i,j,1] + p[i,j,2]) {
                    u[i,j] <- 2   
                } else
                    if (r <= p[i,j,1] + p[i,j,2] + p[i,j,3]) {
                        u[i,j] <- 3
                    } else
                        if (r <= p[i,j,1] + p[i,j,2] + p[i,j,3] + p[i,j,4])
{
                            u[i,j] <-4
                        } else
                            if (r <= 1) {
                                u[i,j] <-5
                            }
        }
    }


Obviously, that is really long and hairy.  I am wondering what would be the
best way to write this more compactly.  In conjunction with a colleague, I
have a solution for a binary IRT model with response categories 0,1.

Here is that code:
N <- 100
n <- 10
a.1 <- rlnorm(n, .25, .5)
b.1 <- rnorm(n, 0, 1)
theta <- rnorm(N, 0, 1)

###Function to generate 2PL data
dichEq <- function(a.1, b.1, theta) {
    1/(1 + exp(-a.1 * (theta -b.1)))
}
probVal <- mapply(FUN = function(x,y) dichEq(x,y,theta), a.1, b.1)
u <- apply(probVal, 2, function(x) rbinom(length(x), 1, x))

Can someone provide some guidance on how to generalize this to the ordered
category case?

Thanks, 

Jared



--
View this message in context: http://r.789695.n4.nabble.com/Help-vectorizing-data-generation-for-IRT-graded-response-model-tp4650062.html
Sent from the R help mailing list archive at Nabble.com.



More information about the R-help mailing list