トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

日記/2011-8-7

キーワード

<< 前の日記  次の日記 >>

[日記]食事会

今日は、大学時代の友人たちと、久々に昼食。川崎の北海道でランチバイキング。品川にも店があるけども、ここのランチは質、量、料金ともに素晴らしいと思う。しかも、空いているのもあるのかもしれないけど、12時から15時まで個室で放っておかれたので、ゆっくりと。

ひとりはもうすぐ1歳になる子の母、もうふたりの間には新しい命が、と時間が経つのは早いものだ、とあらためて感じた。まぁ来年30だからなぁ。

[コンピュータ,統計]Rで項目反応理論ダイジェスト

もしかしたら、別途記事を作るかもしれないけど。→ダイジェストじゃない分量になったので、たぶんこのままで。

最近、仕事で項目反応理論に関わることになり、Rで項目反応理論 - RjpWikiを見ながら、ひととおり分析してみた。実際のデータは、仕事上のデータなので、ここでは、RjpWikiでも挙げられている、難解な“豊田本”でおなじみの豊田研究室の公開データを使って手順を紹介する。

とりあえず、前提として、WindowsにせよLinuxにせよ、Rがインストールされていることと、ネットワークに接続された環境が必要である。この記事では、Ubuntu 10.04を使っている。まぁ、Rを起動してからの操作は変わらないので。

 ltmパッケージ、Cairoパッケージのインストール

Rで項目反応理論に基づく分析をおこなうための、ltmパッケージをインストールする。Rを起動し、プロンプトで

install.packages(ltm)

とコマンドを実行する。GUIが起動している環境であれば、ダイアログが開く。Xウィンドウが使えない環境では、テキストで、パッケージのダウンロード先を聞いてくる。日本だと、つくばと兵庫にミラーがあるので、どちらかを選べばよいだろう。ダウンロード先を選べば、あとは自動でパッケージを取得し、インストールしてくれる。

なお、Ubuntuでは、一般ユーザで上記の操作をおこなうと、ユーザのホームディレクトリにパッケージがインストールされる。全ユーザでltmパッケージを使えるようにするには、root権限でRを起動し、パッケージをインストールする。

ついでに、作成したグラフを使いやすく画像出力するためのCairoパッケージもインストールする。手順は同じ。Cairoの頭が大文字なので、そこだけ注意。

 パッケージのロード

インストールしたパッケージを読み込む。プロンプトで

library(ltm)
library(Cairo)

とする。

 データの読み込み

あらかじめ、豊田研究室のサイトからダウンロードした、「学力テスト1(2値)」のデータgaku1.txtを適当な場所に保存しておく。なお、このデータはWindows改行になっているので、

nkf -wLu --overwrite gaku1.txt

といったようにして改行コードを変換しておく。また、最終行に改行がないと、データをうまく読み込めないようなので、データの最後でEnterを押して改行を足しておく。

データの準備ができたら、Rのプロンプトで

data <- read.fwf("gaku1.txt", widths=rep(1,50))

として、dataデータフレームにファイルの内容を読み込む。なお、RjpWikiのページでは、読み込んだデータから、さらにデータを絞り込んで別のデータフレームを作っているけど、そのへんはお好みで。

 2母数モデルに基づく分析

項目反応理論については、

  • 被験者の能力(θ)+項目の難易度→1母数モデル
  • 被験者の能力(θ)+項目の難易度+項目の識別力→2母数モデル
  • 被験者の能力(θ)+項目の難易度+項目の識別力+当て推量率→3母数モデル(多肢選択式の場合)

と、いろいろなモデルがあるようなのだけど、今回は、2母数モデル(潜在特性モデル: Latent Trait Model)で分析してみる。

分析の手順は簡単で、プロンプトで

ans <- ltm(data~z1)

とするだけ。dataは、さっき作ったデータフレームで、z1は、関数のリファレンスを見ると、「z1は相互作用で、z2はその2次の項」と書いてあるような気がする。たぶん、なんか複雑な動きをする、と想定される(想定できる)場合は、z2も使うんじゃないんだろうか。

コマンドを実行すると、ちょっと時間がかかって、結果がansデータフレームに格納される。この状態で、

ans

とデータフレームを参照すると、分析結果を数値で見ることができる。……が、専門家ではない(というか分析に慣れていない)ので、よくわからない。そこで、結果を項目特性曲線、項目情報曲線、テスト情報曲線という3つのグラフにしてみる。

 データをグラフ化する

まず、テストの各項目(問題)が、「どの程度の能力の人がどのくらいの確率で正解するか」を示す(と思う)項目特性曲線を描く。ltmパッケージには、項目特性曲線を描くための、plot.ltm関数が用意されている。

