Itempool Objects

Emre Gönülateş

2024-02-20

library(irt)

An Itempool object is a collection of Item and Testlet objects. It contains information of all items in a test or all items that will be used in an item pool of an adaptive test.

Creating an Itempool Object

Dichotomous Items (Rasch, 1PL, 2PL, 3PL, 4PL)

There are multiple ways to create an Itempool object. If all of the items are from the same psychometric model, then using a data.frame object to create an Itempool object is the most straightforward way.

# Create an item pool of 2PL items:
ip_dtf <- data.frame(
  a = c(1.1821, 0.6645, 0.8994, 1.0731, 1.0252, 1.2325, 0.9278, 1.0967), 
  b = c(0.4185, -0.5992, 0.2193, 0.8823, 0.4652, 1.4006, -1.1193, -0.3747))

ip <- itempool(ip_dtf, model = "2PL")
ip
#> An object of class 'Itempool'.
#> Model of items: 2PL
#> D = 1
#> 
#>   item_id     a      b
#>   <chr>   <dbl>  <dbl>
#> 1 Item_1  1.18   0.418
#> 2 Item_2  0.664 -0.599
#> 3 Item_3  0.899  0.219
#> 4 Item_4  1.07   0.882
#> 5 Item_5  1.03   0.465
#> 6 Item_6  1.23   1.40 
#> 7 Item_7  0.928 -1.12 
#> 8 Item_8  1.10  -0.375

If desired, item_id’s and content areas of each item can be specified:

ip_dtf <- data.frame( 
  a = c(1.1821, 0.6645, 0.8994, 1.0731, 1.0252, 1.2325, 0.9278, 1.0967), 
  b = c(0.4185, -0.5992, 0.2193, 0.8823, 0.4652, 1.4006, -1.1193, -0.3747),
  item_id = c("i1", "i2", "i3", "i4", "i5", "i6", "i7", "i8"), 
  content = c("Geometry", "Geometry", "Algebra", "Algebra", "Algebra", 
              "Geometry", "Algebra", "Algebra")
  )

ip <- itempool(ip_dtf, model = "2PL")
ip
#> An object of class 'Itempool'.
#> Model of items: 2PL
#> D = 1
#> 
#>   item_id     a      b content 
#>   <chr>   <dbl>  <dbl> <chr>   
#> 1 i1      1.18   0.418 Geometry
#> 2 i2      0.664 -0.599 Geometry
#> 3 i3      0.899  0.219 Algebra 
#> 4 i4      1.07   0.882 Algebra 
#> 5 i5      1.03   0.465 Algebra 
#> 6 i6      1.23   1.40  Geometry
#> 7 i7      0.928 -1.12  Algebra 
#> 8 i8      1.10  -0.375 Algebra

By default, the scaling parameter D for most of the models are set to 1. This can be overwritten:

ip <- itempool(ip_dtf, model = "2PL", D = 1.7)
ip
#> An object of class 'Itempool'.
#> Model of items: 2PL
#> D = 1.7
#> 
#>   item_id     a      b content 
#>   <chr>   <dbl>  <dbl> <chr>   
#> 1 i1      1.18   0.418 Geometry
#> 2 i2      0.664 -0.599 Geometry
#> 3 i3      0.899  0.219 Algebra 
#> 4 i4      1.07   0.882 Algebra 
#> 5 i5      1.03   0.465 Algebra 
#> 6 i6      1.23   1.40  Geometry
#> 7 i7      0.928 -1.12  Algebra 
#> 8 i8      1.10  -0.375 Algebra

Please review psychometric models for other models and required parameters. For example, for 3PL model:

ip_dtf <- data.frame(a = c(0.9303, 1.9423, 0.8417, 1.2622), 
                     b = c(1.3515, -0.5039, -1.7263, 1.3125), 
                     c = c(0.2301, 0.2224, 0.0967, 0.0112))
