第 9 章 測驗等化之二:實作篇

在本節課中,我們將學習
- 進行測驗等化時實務上的考量
- 檢查不同測驗中題目的不變性(item invariance)
- 撰寫使用者定義的R函數程式 (user-defined function)

9.1 理論與實務的差別

理論上,等化的概念很簡單:它只需要兩個測驗之間存在一些相同的東西,是共同的題目或共同的作答者都可以。然後我們需要將兩個測驗對齊(align),雖然有不同的方法將兩個測驗置於同一個量尺上,這些方法應該都產生相同結果.不過,所收集的資料必須與用來描述它的數學模型相適配。

然而在實務上,資料很少會與模型相適配。當要進行測驗等化時,一個重要的假設是兩個測驗的共同題是 “不變(invariant” 的,換句話說,將同一道題目置於測驗一與測驗二之中其難度應該都相同,如果某一題的難度在這兩個測驗中會有不相同,則該題在兩個測驗中應基本上視為是不同題目,也因此不能用來作等化之用。

當將某一題置於兩個不同測驗中,有很多原因可以導致其難度有所不同,以下我們討論兩個特殊的因素,分別為題目位置效應(item position effect)以及題目差異功能(differential item functioning)。

9.2 題目位置效應

很多研究發現,將某一題放在測驗不同的位置,會影響到該題難度的估計值,如果該題是放在一個測驗的前端,會顯為比放在測驗的後端容易一些,我們將此現象稱之為疲倦效應(fatigue effect)。我們在PISA的測驗中就有觀察到這樣的效應,例如在2003年的PISA測驗中,題目是採取在不同題本中交替出現在不同位置(rotated test booklet design) 的方式來排列,每一個題本分為四個部分,每一道題目分別在四個題本中出現,而且分別在四個部分各出現一次。施測時,這些題本會隨機分配給學生作答,每一位學生只作答一個題本,在這樣的安排之下,我們可以假設作答任何一個題本的學生,他們的平均能力可以視為是相同的。

以下是2003年PISA測驗的五道數學題,以及將這些題目放置在四個部分所觀察到的答對率。

表 9.1: 依題目位置的答對率
RoomView Bricks Walking CubePainting GrowingUp
第一部分 72.9 43.9 38.1 61.6 65.2
第二部分 75.6 41.1 37.1 60.6 62.8
第三部分 70.8 35.8 33.1 59.9 60.2
第四部分 67.2 30.1 30.2 49.3 50.4

當你小心觀察表9.1的每一欄,你會發現每一題的答對率從第一部分到第四部份依序減少,而且放在題本末端(即在第四部份) 的題目答對率是最低的,我們也可以從圖 9.1 觀察到同樣的趨勢。

五個題目在測驗的四個部分之答對率

图 9.1: 五個題目在測驗的四個部分之答對率

題目位置效應的意涵是指,假設一道題目是放在第一個測驗的最前端,但在另一個測驗卻放在最後端,則這道題目不應被視為是同一道題目,因為它在兩個測驗中的題目難度並不同,即使題目的文字敘述都沒有改變,也因此題目位置效應的存在會威脅到題目等化的分析。

9.3 題目差異功能

當我們控制了兩組學生的能力為相同,但他們答對某一題的機率卻不相同,我們稱該題出現了題目差異功能(differential item functioning, 通常簡稱為DIF)。例如,在某一份數學測驗中,即使男生與女生的平均能力皆相同,但我們卻發現女生在 數量 題目的表現優於男生,而男生在 空間 題目的表現卻優於女生。因此,如果我們用許多空間題作為連結兩個題本的共同題,則等化的結果可能就會被扭曲了。會出現題目差異功能的原因,可能是因為地理位置、性別、社經地位SES、教材以及其他因素的不同而產生。

9.4 減少違背題目不變性的因素

有幾種方法可以應付因為違背了模型的要求而造成題本等化誤差的威脅:
- 採用大量的共同題。
- 確認題目不變性是否成立,並移除那些不符合不變性的共同題。
- 採用平衡且輪替的題本設計(balanced rotated test design)來安排測驗題目的位置。

至於等化的共同題題數,這很難給出一個明確數目。依照我們的經驗,我們認為起碼需要超過30題共同題來進行題本等化。

9.5 確認題目具不變性

以下介紹一個可以確認題目是否具有不變性的流程。

9.5.1 分開對每個測驗進行校準

利用我們在8.6那一節所提到的資料集N1.csvN2.csvN1N2Specs.docx 的檔案,我們將分別對每個測驗進行校準,並估算出每個測驗所有題目的參數。

rm(list=ls())

# 下列兩個指令,確認你改變到你資料集所在的檔案夾。

N1 <- read.csv("C:\\G_MWU\\ARC\\PhilippinesFiles\\N1.csv",
               stringsAsFactors = FALSE, colClasses = rep("character", 50))
N2 <- read.csv("C:\\G_MWU\\ARC\\PhilippinesFiles\\N2.csv",
               stringsAsFactors = FALSE, colClasses = rep("character", 50))

key1 <- "32213211431123114141111143411111211312111111323121"
key2 <- "11143411111211312111111323121414324231413131111242"

key1 <- unlist(strsplit(key1,""))
key2 <- unlist(strsplit(key2,""))

library(CTT)

# 運用 CTT 評分功能來對原始作答資料進行評分
s1 <- score(N1,key1,output.scored = TRUE)
s2 <- score(N2,key2,output.scored = TRUE)

resp1 <- s1$scored
resp2 <- s2$scored

library(TAM)
mod1 <- tam.jml(resp1)
mod2 <- tam.jml(resp2)

# 檢查題目作答的統計資料
tctt1 <- tam.ctt(resp1,mod1$WLE)
tctt2 <- tam.ctt(resp2,mod1$WLE)

找出兩個測驗的共同題。

# 找出 N1 和 N2 中的共同題
common1 <- mod1$item1$xsi.label %in% mod2$item1$xsi.label
link1 <- mod1$item1[common1, ]
common2 <- match(link1$xsi.label,mod2$item1$xsi.label)
link2 <- mod2$item1[common2, ]

請注意,變數 link1link2 都只包含共同題。我們可藉由繪製兩個測驗題目參數的分布圖來觀察它們之間一致性的程度。

繪製測驗1與測驗2共同題參數的圖

图 9.2: 繪製測驗1與測驗2共同題參數的圖

我們觀察到NQ21_1這一道題目(第一個連結題目,即在圖中左下角的題目) ,它顯然是一個極端值(outlier),它是這組題目中最容易的題目,相對而言,其標準誤的值會比較大,因此我們從共同題中移除該題。

link1 <- link1[-1,]  #移除第一個連結題目
link2 <- link2[-1,]  #移除第一個連結題目

我們從圖9.2中可以發現,雖然兩組題目的參數大致上呈現一個正向的線性相關,但這兩個測驗的量尺並不相同。測驗1的共同題參數(排除第一個連結題目) 的範圍是從-2.21 到 0.93,而測驗2參數的範圍則是從-3.21 到 -0.42。

因此我們需要估算出測驗2參數的平移值(shift)為何,以使得兩組參數的平均值能夠彼此對齊到相同的值。

# 調整測驗2共同題參數平均值以等於測驗1共同題參數平均值
xsi1 <- link1$xsi
xsi2 <- link2$xsi
shift <-  mean(xsi1) - mean(xsi2)
xsi2.adj <- xsi2 + shift

該平移值為1.0216。

接下來我們要將測驗1與測驗2共同題的參數放在單一組資料內,並將每一道共同題兩個參數的差之絕對值按其大小作排序。

# 計算兩個測驗每道共同題的參數值的差
diff <- xsi1 - xsi2.adj
linkset <- data.frame(xsi1, xsi2, xsi2.adj, diff, link1$se.xsi, link2$se.xsi)
colnames(linkset) <- c("xsi1","xsi2","xsi2.adj","diff", "se1", "se2")
rownames(linkset) <- link1$xsi.label
linkset <- linkset[order(abs(diff)),]
library(knitr)
#Note the Unicode for Chinese characters in Caption below: 測驗1與測驗2試題參數值的差
kable(linkset,digits = 3,align="ccccc", 
      caption="\u6e2c\u9a57\u0031\u8207\u6e2c\u9a57\u0032\u8a66\u984c\u53c3\u6578\u503c\u7684\u5dee") 
表 9.2: 測驗1與測驗2試題參數值的差
xsi1 xsi2 xsi2.adj diff se1 se2
NQ31 -1.142 -2.174 -1.152 0.011 0.078 0.078
NQ21_3 -0.416 -1.460 -0.438 0.022 0.073 0.066
NQ36_2 -2.214 -3.206 -2.184 -0.030 0.098 0.112
NQ32_1 0.551 -0.430 0.592 -0.041 0.074 0.057
NQ36_3 -0.488 -1.460 -0.438 -0.050 0.073 0.066
NQ33 -0.059 -0.932 0.089 -0.148 0.072 0.060
NQ24 -0.395 -1.568 -0.546 0.151 0.072 0.067
NQ22_2 -0.785 -1.959 -0.937 0.152 0.074 0.074
NQ29 0.242 -0.946 0.075 0.167 0.072 0.060
NQ37 0.022 -0.814 0.207 -0.185 0.072 0.059
NQ23_1 -0.856 -2.086 -1.064 0.208 0.075 0.076
NQ26_1 -1.025 -2.267 -1.245 0.220 0.077 0.081
NQ25_2 -1.527 -2.305 -1.284 -0.243 0.083 0.081
NQ38 -0.069 -0.807 0.214 -0.283 0.072 0.059
NQ23_2 0.206 -0.497 0.525 -0.319 0.072 0.057
NQ25_3 -1.054 -2.413 -1.391 0.338 0.077 0.084
NQ22_1 -1.541 -2.922 -1.900 0.359 0.083 0.100
NQ30 -0.796 -1.456 -0.434 -0.362 0.075 0.066
NQ21_2 -2.158 -2.817 -1.796 -0.362 0.097 0.097
NQ36_1 -1.130 -2.582 -1.560 0.430 0.078 0.089
NQ32_2 -1.454 -2.922 -1.900 0.446 0.082 0.100
NQ34 -0.929 -1.464 -0.443 -0.486 0.076 0.066
NQ26_2 -0.946 -2.470 -1.448 0.503 0.076 0.086
NQ27 0.073 -0.417 0.605 -0.532 0.072 0.057
NQ28 -1.124 -1.559 -0.537 -0.587 0.078 0.067
NQ35 0.930 -0.777 0.245 0.685 0.077 0.059
NQ39 0.742 -0.989 0.033 0.709 0.075 0.060
NQ25_1 -1.447 -1.695 -0.673 -0.774 0.082 0.069

在表9.2中可以看出有若干道共同題,它們在測驗1與測驗2的題目難度參數值有很大的差異,例如 題目 NQ25_1題目 NQ39 兩題,它們的差值都大於 0.7 logit,這一組題目很明顯不適合在題本等化中擔當共同題的角色。

以下我們介紹如何透過視覺的觀察,可以更了解難度參數的差異,我們可以參考 Rating Scale Analysis (Wright and Masters 1982) 書中第115-116頁的公式來計算出題目參數的信賴帶(confidence band)。

首先,我們需要計算出每一道共同題在兩個測驗中參數的平均值,例如 \(d.=(xsi_1 + xsi.adj_2)/2\) 。接著我們透過以下式子 \(s=\frac{1}{2}sqrt(s_1^2+s_2^2)\) 計算該平均值的標準誤,其中 \(s_1\)\(s_2\) 為這兩個題目分別在其題本中的參數標準誤。再接下來,我們要計算出 \(p_1=d.-2\times s\)\(p_2=d.+2\times s\) 作為95%信賴帶的上、下限。當要為所有題目做分布圖時,我們將所有形如\((p_2, p_1)\) 的點作為信賴帶的下限,而以所有形如 \((p_1, p_2)\) 的點作為信賴帶的上限。我們可以用以下的R 程式碼來執行上述程序,其中我們要建立一個 R 的函數來繪畫出所需要的信賴帶。

plotLinkset <- function(linkset){
  d <- (linkset$xsi1 + linkset$xsi2.adj)/2
  s <- (1/2)*sqrt(linkset$se1^2 + linkset$se2^2)
  p1 <- d - 2*s
  p2 <- d + 2*s

  plot(linkset$xsi1, linkset$xsi2.adj)
  lines(p1[order(p1)],p2[order(p1)])
  lines(p2[order(p1)],p1[order(p1)])
  text(linkset$xsi1,linkset$xsi2.adj,labels=rownames(linkset),cex=0.4,pos=3)
}
  plotLinkset(linkset)
比較兩組題目參數

图 9.3: 比較兩組題目參數

從圖 9.3 與表 9.2 可以得知,我們可能需要從目前的共同題中刪除某些題目,因為該等題目在不同的題本中並沒有呈現出不變性。但需要留意的是,要移除哪些題目並沒有精準的科學法則,也沒有什麼標準的程序可以做為依據,基本上是要透過一個錯誤嘗試法(trial-and-error)來進行推敲,可能比較好的方式是由幾位研究者獨立篩選不適合的共同題,然後再彼此討論以達到共識。

當我們挑選要刪除哪些共同題時,我們需要謹記以下的事項:

  • 共同題的題數越多,等化的過程越可信。當然,我們也可以只選擇兩題共同題,此時,這兩道題目在上述的圖中會落在同一條線上而不會出現任何的極端值。但問題在於任意選擇兩道共同題,其等化效果的差異將會非常的大,我們也不知道哪兩道題目其等化效果來得最好。整體而言,如果我們有很多共同題,即使有極端值,其影響會相對來得小.

  • 當我們移除某些共同題之後,剩下題目參數的平均值將會改變,因此某一道先前被視為是極端值的題目,現在有可能落在信賴帶內。一般而言,共同題被移除的先後次序,可能會影響我們判斷哪些題目是極端值。舉例來說,如果我們刪除 NQ25_1NQ28NQ34NQ30 這四道共同題,我們將會需要重新撰寫一個函數來重算平移的值,並調整測驗2剩下的題目的參數值。

rePlotLink <- function(remItems, linkset){
  linkset2 <- linkset[!rownames(linkset) %in% remItems, ]
  shift <-  mean(linkset2$xsi1) - mean(linkset2$xsi2)
  xsi2.adj <- linkset2$xsi2 + shift
  diff <- linkset2$xsi1 - xsi2.adj
  linkset2$xsi2.adj <- xsi2.adj
  linkset2$diff <- diff
  plotLinkset(linkset2)
  return(list(Linkset=linkset2, shift=shift))
}
remItems <- c("NQ25_1","NQ28","NQ34","NQ30")
newLink <- rePlotLink(remItems, linkset)

#Note the Unicode for Chinese characters in Caption below: 測驗1與測驗2試題參數的差異
kable(newLink$Linkset,digits = 3,align="ccccc", 
      caption=" \u6e2c\u9a57\u0031\u8207\u6e2c\u9a57\u0032\u8a66\u984c\u53c3\u6578\u7684\u5dee\u7570")
表 9.3: 測驗1與測驗2試題參數的差異
xsi1 xsi2 xsi2.adj diff se1 se2
NQ31 -1.142 -2.174 -1.060 -0.081 0.078 0.078
NQ21_3 -0.416 -1.460 -0.346 -0.070 0.073 0.066
NQ36_2 -2.214 -3.206 -2.092 -0.122 0.098 0.112
NQ32_1 0.551 -0.430 0.684 -0.133 0.074 0.057
NQ36_3 -0.488 -1.460 -0.346 -0.142 0.073 0.066
NQ33 -0.059 -0.932 0.181 -0.240 0.072 0.060
NQ24 -0.395 -1.568 -0.454 0.059 0.072 0.067
NQ22_2 -0.785 -1.959 -0.845 0.060 0.074 0.074
NQ29 0.242 -0.946 0.167 0.075 0.072 0.060
NQ37 0.022 -0.814 0.299 -0.277 0.072 0.059
NQ23_1 -0.856 -2.086 -0.972 0.116 0.075 0.076
NQ26_1 -1.025 -2.267 -1.153 0.128 0.077 0.081
NQ25_2 -1.527 -2.305 -1.192 -0.335 0.083 0.081
NQ38 -0.069 -0.807 0.306 -0.375 0.072 0.059
NQ23_2 0.206 -0.497 0.617 -0.411 0.072 0.057
NQ25_3 -1.054 -2.413 -1.299 0.245 0.077 0.084
NQ22_1 -1.541 -2.922 -1.808 0.267 0.083 0.100
NQ21_2 -2.158 -2.817 -1.704 -0.454 0.097 0.097
NQ36_1 -1.130 -2.582 -1.468 0.338 0.078 0.089
NQ32_2 -1.454 -2.922 -1.808 0.354 0.082 0.100
NQ26_2 -0.946 -2.470 -1.356 0.411 0.076 0.086
NQ27 0.073 -0.417 0.697 -0.624 0.072 0.057
NQ35 0.930 -0.777 0.337 0.593 0.077 0.059
NQ39 0.742 -0.989 0.125 0.617 0.075 0.060

新的平移常數值為 1.1136 。

9.6 等化平移的誤差

下列程式碼將繪製兩個圖形,以反映在等化題目參數時,有可能會出現的兩種不同對齊情形。
評估測驗等化的誤差評估測驗等化的誤差

图 9.4: 評估測驗等化的誤差

如果兩個測驗共同題的參數值非常接近,如圖 (9.4) 中的左圖所示,則無論我們從這些共同題中抽取哪一部分題目作為等化之用,利用它們所算出來的等化平移值應該都會非常接近。比較之下,如果兩個測驗共同題的參數值差異比較大,如圖(9.4)中的右圖所示,當我們從這些共同題中隨機抽取幾個組別的題目做為等化之用,則它們所分別估計出來的等化平移值差異可能很大;等化誤差的大小是與兩個測驗共同題參數差異的大小有關。理論上有好幾種不同的方法可以用來估算等化誤差,在本課中,我們會以 ” diff (差)” 這個變數的標準誤(standard error)視為是等化誤差。在我們的例子中,如果我們以表 9.2 中的題目作為共同題,表中” diff(差)“那一行所有數據的標準誤為0.0732。

該等化誤差反映出當我們將新測驗等化到舊測驗的量尺上時,其可信程度為何,而等化誤差值為 0.0732 是指平移值的範圍是在1.0216 ± 0.1464 (即95%信賴區間)之間。為了要方便詮釋該值的大小,我們提供一個大概的詮釋方式,若是在小學階段的話,0.5個logit約對應於一個學年的進步程度。

9.7 定錨法

由於在定錨法中,所有共同題的參數都已經被設定了明確的數據,因此定錨法比平移法較為受約束性。可是在某些情況下,我們會想固定共同題的參數值,例如有些題目先前已經進行過校準,在後續使用時我們想要維持先前校準的參數值,此時採用定錨法會比較適合。

若要採用定錨法,先要建立一個兩行的矩陣(行指垂直的方向),其中第一行記錄題號,第二行則記錄用作定錨的值。下列 R 程式碼會將表 9.2 中測驗2共同題的值設定為等於測驗1共同題的值。

CP2 <- which(mod2$item1$xsi.label %in% rownames(linkset))
CP1 <- match(mod2$item1$xsi.label[CP2],mod1$item1$xsi.label)
fix <- cbind(CP2, mod1$xsi[CP1])
mod2_a <- tam.jml(resp2,xsi.fixed = fix)

9.8 回家作業

請用第 8.7 節的 test1.csvtest2.csv 兩個資料檔來進行本回家作業,這兩個檔案包含共同題,你可以從檔案中擁有相同名稱來判斷哪些題目是共同題。這兩個檔案皆已對作答反應進行評分,請分別對兩個檔案進行 IRT 的校準,並產生一個表格,當中需要包括經個別校準後的題目參數,以及測驗2調整後的參數值,使得測驗2共同題參數的平均值等於測驗1共同題參數的平均值,另外還要包含題目參數的標準誤。此外,請繪製測驗1共同題與調整過後測驗2的題目參數,並加上它的信賴帶。

References

Wright, Benjamin, and Geofferey Masters. 1982. Rating Scale Analysis. Book. Mesa Press Chicago.