plot.ltm(ans)

とすると、縦軸が確率(0が必ず不正解、1が必ず正解)、横軸が被験者の能力(-4から4, 0がフツーの人?)として、グラフが描かれる(要GUI)。

項目特性曲線(Vxxが各問題のID)

結果を見ると、いろんな変化をする曲線が描かれる。(たぶん)理想的なグラフというのは、普通より能力の低い人は正答率が低く、能力の高い人で正答率の高い、横軸0近辺で急峻に確率(縦軸の値)が上昇するS字カーブなのだと思う。そうなっているのもあれば、もっと低いところに“ピーク”(変化が激しいところ)があるもの、かなり高いところでしか6割の正答率に達しない項目もある。また、どんな能力の人でもおおよそ等しく、5割程度の正答率になる項目もある。これは、能力ではなく、運次第の側面が強い項目と言えるだろう。

次に、各項目の識別力のピークを示す、項目情報曲線を描く。項目情報曲線は、項目の難易度と識別力を示す曲線である。ある項目が、どの程度の能力を測るのに最適か(能力以下では間違えやすいし、能力以上なら正解しやすい)、その正誤の変化がどれくらい急峻か、でグラフの位置と形が変わってくる。……とりあえず自分では資料も読んで納得したので、あとは独力でどうぞ。で、Rで項目情報曲線を描くには、以下のようにする。

plot(ans,type="IIC")

項目情報曲線

結果からは、テストの10問目(V10)は能力が-3よりも高いかどうかを判断するために有効で、19問目(V19)や20問目(V20)は-1よりも高いかどうかを判断するために有効、33問目(V33)は0よりも高いかどうかの判断にやや有効、あとの問題は、能力の判断にあまり有効ではない、というようなことが読み取れる。[1]あくまで数値データだけで、問題文は知らないので何もできないけど、こういう情報を活用して、能力値の判断に有効な問題だけを取捨選択して、テストの精度を高める、といったことができるのだと思う。

さらに、いま描いた各項目についての情報量は、全て足し合わせれば、テスト全体の情報量になる、という決まり(定理?法則?)があるので、全部足したテスト情報曲線を描いてみる。以下のようにコマンドを実行する。

plot(ans,type="IIC",items=0)

items=0というオプションを加えることで、全項目を足し合わせた曲線を描くことができる。

テスト情報曲線

この結果からは、サンプルデータのテスト項目は、能力が-1前後の人を判断するために最も適している、ということが読み取れる。たぶん、-1よりも能力が低いと、正答率が落ちて、-1よりも能力が高いと、正答率が上がるが、2と3の能力差は明確になり辛い、といった特徴があるのだと思う。

こんな感じで、項目反応理論に基づいた分析が簡単にできる[2]。なお、ltmパッケージで描くグラフは、デフォルトでは線が細く、軸ラベル等も見辛い。また、ファイル出力時に日本語が簡単に使えないので、先にインストール・ロードしたCairoパッケージを使って、フォント指定をおこなう。なお、Cairoパッケージが活用できるのは、FontConfigを使っているLinuxだけかもしれない。

 Cairoパッケージによるフォント指定

Cairoパッケージを使うと、FontConfigのフォント名を使って、TrueTypeフォントを簡単に指定できる。日本語が表示できるフォントを指定すれば、日本語の表示も可能となる。まず、使用するフォントを指定するため、以下のようなコマンドを実行する。

CairoFonts(regular="M+2P+IPAG:style=:regular",bold="M+2P+IPAG:style=bold")

フォントは、fc-listコマンドで一覧して、任意で選ぶ。そして、PDF出力する際に、

CairoPDF(file="xxx.pdf") # CairoPDFだけ、filename= じゃなくてfile=

とCairoPDF関数を呼び出す。他にも、CairoJPEG、CairoPNGなどの関数がある。これらを使い、またplot関数の、線の太さや軸ラベルのサイズを設定するオプションを組み合わせると、以下のようなグラフを描ける。プレゼンなんかでは、こうやって線を太くしたほうがよいだろう。

CairoPNG(filename="xxx.png",width=600,bg="white")
plot.ltm(ans,main="項目特性曲線",lwd=3,cex.lab=1.5,font.lab=2)
dev.off()

  • [1]数値の“相場”を知らないので、実は見かけ上低くても充分なのかもしれない。
  • [2]分析は。結果の解釈は、未だによくわかっていない部分が多い

コメントをどうぞ

計算:2×8= お名前: コメント:
最終更新時間:2011年08月08日 01時13分35秒

日記一覧へ