ip <- itempool(ip_dtf, model = "3PL", D = 1.7)
ip
#> An object of class 'Itempool'.
#> Model of items: 3PL
#> D = 1.7
#> 
#>   item_id     a      b      c
#>   <chr>   <dbl>  <dbl>  <dbl>
#> 1 Item_1  0.930  1.35  0.230 
#> 2 Item_2  1.94  -0.504 0.222 
#> 3 Item_3  0.842 -1.73  0.0967
#> 4 Item_4  1.26   1.31  0.0112

Polytomous Items (GRM, GPCM, PCM)

For polytomous items, usually a vector of item thresholds should be specified. So, threshold (or step) parameters can given as the following example:

ip_dtf <- data.frame(a = c(1.8619, 1.2458, 1.3213, 0.6174, 1.3625), 
                     b1 = c(-0.3666, -0.9717, -1.1588, 0.1093, 0.0858), 
                     b2 = c(0.3178, 0.2458, -0.4978, 0.6437, 0.5161), 
                     b3 = c(1.0384, 1.2382, 1.2787, 1.3609, 1.2145))

ip <- itempool(ip_dtf, model = "GPCM")
ip
#> An object of class 'Itempool'.
#> Model of items: GPCM
#> D = 1
#> 
#>   item_id     a      b1     b2    b3
#>   <chr>   <dbl>   <dbl>  <dbl> <dbl>
#> 1 Item_1  1.86  -0.367   0.318  1.04
#> 2 Item_2  1.25  -0.972   0.246  1.24
#> 3 Item_3  1.32  -1.16   -0.498  1.28
#> 4 Item_4  0.617  0.109   0.644  1.36
#> 5 Item_5  1.36   0.0858  0.516  1.21

The number of threshold parameters can be differ among items. In those cases, simply fill the rest of the values using NA:

ip_dtf <- data.frame(a = c(1.175, 0.981, 1.0625, 0.9545, 0.7763), 
                     b1 = c(-0.9633, -0.4098, -0.298, 0.0576, -0.5342), 
                     b2 = c(-0.6213, NA, 0.4792, 0.538, 0.0363), 
                     b3 = c(0.5938, NA, NA, 0.9815, NA), 
                     b4 = c(NA, NA, NA, 1.3351, NA))
ip <- itempool(ip_dtf, model = "GRM", D = 1.702)
ip
#> An object of class 'Itempool'.
#> Model of items: GRM
#> D = 1.702
#> 
#>   item_id     a      b1      b2     b3    b4
#>   <chr>   <dbl>   <dbl>   <dbl>  <dbl> <dbl>
#> 1 Item_1  1.18  -0.963  -0.621   0.594 NA   
#> 2 Item_2  0.981 -0.410  NA      NA     NA   
#> 3 Item_3  1.06  -0.298   0.479  NA     NA   
#> 4 Item_4  0.954  0.0576  0.538   0.982  1.34
#> 5 Item_5  0.776 -0.534   0.0363 NA     NA

An example reparameterized “GPCM” item pool (see psychometric models vignette for details of this model):

ip_dtf <- data.frame(a = c(1.1152, 0.8231, 0.9527, 0.6423), 
                     b = c(0.234, 0.0219,  0.7424, -0.3426), 
                     d1 = c(0.0081, 0.8569, -1.5181, -0.8458), 
                     d2 = c(0.3392, NA, -0.1978, 0.3756), 
                     d3 = c(NA, NA, 0.1677, NA))
ip <- itempool(ip_dtf, model = "GPCM2", D = 1.702)
ip
#> An object of class 'Itempool'.
#> Model of items: GPCM2
#> D = 1.702
#> 
#>   item_id     a       b      d1     d2     d3
#>   <chr>   <dbl>   <dbl>   <dbl>  <dbl>  <dbl>
#> 1 Item_1  1.12   0.234   0.0081  0.339 NA    
#> 2 Item_2  0.823  0.0219  0.857  NA     NA    
#> 3 Item_3  0.953  0.742  -1.52   -0.198  0.168
#> 4 Item_4  0.642 -0.343  -0.846   0.376 NA

Mixture of Models

If an Itempool object should consist of mixture of items, then the item parameter of each item should be specified as the examples above. But, model should be specified for each item in the data.frame.

