Rによる項目反応理論を実装してみたーー項目特性曲線（2PLM）

<h1>はじめに</h1>
この記事は基本概念から項目特性曲線（2PLM）の実装までをまとめた内容です。項目反応理論はあまり内容が深いので、今回はイメージできたら幸いです。違っている点などがあればご指摘お願いします。

<h2>基本概念</h2>
Wikipediaによると、評価項目群への応答に基づいて、被験者の特性（認識能力、物理的能力、技術、知識、態度、人格特徴等）や、評価項目の難易度・識別力を測定するための試験理論である。

簡単に言うと、項目（問題）に対する受験者の回答（正誤）のデータを見ることで、その設問の難易度が高いのか低いのか、また能力の高い、低いを適切に識別できる問題かどうかが分かり、それにより受験者の能力も正しく評価できる、という考え方である。

https://ja.wikipedia.org/wiki/項目応答理論


<h2>IRTを使用している主なテスト</h2>
<table>
  <thead>    <tr>
      <th>カテゴリー</th> <th>例</th>
    </tr>
  </thead>
  <tr>
    <td> 民間英語試験 </td> <td>TOEIC・TOEFL・GTEC・CASEC</td>
  </tr>
  <tr>
    <td> 学力調査試験 </td> <td>PISA・TIMSS・NAEP</td>
  </tr>
  <tr>
    <td> 心理尺度の作成・評価 </td> <td>性格判定、購買力尺度、進取的行動尺度</td>
  </tr>
</table>


<h2>項目反応理論の基本（良いところ）</h2>
テストを運用する際がよく直面する問題は、例えば、ある学校の今年度試験の平均点が昨年の平均点より伸びたため、その学校の生徒たちの学力が平均的に高くなったと考えられるか？

実はそうではなく、今年度のテストが簡単になっただけかもしれないし、仮に難易度が同じあったとしても、受験を受けた学生たちの集団も異なった可能性がありえる。このような問題は、該当のテスト項目や受験者集団の性質に依存したものとなる。

そこで、**IRT**では、テスト・尺度を受けた集団や問題（項目）に直接的に依存しない評価が可能。

それを実現するために、**項目反応モデル**と呼ばれる数理モデルと、**等化**と呼ばれる手続きである。

<h2>項目反応モデル</h2>
項目反応モデルとは、個人の能力・適性・態度等の直接観測できない潜在特性値をモデルに組み込み、ある**潜在特性値θ**を示す個人がある項目（問題）に正答する確率を表現。

<table>
  <thead>    <tr>
      <th></th> <th>よくある項目反応モデル</th>
    </tr>
  </thead>
  <tr>
    <td> 1 </td> <td>ロジスティック・モデル(logistic model)</td>
  </tr>
  <tr>
    <td> 2 </td> <td>正規累積モデル(normal ogive model)</td>
  </tr>
  <tr>
    <td> 3 </td> <td>ラッシュモデル(Rasch model)</td>
  </tr>
  <tr>
    <td> 4 </td> <td>段階反応モデル(graded response model)</td>
  </tr>
  <tr>
    <td> 5 </td> <td>部分的反応モデル(partial credit model)</td>
  </tr>
  <tr>
    <td> 6 </td> <td>名義反応モデル(nominal response model)</td>
  </tr>
  <tr>
    <td> 7 </td> <td>連続的反応モデル(continuous response model)</td>
  </tr>
  <tr>
    <td> 8 </td> <td>拡張ロジスティックモデル(generalized logistic model)</td>
  </tr>
  <tr>
    <td> 9 </td> <td>一般正規累積モデル(general normal-ogive model)</td>
  </tr>
</table>


:::note info
色々モデルがあるが、一般的には、ロジスティクス・モデル（<font color="red">**項目特性曲線**</font>）が使われる。
ロジスティクス・モデルで扱うパラメータ：
１．**識別力（a）**：受験者の特性値（能力）の違いが正答率にどの程度反映するか。
２．**困難度（b）**：大きいほどテスト項目が難しい問題である。
３．**当て推量（c）**:受験者が偶然正答する確率。
:::

<h2>項目特性曲線(Item Characteristic Curve:ICC)</h2>

項目特性曲線 (item characteristic curve:ICC)とは、項目反応理論において各項目ごとに推定される曲線である。x軸は測定する特性値、y軸にはその特性を持っている場合に各項目が正答となる確率(正答率)となる。

