項目反応理論 項目母数の推定誤差

## 目的
以前、2PLの母数の推定するためのEMアルゴリズムは実装していたのですが
Rとの比較はしていなかったので、備忘録として記録しておきます。

## 使用するデータ
使用するデータは豊田先生の書籍である[項目反応理論［入門編］](https://www.asakura.co.jp/detail.php?book_code=12795)から、学力テスト1を使用しています。
また項目のいくつかは、書籍の手順に則り、削除しています。
その上で残った30個の項目を自作の関数(Python)とRのltmパッケージにより、識別力と困難度を推定し値を比較します。

## Pythonの実行結果


[pythonで推定する際に作成した関数](https://github.com/ttksaito/test/blob/master/IRT_EMstep.ipynb)
[Rで推定する際に使用した関数](https://cran.r-project.org/web/packages/ltm/ltm.pdf)


| 項目 | python_推定値a | R_推定値a | python_推定値b |R_推定値b |
| ---- | ---- | ---- | ---- | ---- |
| 項目2 | 0.45 | 0.448 | -1.465 | -1.47 |
| 項目6 | 0.319 | 0.317 | -1.7 | -1.711 |
| 項目7 | 0.658 | 0.654 | -1.954 | -1.965 |
| 項目8 | 0.634 | 0.633 | -1.694 | -1.698 |
| 項目11 | 0.372 | 0.37 | -0.687 | -0.691 |
| 項目12 | 0.624 | 0.621 | -1.443 | -1.449 |
| 項目14 | 0.822 | 0.813 | -1.518 | -1.53 |
| 項目15 | 0.558 | 0.556 | 0.599 | 0.6 |
| 項目16 | 0.834 | 0.828 | -1.561 | -1.57 |
| 項目17 | 0.491 | 0.486 | -1.491 | -1.503 |
| 項目18 | 0.46 | 0.454 | -1.635 | -1.655 |
| 項目19 | 1.254 | 1.239 | -1.532 | -1.544 |
| 項目20 | 0.914 | 0.908 | -1.751 | -1.762 |
| 項目21 | 0.616 | 0.61 | -0.895 | -0.902 |
| 項目22 | 0.662 | 0.66 | -0.899 | -0.902 |
| 項目23 | 0.715 | 0.711 | -0.226 | -0.227 |
| 項目24 | 0.657 | 0.654 | 0.365 | 0.365 |
| 項目25 | 0.572 | 0.57 | 0.849 | 0.851 |
| 項目26 | 0.564 | 0.561 | -1.181 | -1.187 |
| 項目29 | 0.387 | 0.385 | 0.2 | 0.199 |
| 項目30 | 0.739 | 0.733 | -0.522 | -0.526 |
| 項目32 | 0.709 | 0.702 | -0.819 | -0.826 |
| 項目33 | 0.845 | 0.84 | -0.091 | -0.092 |
| 項目34 | 0.504 | 0.501 | -0.155 | -0.157 |
| 項目35 | 0.608 | 0.603 | -2.027 | -2.041 |
| 項目38 | 0.407 | 0.404 | 1.877 | 1.888 |
| 項目40 | 0.648 | 0.646 | 0.493 | 0.494 |
| 項目44 | 0.335 | 0.333 | 0.532 | 0.535 |
| 項目46 | 0.622 | 0.618 | 0.776 | 0.779 |
| 項目49 | 0.584 | 0.581 | -0.928 | -0.932 |

## 結果の考察
比較した結果、どの推定値も差はないように思える。
このことからも、推定の方法については、正しいと言えるだろう。

差はほどんどないが、推定の精度としては、どうなのか。
これを確認するために、推定値の標準偏差を比較してみる。

## 推定値の標準偏差

| 項目 | python_a | R_a | python_b | R_b |
| ---- | ---- | ---- | ---- | ---- |
| 項目2 | 0.204 | 0.106 | 0.343 | 0.384 |
| 項目6 | 0.182 | 0.095 | 0.525 | 0.584 |
| 項目7 | 0.292 | 0.149 | 0.354 | 0.412 |
| 項目8 | 0.267 | 0.135 | 0.303 | 0.351 |
| 項目11 | 0.177 | 0.092 | 0.264 | 0.285 |
| 項目12 | 0.25 | 0.126 | 0.258 | 0.3 |
| 項目14 | 0.316 | 0.156 | 0.22 | 0.266 |
| 項目15 | 0.202 | 0.102 | 0.178 | 0.199 |
| 項目16 | 0.325 | 0.16 | 0.225 | 0.272 |
| 項目17 | 0.216 | 0.111 | 0.324 | 0.369 |
| 項目18 | 0.212 | 0.11 | 0.373 | 0.427 |
| 項目19 | 0.496 | 0.233 | 0.165 | 0.216 |
| 項目20 | 0.378 | 0.185 | 0.245 | 0.297 |
| 項目21 | 0.225 | 0.113 | 0.185 | 0.213 |
| 項目22 | 0.239 | 0.118 | 0.174 | 0.202 |
| 項目23 | 0.234 | 0.114 | 0.126 | 0.145 |
| 項目24 | 0.222 | 0.108 | 0.143 | 0.162 |
| 項目25 | 0.209 | 0.104 | 0.196 | 0.222 |
| 項目26 | 0.223 | 0.113 | 0.237 | 0.271 |
| 項目29 | 0.174 | 0.09 | 0.217 | 0.229 |
| 項目30 | 0.245 | 0.119 | 0.132 | 0.155 |
| 項目32 | 0.248 | 0.121 | 0.157 | 0.185 |
| 項目33 | 0.266 | 0.125 | 0.109 | 0.13 |
| 項目34 | 0.195 | 0.098 | 0.168 | 0.183 |
| 項目35 | 0.279 | 0.142 | 0.392 | 0.454 |
| 項目38 | 0.194 | 0.101 | 0.455 | 0.512 |
| 項目40 | 0.218 | 0.108 | 0.151 | 0.171 |
| 項目44 | 0.167 | 0.087 | 0.274 | 0.292 |
| 項目46 | 0.215 | 0.108 | 0.176 | 0.201 |
| 項目49 | 0.22 | 0.111 | 0.197 | 0.225 |

## 標準偏差の考察
識別力aの推定の精度は、Rの方が良いが、
一方で、困難度bについては、自作したpythonの方がいいことがわかる。

自作関数の確認については、書籍と比較してあるので、ある程度は保証できると思うが
今回Rの出力結果を自作関数を使い出力したところ、これは一致しているとは言えなかった。

考えられパターンとしては、
1. 単純に計算のミス
1. Rが情報行列とは別の方法で推定している

自作の方は何回か確認しているので、計算ミスがないことを祈りたいが
Rの推定方法については、勉強不足で、まだわかっていない（ご存知の方がいれば、ご教授いただけると。。）

## まとめ
EMアルゴリズムでパラメータの推定を実装し、その確認のため、Rと比較しある程度は保証できそう。
推定値の精度については、ほとんどは0.2~0.3なので、良いと言えるのではないだろうか。
しかし計算方法の違いが発見されたので、この辺りはもう少し掘っていきたいところ。