項目応答理論

MikuHatsune2013-09-03

項目応答理論というものを知ったのでやってみる。
試験の結果に対して使うのが一般的だが、医学的に、特に遺伝子的に何か使ってないかと思ってPubmedで探したけれども、試験結果に使ったものが多くてSNP系にはなかった。
それでどう使おうかと考えてみたわけだが、まあだからといって何かいい案が思いついたわけでもないので…Rで項目反応理論をパクってやってみる。
 
適当にSNP genotyping したデータを取ってくる。
SNPはメジャーアレル A のホモ、ヘテロ、マイナーアレル a のホモ、という genotype によって 2/1/0 というラベル付けをされることが多いが、メジャーアレルを少なくともひとつもつ(優性遺伝モデル)を考えて、AA(2)とAa(1)を1、aa(0)を0として扱うとする。
 
項目応答理論は、n問の問題について正誤ラベル1/0があって、各問題について、問題が受検者の能力を識別するのによかったかどうかを考えてくれるらしい。
イメージとしては、とある問題について、試験全体がよく解ける、つまり賢い人はしっかり得点できて、試験全体がよく解けない、つまりアホな人は解けないような問題であればいい。これはロジスティック回帰的に考えることができて、x軸を受検者集団の得点分布SD(つまり、真ん中の0の人は超平均的な人)、y軸を正答確率とすると、偏差値50の人は50%答えられる(S字曲線のど真ん中)、超絶賢い偏差値70(> +2SDとか)なら90%正答、超絶勉強がんばれ(< -2SDとか)なら正答率10%、みたいな黒のS字曲線が最もうれしい。
だが、アホでも賢くても70%答えられるようなや、どんな人でも正答率30%のは問題として性能が悪い、ということになる。
使用するパラメータの数がいくつかあるようだが、2パラモデルが一番使われているっぽい。

# S字曲線の作成
f <- function(x, a){
	a[1] + (a[2]-a[1])/(1+exp(a[3]*(x-a[4])))
}
para <- rbind(c(1, 0, 1, 0), c(0.8, 0.6, 1, 0), c(0.3, 0.1, 0.7, 0))
x <- seq(-4, 4, length=1000) # 受検者集団での得点分布SD
y <- mapply(function(y) f(x, para[y,]), seq(nrow(para))) # 正答率

matplot(x, y, type="l", lwd=3, xlab="Score", ylab="Answer probability")


 
というわけで、データセットには25のSNPがあって、基本的にはメジャーアレルを持つのだけれども、いくつかマイナーアレルを持つ的なイメージでIRTを応用できないかと思ったけどすっきりとはいかなかったので保留。

library(MDR)
library(ltm)
data(mdr1)

snp <- mdr1[, grep("SNP", colnames(mdr1))]
snp[snp > 0] <- 1

irt1 <- rasch(snp)
irt2 <- ltm(snp ~ z1)
irt3 <- tpm(snp)

par(mfrow=c(1, 3))
lapply(list(irt1, irt2, irt3), plot)