For example, the following item pool consists of three 3PL items and two GPCM items:

ip_dtf <- data.frame(
  model = c("3PL", "3PL", "3PL", "GPCM", "GPCM"), 
  a = c(1.6242, 0.9471, 1.4643, 0.6582, 1.0234), 
  b = c(0.4563, -0.2994, -0.3027, NA, NA), 
  c = c(0.0156, 0.0339, 0.1243, NA, NA), 
  b1 = c(NA, NA, NA, -1.1532, -1.2171), 
  b2 = c(NA, NA, NA, -0.5384, -0.3992), 
  b3 = c(NA, NA, NA, 0.0591, 0.1431), 
  b4 = c(NA, NA, NA, NA, 1.52), 
  D = c(1.7, 1.7, 1.7, 1, 1))
ip <- itempool(ip_dtf)
ip
#> An object of class 'Itempool'.
#> 
#>   item_id model     a      b       c    b1     b2      b3    b4     D
#>   <chr>   <chr> <dbl>  <dbl>   <dbl> <dbl>  <dbl>   <dbl> <dbl> <dbl>
#> 1 Item_1  3PL   1.62   0.456  0.0156 NA    NA     NA      NA      1.7
#> 2 Item_2  3PL   0.947 -0.299  0.0339 NA    NA     NA      NA      1.7
#> 3 Item_3  3PL   1.46  -0.303  0.124  NA    NA     NA      NA      1.7
#> 4 Item_4  GPCM  0.658 NA     NA      -1.15 -0.538  0.0591 NA      1  
#> 5 Item_5  GPCM  1.02  NA     NA      -1.22 -0.399  0.143   1.52   1

Other Ways to Create Itempool Objects

An Itempool object can be created using individual Item and Testlet objects. For example, in the the following code, individual Item objects are combined to create an Itempool object.

ip <- c(item(model = "3PL", a = 2.09, b = 1.17, c = 0.25, item_id = "i1"), 
        item(model = "3PL", a = 0.59, b = 0.77, c = 0.13, item_id = "i2"), 
        item(model = "3PL", a = 1.67, b = 1.05, c = 0.04, item_id = "i3"), 
        item(model = "3PL", a = 0.84, b = -1.8, c = 0.24, item_id = "i4"), 
        item(model = "GPCM", a = 1.96, b = c(-0.94, -0.09, 0.25), item_id = "i5"), 
        item(model = "GPCM", a = 0.59, b = c(0.07, 1.46), item_id = "i6"), 
        item(model = "GPCM", a = 0.73, b = c(-1.2, -0.78, 0.2, 1.8), item_id = "i7"))
ip
#> An object of class 'Itempool'.
#> D = 1
#> 
#>   item_id model     a     b     c    b1    b2    b3    b4
#>   <chr>   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 i1      3PL    2.09  1.17  0.25 NA    NA    NA     NA  
#> 2 i2      3PL    0.59  0.77  0.13 NA    NA    NA     NA  
#> 3 i3      3PL    1.67  1.05  0.04 NA    NA    NA     NA  
#> 4 i4      3PL    0.84 -1.8   0.24 NA    NA    NA     NA  
#> 5 i5      GPCM   1.96 NA    NA    -0.94 -0.09  0.25  NA  
#> 6 i6      GPCM   0.59 NA    NA     0.07  1.46 NA     NA  
#> 7 i7      GPCM   0.73 NA    NA    -1.2  -0.78  0.2    1.8

Using this method, Testlet objects can be added to the item pool.

# Create a testlet object with three items. 
t1 <- testlet(c(item(model = "3PL", a = 2.09, b = 1.17, c = 0.25, item_id = "i1"), 
                item(model = "3PL", a = 0.59, b = 0.77, c = 0.13, item_id = "i2"), 
                item(model = "3PL", a = 1.67, b = 1.05, c = 0.04, item_id = "i3")), 
              testlet_id = "Testlet-932")
# Create another testlet object with two items. 
t2 <- testlet(c(item(model = "3PL", a = 0.84, b = -1.8, c = 0.24, item_id = "i4"), 
                item(model = "GPCM", a = 1.96, b = c(-0.94, -0.09, 0.25), 
                     item_id = "i5")), 
              testlet_id = "Testlet-77")