ICCは、困難度(正当となるにはどのくらい高い特性値が必要か）と識別力(項目はどの程度の特性値を識別することに長けているか）という２つのパラメータを持つ。

https://clover.fcg.world/2016/06/28/5621/

図１が示すグラフは、項目の<font color="red">**識別力(a)**</font>と<font color="red">**困難度(b)**</font>によってテスト項目の正答確率を表現しようとするモデル。横軸は受験者の能力値(θ)、縦軸は該当項目の正答率となる。横軸の能力値(θ)が増加するにつれて、縦軸の正答確率が向上することを表現している。識別力(a)と困難度(b)の分離することによって、テスト項目や受験者集団に依存する問題を克服することができる。

![スクリーンショット 2022-12-05 115517.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007201/9aff1716-1276-cb06-ce5a-15e3b1c74049.png)

<h1>項目特性曲線(2PLM)の実装</h1>

2PLMの場合は、
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f36323230322f62323337363139612d336465622d346639632d666163662d3564616135343135623735612e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007201/510933d5-3a21-b72b-240a-98a6c81b09f5.png)(1)
a=識別度、b=困難度、c=0、D=1.7(定数)、j=項目番号、θ=受験者能力、exp=指数関数で求めることができる。

一般的には、以下のようなグラフとなる。
![417cf9f0-ec2e-4250-9b69-e2f16126e3d6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007201/34f71779-ea7e-eca5-33a0-504953199134.png)

<h2>実装</h2>
データは<a href="https://www.ohmsha.co.jp/LinkClick.aspx?fileticket=Zx3G73mROMI%3d&tabid=104&mid=739&forcedownload=true">ここ</a>からダウンロードして、"testeg.csv"を読み込む。

```IRT.R
#データの読み込み
data <-read.csv("testeg.csv")

#項目反応パン行列
dim(data)
#20 11

#正答者数n_j
apply(data[,2:11],2,sum)
# q1  q2  q3  q4  q5  q6  q7  q8  q9 q10 
# 13  17  13  12  18  16  15   8   4  15 

#項目特性値
library(ltm)
descript(data[,2:11])
```
これによって、困難度(b)と識別力(a)を求めることができた。

![スクリーンショット 2022-12-05 153652.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007201/b609dffe-c274-f0da-8061-1e51f55a544e.png)

求めたい項目特性曲線の困難度(b)と識別力(a)を方程式(1)に代入し、項目特性曲線（2PLM）を生成しましょう。以下はコードです（c=0、D=1.7(定数)。

```IRT.R
#項目1
# a = 0.6278, b = 0.65 , c = 0.0
curve((1 + 0)/(1 + exp(-1.7*0.6278*(x-0.65))), -3, 3, col = "black", lty = 1, ylab = "正答率") 

#項目2
# a = 0.4027, b = 0.85, c = 0.0
curve((1 + 0)/(1 + exp(-1.7*0.4027*(x-0.85))), -3, 3, col = "red", lty = 2, add = TRUE)

#項目5
# a = 0.3676, b = 0.90, c = 0.0
curve((1 + 0)/(1 + exp(-1.7*0.3676*(x-0.90))), -3, 3, col = "blue", lty = 3, add = TRUE) 

#凡例を生成
legend("topleft", 
       legend = c("Q1:a = 0.6278, b = 0.65, c = 0.0", "Q2:a = 0.4027, b = 0.85, c = 0.0", "Q5:a = 0.3676, b = 0.90, c = 0.0"), 
       col = c("black", "red", "blue"),
       lty = 1:4, cex = 1.0)
```


上記のコードを実装すれば、下記のような項目特性曲線（2PLM）が生成された。

![Rplot.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007201/582bde86-5acd-6799-835c-cff17455025e.jpeg)

<h3>解説</h3>
グラフからわかったのは、

１、横軸は受験者の能力値(x)、縦軸は該当項目の正答率となり、横軸の能力値(x)が増加するにつれて、縦軸の正答確率が向上することを表現している。

２、同じ能力を持つ受験者において、項目の難易度順がQ5＞Q2＞Q1となる。

３、仮に同じ回答率60%を達成する場合、項目Q1に応じる能力が1.1、項目Q2に応じる能力が1.5、項目Q5に応じる能力が1.7である。

![スクリーンショット 2022-12-05 160420.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007201/cdbac73d-618c-4f4f-94f9-db3a682c97cc.png)


<h2>さいごに</h2>
いかがでしょうか。 Rで実装するのはシンプルだが、理論を理解するのは時間がかかる。今回はほんの一部を書いてみたが、余裕があったら、記事編集して充実させたいと思う。 


<h2>参考文献</h2>

（１）項目反応理論とは：https://ja.wikipedia.org/wiki/項目応答理論
（２）項目特性曲線 (item characteristic curve:ICC)とは：https://clover.fcg.world/2016/06/28/5621/
（３）加藤健太郎,川端一光,山田剛史（2014年）「Rによる項目反応理論」 株式会社 オーム社