Test Information Function

518 views
Skip to first unread message

Conal Monaghan

unread,
Feb 6, 2016, 4:19:48 AM2/6/16
to mirt-package
Hi all,
       I have recently swapped from ltm() to mirt() and am stuck on extracting simple test level information. Although this seems like too easy a question for this forum, how do I extract total test information (total test information statistic as opposed to information/plot for each level of the latent trait)? The analogous function in ltm() is information() - Similarly it would be fantastic to be able to extract total standard error statistic (once again total as opposed to for each level of theta). It would also be useful to constrain the information for values of Theta, i.e. information/SE between -3 and 0 for Theta (function in ltm() is information(Model, c(-3, 0)).

If possible, can this info also be placed onto mirt() figures such as on plot(Model, type = 'infoSE'). This can be achieved in ltm() by the following:

> plot(Model, type = "IIC", items = 0, lwd = 2, cex.lab = 1.2, cex.main = 1.3)
     info <- information(Model, c(-3, 0))
     text(x = 2, y = 0.5, labels = paste("Total Information:", round(info$InfoTotal, 3),
     "\n\nInformation in (-3, 0):", round(info$InfoRange, 3),
     paste("(", round(100 * info$PropRange, 2), "%)", sep = "")), cex = 1.2)


Thanks for all your help in advance!

 - Conal


Phil Chalmers

unread,
Feb 6, 2016, 9:47:03 AM2/6/16
to Conal Monaghan, mirt-package
Hi Conal,

On Sat, Feb 6, 2016 at 4:19 AM, Conal Monaghan <conal.m...@gmail.com> wrote:
Hi all,
       I have recently swapped from ltm() to mirt() and am stuck on extracting simple test level information. Although this seems like too easy a question for this forum, how do I extract total test information (total test information statistic as opposed to information/plot for each level of the latent trait)? The analogous function in ltm() is information() -

I'm somewhat confused by this function. Could you elaborate on why one would ever want the definite integral for the test information function? The area doesn't seem like a very useful indication of anything theoretically meaningful (besides a simple proportion compared to the total information available). A measure like this just seems to be a restatement of the item difficulty because more difficult items will have more information in the upper ability domain.

Yes it is possible to wrap testinfo()/iteminfo() with integrate(), but I'm wondering why someone would need this anyway, and whether a function should be added to the package.

 
Similarly it would be fantastic to be able to extract total standard error statistic (once again total as opposed to for each level of theta). It would also be useful to constrain the information for values of Theta, i.e. information/SE between -3 and 0 for Theta (function in ltm() is information(Model, c(-3, 0)).

All possible with the internal functions when combined with integrate(). Though total SE approaches Inf and probably shouldn't be used (becomes Inf as I(theta) -> 0 because of the inverse relationship).
 

If possible, can this info also be placed onto mirt() figures such as on plot(Model, type = 'infoSE'). This can be achieved in ltm() by the following:

> plot(Model, type = "IIC", items = 0, lwd = 2, cex.lab = 1.2, cex.main = 1.3)
     info <- information(Model, c(-3, 0))
     text(x = 2, y = 0.5, labels = paste("Total Information:", round(info$InfoTotal, 3),
     "\n\nInformation in (-3, 0):", round(info$InfoRange, 3),
     paste("(", round(100 * info$PropRange, 2), "%)", sep = "")), cex = 1.2)


Thanks for all your help in advance!

 - Conal


--
You received this message because you are subscribed to the Google Groups "mirt-package" group.
To unsubscribe from this group and stop receiving emails from it, send an email to mirt-package...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Phil Chalmers

unread,
Feb 6, 2016, 10:35:33 AM2/6/16
to Conal Monaghan, mirt-package
Just as a follow up, this is what ltm is doing but with mirt's functions:

library(ltm)
library(mirt)
dat <- expand.table(LSAT7)

Model <- ltm(dat ~ z1)

plot(Model, type = "IIC", items = 0, lwd = 2, cex.lab = 1.2, cex.main = 1.3)
info <- information(Model, c(-3, 0))
text(x = 2, y = 0.5, labels = paste("Total Information:", round(info$InfoTotal, 3),
                                    "\n\nInformation in (-3, 0):", round(info$InfoRange, 3),
                                    paste("(", round(100 * info$PropRange, 2), "%)", sep = "")), cex = 1.2)

mod <- mirt(dat, 1)
f <- function(theta, mod) testinfo(mod, matrix(theta))
(ii <- integrate(f, lower = -3, upper = 0, mod=mod))
(iT <- integrate(f, lower = -10, upper = 10, mod=mod))

Theta <- matrix(seq(-3,3, length.out=1000))
info <- testinfo(mod, Theta)
plot(info ~ Theta, type = 'l')
text(x = 2, y = 0.5, labels = paste("Total Information:", round(iT$value, 3),
                                    "\n\nInformation in (-3, 0):", round(ii$value, 3),
                                    paste("(", round(100 * ii$value/iT$value, 2), "%)", sep = "")), cex = 1.2)


Phil

Conal Monaghan

unread,
Feb 11, 2016, 6:09:01 PM2/11/16
to mirt-package
 Hi Phil,
    Interesting and thanks for your expanded answer on the mirt and ltm crossover. The reason for quantifying the area under the curve is for Polytomous items in psychological scale construction. As the discrimination parameter is less useful here, I want to be able to compare similar items and groups. To do this, it is useful to be able to compare the amount of information between very similar combinations of items to determine optimum scale construction. quantifying the information seems like a better way that visually comparing very similar IIC/SIC and would also allow us to look quantify where the information lies: e.g., item one has 80% of information between -1 and 1 logits and thus is targeted at this population.  For our purposes, it would also be useful to be able to overlap the information curves for all the items within the scale to compare them directly. 

Thanks again,
 - Conal

Phil Chalmers

unread,
Feb 11, 2016, 8:34:33 PM2/11/16
to Conal Monaghan, mirt-package
On Thu, Feb 11, 2016 at 6:09 PM, Conal Monaghan <conal.m...@gmail.com> wrote:
 Hi Phil,
    Interesting and thanks for your expanded answer on the mirt and ltm crossover. The reason for quantifying the area under the curve is for Polytomous items in psychological scale construction. As the discrimination parameter is less useful here, I want to be able to compare similar items and groups. To do this, it is useful to be able to compare the amount of information between very similar combinations of items to determine optimum scale construction. quantifying the information seems like a better way that visually comparing very similar IIC/SIC and would also allow us to look quantify where the information lies: e.g., item one has 80% of information between -1 and 1 logits and thus is targeted at this population.  

I see what you are saying, thanks. I'll consider adding a function to do this then in the next major release, though it will only have support for unidimensional IRT models (which I'm sure is just fine). 
 
For our purposes, it would also be useful to be able to overlap the information curves for all the items within the scale to compare them directly. 

Do you mean something like plot(mod, type = 'infotrace', facet=FALSE)? Cheers.

Phil
 

Thanks again,
 - Conal




On Saturday, February 6, 2016 at 8:19:48 PM UTC+11, Conal Monaghan wrote:
Hi all,
       I have recently swapped from ltm() to mirt() and am stuck on extracting simple test level information. Although this seems like too easy a question for this forum, how do I extract total test information (total test information statistic as opposed to information/plot for each level of the latent trait)? The analogous function in ltm() is information() - Similarly it would be fantastic to be able to extract total standard error statistic (once again total as opposed to for each level of theta). It would also be useful to constrain the information for values of Theta, i.e. information/SE between -3 and 0 for Theta (function in ltm() is information(Model, c(-3, 0)).

If possible, can this info also be placed onto mirt() figures such as on plot(Model, type = 'infoSE'). This can be achieved in ltm() by the following:

> plot(Model, type = "IIC", items = 0, lwd = 2, cex.lab = 1.2, cex.main = 1.3)
     info <- information(Model, c(-3, 0))
     text(x = 2, y = 0.5, labels = paste("Total Information:", round(info$InfoTotal, 3),
     "\n\nInformation in (-3, 0):", round(info$InfoRange, 3),
     paste("(", round(100 * info$PropRange, 2), "%)", sep = "")), cex = 1.2)


Thanks for all your help in advance!

 - Conal


Conal Monaghan

unread,
Mar 10, 2016, 5:15:56 AM3/10/16
to mirt-package
Hi Phil, 
    Thankyou for plot code! it was exactly what I was looking for I was unaware that the facet argument was logical.


 Regards,
         Conal
Reply all
Reply to author
Forward
0 new messages