# Standalone items to be added:
i6 <- item(model = "GPCM", a = 0.59, b = c(0.07, 1.46), item_id = "i6")
i7 <- item(model = "GPCM", a = 0.73, b = c(-1.2, -0.78, 0.2, 1.8), item_id = "i7")

# Combine all items and testlets:
ip_testlet <- c(t1, t2, i6, i7)
ip_testlet
#> An object of class 'Itempool'.
#> D = 1
#> 
#>   item_id testlet_id  model     a     b     c    b1    b2    b3    b4
#>   <chr>   <chr>       <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 i1      Testlet-932 3PL    2.09  1.17  0.25 NA    NA    NA     NA  
#> 2 i2      Testlet-932 3PL    0.59  0.77  0.13 NA    NA    NA     NA  
#> 3 i3      Testlet-932 3PL    1.67  1.05  0.04 NA    NA    NA     NA  
#> 4 i4      Testlet-77  3PL    0.84 -1.8   0.24 NA    NA    NA     NA  
#> 5 i5      Testlet-77  GPCM   1.96 NA    NA    -0.94 -0.09  0.25  NA  
#> 6 i6      <NA>        GPCM   0.59 NA    NA     0.07  1.46 NA     NA  
#> 7 i7      <NA>        GPCM   0.73 NA    NA    -1.2  -0.78  0.2    1.8

Operations with Itempool Objects

We will show the operations that can be performed on an Itempool object using the following three example item pools:

ip1 <- itempool(data.frame( 
  a = c(1.1821, 0.6645, 0.8994, 1.0731, 1.0252, 1.2325, 0.9278, 1.0967), 
  b = c(0.4185, -0.5992, 0.2193, 0.8823, 0.4652, 1.4006, -1.1193, -0.3747),
  item_id = c("i1", "i2", "i3", "i4", "i5", "i6", "i7", "i8"), 
  content = c("Geometry", "Geometry", "Algebra", "Algebra", "Algebra", 
              "Geometry", "Algebra", "Algebra")
  ))
  
ip_mixed <- itempool(data.frame(
  model = c("3PL", "3PL", "3PL", "GPCM", "GPCM"), 
  a = c(1.6242, 0.9471, 1.4643, 0.6582, 1.0234), 
  b = c(0.4563, -0.2994, -0.3027, NA, NA), 
  c = c(0.0156, 0.0339, 0.1243, NA, NA), 
  b1 = c(NA, NA, NA, -1.1532, -1.2171), 
  b2 = c(NA, NA, NA, -0.5384, -0.3992), 
  b3 = c(NA, NA, NA, 0.0591, 0.1431), 
  b4 = c(NA, NA, NA, NA, 1.52), 
  D = c(1.7, 1.7, 1.7, 1.7, 1.7)))

ip_testlet <- c(
  testlet(c(item(model = "3PL", a = 2.09, b = 1.17, c = 0.25, item_id = "i1"), 
            item(model = "3PL", a = 0.59, b = 0.77, c = 0.13, item_id = "i2"), 
            item(model = "3PL", a = 1.67, b = 1.05, c = 0.04, item_id = "i3")), 
          testlet_id = "Testlet-932"), 
  item(model = "GPCM", a = 0.59, b = c(0.07, 1.46), item_id = "i6"),
  testlet(c(item(model = "3PL", a = 0.84, b = -1.8, c = 0.24, item_id = "i4"), 
            item(model = "GPCM", a = 1.96, b = c(-0.94, -0.09, 0.25), 
                 item_id = "i5")), 
          testlet_id = "Testlet-77"), 
  item(model = "GPCM", a = 0.73, b = c(-1.2, -0.78, 0.2, 1.8), item_id = "i7"))

Combining Item Pools

Two Itempool objects can be combined using c() function.

