[R] Estimating IRT models by using nlme() function
Dimitris Rizopoulos
d.rizopoulos at erasmusmc.nl
Sat Nov 12 09:15:25 CET 2011
Note that there are several IRT dedicated packages in R, such as the ltm
and eRm packages. For more info you may check the Psychometrics Task
View at: http://cran.r-project.org/web/views/Psychometrics.html
I hope it helps.
Best,
Dimitris
On 11/11/2011 9:38 PM, Cengiz Zopluoğlu wrote:
> Hi,
>
> I have a question about estimating IRT models by using nlme, not just rasch
> model, but also other models.
>
> Behavior Research Methods
> <http://www.springerlink.com/content/1554-351x/> Volume
> 37, Number 2<http://www.springerlink.com/content/1554-351x/37/2/>, 202-218,
> DOI: 10.3758/BF03192688
> Using SAS PROC NLMIXED to fit item response theory models (2005). Ching-Fan
> Sheu<https://mail.google.com/mail/u/0/html/compose/static_files/goog_851944013>,
> Cheng-Te Chen<https://mail.google.com/mail/u/0/html/compose/static_files/goog_851944013>,
> Ya-Hui Su and Wen-Chung Wang
>
> An example of this is provided in the paper above. They use SAS PROC
> NLMIXED, and estimate all possible binary and Polytomous IRT models. I want
> to replicate what they did using R and nlme package. I am able to fit rasch
> model, but have some error messages for 2PL IRT model. So, I could not go
> beyond that.
>
> This is really important for me, because any nonlinear model can be fitted
> by using this approach. I would like to see how well nlme() package
> recovers true parameters, not just regular IRT models but also some other
> less used IRT models.
>
> Here is the example. Let's say I have the following dataset. 1000 people
> responds five items.
>
>
> ID Item Response d1 d2 d3 d4 d5
>
> 1.1 1 1 0 1 0 0 0 0
>
> 1.2 1 2 0 0 1 0 0 0
>
> 1.3 1 3 0 0 0 1 0 0
>
> 1.4 1 4 1 0 0 0 1 0
>
> 1.5 1 5 0 0 0 0 0 1
>
> 2.1 2 1 1 1 0 0 0 0
>
> 2.2 2 2 0 0 1 0 0 0
>
> 2.3 2 3 0 0 0 1 0 0
>
> 2.4 2 4 1 0 0 0 1 0
>
> 2.5 2 5 0 0 0 0 0 1
>
> 3.1 3 1 0 1 0 0 0 0
>
> 3.2 3 2 0 0 1 0 0 0
>
> 3.3 3 3 1 0 0 1 0 0
>
> 3.4 3 4 1 0 0 0 1 0
>
> 3.5 3 5 0 0 0 0 0 1
>
> ..............................
>
> ..............................
>
> 1000.1 1000 1 1 1 0 0 0 0
>
> 1000.2 1000 2 0 0 1 0 0 0
>
> 1000.3 1000 3 1 0 0 1 0 0
>
> 1000.4 1000 4 1 0 0 0 1 0
>
> 1000.5 1000 5 0 0 0 0 0 1
>
> The items are nested within students. Response is the actual dependent
> variable. d1, d2, d3, d4, and d5 are the corresponding dummy codes for each
> item. We treat persons as random effects, and item parameters as fixed
> effects. To fit Rasch model, I run the following code:
>
>
> d<- read.table("data.txt", header=TRUE)
> d1<- d$d1
> d2<- d$d2
> d3<- d$d3
> d4<- d$d4
> d5<- d$d5
> ###########################################################
> onePL<- function(b1,b2,b3,b4,b5,theta) { #nonlinear model to fit
> b= b1*d1+b2*d2+b3*d3+b4*d4+b5*d5
> exp((theta-b))/(1+exp((theta-b)))
> }
> #####################################################################
> nlme(model=Response ~ onePL(b1,b2,b3,b4,b5,theta),
> data = d,
> fixed = b1+b2+b3+b4+b5 ~ 1,
> random = theta ~ 1 | ID,
> start=c(b1=0,b2=0,b3=0,b4=0,b5=0),
> )
>
> *OUTPUT *
>
> Nonlinear mixed-effects model fit by maximum likelihood
> Model: Response ~ onePL(b1, b2, b3, b4, b5, theta)
> Data: d
> Log-likelihood: -2597.344
> Fixed: b1 + b2 + b3 + b4 + b5 ~ 1
> b1 b2 b3 b4 b5
> -1.1240371 1.5931634 0.2574785 -2.0993236 0.8881437
> Random effects:
> Formula: theta ~ 1 | ID
> theta Residual
> StdDev: 0.9765999 0.3780802
> Number of Observations: 5000
> Number of Groups: 1000
>
>
> This make sense to me. Actually, the data was simulated data, and the b
> parameters were close to true values used to generate data. Also the
> standard deviation of random effects (theta or latent ability level in this
> case) was close to 1 that was used to generate IRT person ability
> parameters.
>
> Then, I run the following code to estimate 2 PL IRT model. It was all same,
> just add an additional "a" parameter for each item.
>
>
> twoPL<- function(a1,a2,a3,a4,a5,b1,b2,b3,b4,b5,theta) {
> a= a1*d1+a2*d2+a3*d3+a4*d4+a5*d5
> b= b1*d1+b2*d2+b3*d3+b4*d4+b5*d5
> exp(a*(theta-b))/(1+exp(a*(theta-b)))
> }
> nlme(model=Response ~ twoPL(a1,a2,a3,a4,a5,b1,b2,b3,b4,b5,theta),
> data = d,
> fixed = a1+a2+a3+a4+a5+b1+b2+b3+b4+b5 ~ 1,
> random = theta ~ 1 | ID,
> start=c(a1=1,a2=1,a3=1,a4=1,a5=1,b1=0,b2=0,b3=0,b4=0,b5=0),
> )
>
>
> It gives the following error:
>
> *Error in MEEM(object, conLin, control$niterEM) :
> Singularity in backsolve at level 0, block 1*
>
> Is there anyone who have an idea what I am doing wrong? Is there any error
> in the syntax? I never used nlme package before, so I might be missing some
> components in the code. Or, is this just estimation problem and nlme() can
> not fit this model for some reason?
>
> I would appreciate any help.
>
> Thanks
>
>
>
> ______________________________________________
> 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.
--
Dimitris Rizopoulos
Assistant Professor
Department of Biostatistics
Erasmus University Medical Center
Address: PO Box 2040, 3000 CA Rotterdam, the Netherlands
Tel: +31/(0)10/7043478
Fax: +31/(0)10/7043014
Web: http://www.erasmusmc.nl/biostatistiek/
More information about the R-help
mailing list