ip <- c(ip1, ip_mixed)
ip
#> An object of class 'Itempool'.
#> 
#>    item_id model     a      b       c    b1     b2      b3    b4     D content 
#>    <chr>   <chr> <dbl>  <dbl>   <dbl> <dbl>  <dbl>   <dbl> <dbl> <dbl> <chr>   
#>  1 i1      2PL   1.18   0.418 NA      NA    NA     NA      NA      1   Geometry
#>  2 i2      2PL   0.664 -0.599 NA      NA    NA     NA      NA      1   Geometry
#>  3 i3      2PL   0.899  0.219 NA      NA    NA     NA      NA      1   Algebra 
#>  4 i4      2PL   1.07   0.882 NA      NA    NA     NA      NA      1   Algebra 
#>  5 i5      2PL   1.03   0.465 NA      NA    NA     NA      NA      1   Algebra 
#>  6 i6      2PL   1.23   1.40  NA      NA    NA     NA      NA      1   Geometry
#>  7 i7      2PL   0.928 -1.12  NA      NA    NA     NA      NA      1   Algebra 
#>  8 i8      2PL   1.10  -0.375 NA      NA    NA     NA      NA      1   Algebra 
#>  9 Item_1  3PL   1.62   0.456  0.0156 NA    NA     NA      NA      1.7 <NA>    
#> 10 Item_2  3PL   0.947 -0.299  0.0339 NA    NA     NA      NA      1.7 <NA>    
#> 11 Item_3  3PL   1.46  -0.303  0.124  NA    NA     NA      NA      1.7 <NA>    
#> 12 Item_4  GPCM  0.658 NA     NA      -1.15 -0.538  0.0591 NA      1.7 <NA>    
#> 13 Item_5  GPCM  1.02  NA     NA      -1.22 -0.399  0.143   1.52   1.7 <NA>

Subsetting

Itempool objects can be subsetted using brackets [ ]. This operation will always return an Itempool object.

# Subset only the first element of the item pool
ip1[1]
#> An object of class 'Itempool'.
#> Model of items: 2PL
#> D = 1
#> Content = Geometry
#> 
#>   item_id     a     b
#>   <chr>   <dbl> <dbl>
#> 1 i1       1.18 0.418

# Create an Itempool using the first and third element:
ip1[c(1, 3)] # Order is important
#> An object of class 'Itempool'.
#> Model of items: 2PL
#> D = 1
#> 
#>   item_id     a     b content 
#>   <chr>   <dbl> <dbl> <chr>   
#> 1 i1      1.18  0.418 Geometry
#> 2 i3      0.899 0.219 Algebra
ip1[c(3, 1)]
#> An object of class 'Itempool'.
#> Model of items: 2PL
#> D = 1
#> 
#>   item_id     a     b content 
#>   <chr>   <dbl> <dbl> <chr>   
#> 1 i3      0.899 0.219 Algebra 
#> 2 i1      1.18  0.418 Geometry

# Create an Itempool using all but the second element: 
ip1[-2]
#> An object of class 'Itempool'.
#> Model of items: 2PL
#> D = 1
#> 
#>   item_id     a      b content 
#>   <chr>   <dbl>  <dbl> <chr>   
#> 1 i1      1.18   0.418 Geometry
#> 2 i3      0.899  0.219 Algebra 
#> 3 i4      1.07   0.882 Algebra 
#> 4 i5      1.03   0.465 Algebra 
#> 5 i6      1.23   1.40  Geometry
#> 6 i7      0.928 -1.12  Algebra 
#> 7 i8      1.10  -0.375 Algebra

# Subsetting using item ID's:
ip1[c("i2", "i1")]
#> An object of class 'Itempool'.
#> Model of items: 2PL
#> D = 1
#> Content = Geometry
#> 
#>   item_id     a      b
#>   <chr>   <dbl>  <dbl>
#> 1 i2      0.664 -0.599
#> 2 i1      1.18   0.418

# Subsetting using logical operators:
ip1[ip1$b < 0]
#> An object of class 'Itempool'.
#> Model of items: 2PL
#> D = 1
#> 
#>   item_id     a      b content 
#>   <chr>   <dbl>  <dbl> <chr>   
#> 1 i2      0.664 -0.599 Geometry
#> 2 i7      0.928 -1.12  Algebra 
#> 3 i8      1.10  -0.375 Algebra

# Select items with information values larger than 0.2 at theta = 1:
ip1[info(ip1, theta = 1) > 0.2]
#> An object of class 'Itempool'.
#> Model of items: 2PL
#> D = 1
#> 
#>   item_id     a     b content 
#>   <chr>   <dbl> <dbl> <chr>   
#> 1 i1       1.18 0.418 Geometry
#> 2 i4       1.07 0.882 Algebra 
#> 3 i5       1.03 0.465 Algebra 
#> 4 i6       1.23 1.40  Geometry

Extracting Items

An Item object can be extracted from an Itempool using double bracket operator [[ ]]. This operation will return an Item or Testlet object.

# Extract the second element
ip1[[2]]
#> A '2PL' item.
#> Item ID:      i2
#> Model:   2PL (Two-Parameter Logistic Model)
#> Content: Geometry
#> Model Parameters:
#>   a = 0.6645
#>   b = -0.5992
#>   D = 1
#> 
#> --------------------------

# Extract a testlet
ip_testlet[[3]]
#> An object of class 'Testlet'.
#> Testlet ID:      Testlet-77
#> Model:   BTM
#> 
#> Item List:
#> D = 1
#> 
#>   item_id model     a     b     c    b1    b2    b3
#>   <chr>   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 i4      3PL    0.84  -1.8  0.24 NA    NA    NA   
#> 2 i5      GPCM   1.96  NA   NA    -0.94 -0.09  0.25

Replacing Items of an Itempool

Using the double bracket with assignment operator, individual items of an Itempool object can be replaced.

ip_new <- ip1
# Replace the second item with a new item
ip_new[[2]] <- item(a = 1, b = c(-1, 0, 1), model = "GRM", item_id = "NewItm4",
                    D = 1.7, content = "Quadratic Functions")
ip_new
#> An object of class 'Itempool'.
#> 
#>   item_id model     a      b    b1    b2    b3     D content            
#>   <chr>   <chr> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <chr>              
#> 1 i1      2PL   1.18   0.418    NA    NA    NA   1   Geometry           
#> 2 NewItm4 GRM   1     NA        -1     0     1   1.7 Quadratic Functions
#> 3 i3      2PL   0.899  0.219    NA    NA    NA   1   Algebra            
#> 4 i4      2PL   1.07   0.882    NA    NA    NA   1   Algebra            
#> 5 i5      2PL   1.03   0.465    NA    NA    NA   1   Algebra            
#> 6 i6      2PL   1.23   1.40     NA    NA    NA   1   Geometry           
#> 7 i7      2PL   0.928 -1.12     NA    NA    NA   1   Algebra            
#> 8 i8      2PL   1.10  -0.375    NA    NA    NA   1   Algebra

Accessing Parts of an Itempool object

$ operator can be used to access parts of an Itempool object. Here, we will discuss the most common uses of this operator. The full list of available options can be found in the help page:

?`$,Itempool-method`
# Extract the ID's of the items within an item pool
ip1$item_id
#> [1] "i1" "i2" "i3" "i4" "i5" "i6" "i7" "i8"

# Extract the contents of the items within an item pool
ip1$content
#>         i1         i2         i3         i4         i5         i6         i7 
#> "Geometry" "Geometry"  "Algebra"  "Algebra"  "Algebra" "Geometry"  "Algebra" 
#>         i8 
#>  "Algebra"

# Extract the models of the items within an item pool
ip1$model
#>    i1    i2    i3    i4    i5    i6    i7    i8 
#> "2PL" "2PL" "2PL" "2PL" "2PL" "2PL" "2PL" "2PL"
ip_mixed$model
#> Item_1 Item_2 Item_3 Item_4 Item_5 
#>  "3PL"  "3PL"  "3PL" "GPCM" "GPCM"

# Maximum possible score of items
ip1$max_score
#> [1] 8
ip_mixed$max_score
#> [1] 10
ip_testlet$max_score
#> [1] 13

# Maximum scores of each standalone item
ip1$item_max_score
#> i1 i2 i3 i4 i5 i6 i7 i8 
#>  1  1  1  1  1  1  1  1
ip_mixed$item_max_score
#> Item_1 Item_2 Item_3 Item_4 Item_5 
#>      1      1      1      3      4
ip_testlet$item_max_score
#> i1 i2 i3 i6 i4 i5 i7 
#>  1  1  1  2  1  3  4

Item parameters can also be accessed:

ip1$a
#>     i1     i2     i3     i4     i5     i6     i7     i8 
#> 1.1821 0.6645 0.8994 1.0731 1.0252 1.2325 0.9278 1.0967
ip1$b
#>      i1      i2      i3      i4      i5      i6      i7      i8 
#>  0.4185 -0.5992  0.2193  0.8823  0.4652  1.4006 -1.1193 -0.3747
ip1$c
#> NULL
ip1$D
#> i1 i2 i3 i4 i5 i6 i7 i8 
#>  1  1  1  1  1  1  1  1

ip_mixed$a
#> Item_1 Item_2 Item_3 Item_4 Item_5 
#> 1.6242 0.9471 1.4643 0.6582 1.0234
ip_mixed$b
#>  Item_1  Item_2  Item_3  Item_4  Item_5 
#>  0.4563 -0.2994 -0.3027      NA      NA
ip_mixed$b1
#>  Item_1  Item_2  Item_3  Item_4  Item_5 
#>      NA      NA      NA -1.1532 -1.2171
ip_mixed$b4
#> Item_1 Item_2 Item_3 Item_4 Item_5 
#>     NA     NA     NA     NA   1.52
ip_mixed$D
#> Item_1 Item_2 Item_3 Item_4 Item_5 
#>    1.7    1.7    1.7    1.7    1.7

Using the operator $n, we can extract a detailed summary of the number of Items and Testlets in the item pool. This is especially useful if the item pool has both standalone and testlet items.

# Extract the number of items within an item pool
ip1$n
#> $elements
#> [1] 8
#> 
#> $testlets
#> [1] 0
#> 
#> $items
#> [1] 8
# In ip_testlet, there are two testlets and two standalone items. Within those
# two testlets, there are a total of 5 items. At total there are 7 items.
ip_testlet$n
#> $elements
#> [1] 4
#> 
#> $testlets
#> [1] 2
#> 
#> $items
#> [1] 7

Updating Parts of an Itempool object

Using $<- operator, the parts of an item pool can be updated. For example, using the following code, we can change the item_ids and contents of the items of an item pool.

ip_new <- ip1
ip_new$item_id <- paste0("Question-", 1:length(ip_new))
ip_new$content <- c("M", "M", "R", "M", "E", "R", "E", "M")

New item parameters can be set this way as well:

ip_new$a <- 1
ip_new
#> An object of class 'Itempool'.
#> Model of items: 2PL
#> D = 1
#> 
#>   item_id        a      b content
#>   <chr>      <dbl>  <dbl> <chr>  
#> 1 Question-1     1  0.418 M      
#> 2 Question-2     1 -0.599 M      
#> 3 Question-3     1  0.219 R      
#> 4 Question-4     1  0.882 M      
#> 5 Question-5     1  0.465 E      
#> 6 Question-6     1  1.40  R      
#> 7 Question-7     1 -1.12  E      
#> 8 Question-8     1 -0.375 M
ip_new$b <- rnorm(length(ip_new))
ip_new
#> An object of class 'Itempool'.
#> Model of items: 2PL
#> D = 1
#> 
#>   item_id        a       b content
#>   <chr>      <dbl>   <dbl> <chr>  
#> 1 Question-1     1 -0.0917 M      
#> 2 Question-2     1 -1.67   M      
#> 3 Question-3     1 -0.0963 R      
#> 4 Question-4     1  0.691  M      
#> 5 Question-5     1 -0.715  E      
#> 6 Question-6     1  0.512  R      
#> 7 Question-7     1 -0.455  E      
#> 8 Question-8     1  0.416  M