草薙の研究ログ

英語の先生をやってます。

項目関連構造分析(item relational structure analysis)メモ

項目関連構造分析(item relational structure analysis)っていうのがあって,すごくアルゴリズムが簡単みたいなので,教育現場でも使えればいいとおもう。でも簡単に使えそうな道具がない。Excelでもできるのだけど…

 

すぐ見れそうな関連論文は…

ci.nii.ac.jp

ci.nii.ac.jp

 

ci.nii.ac.jp

ci.nii.ac.jp

 

 

アルゴリズムとしては,

①あるテストデータ(バイナリ)におけるすべての2項目の間について順序性係数(coefficient of ordinality)をもとめ,これを行列にする

*順序性係数は,学習者から見て一方の項目ができなければ他方の項目もできない,という方向性のある数字

②順序性係数の閾値(通常.5,もちろんこれには問題あり)を決定して,閾値以上を1,閾値以下を0に置換して,隣接行列(adjanency matrix)をもとめる。これをIRSマトリックスなどとよぶそう

③隣接行列から有向グラフにする。ただし,オリジナルな竹谷(1980)の方法ではこれにはいろいろと手順があるそう。(間接的に矢印を引くものに直接的な矢印を引かない,正答率順に付置する,etc..)

 

これをRでやる関数がみつからなくて…

とりあえずそれっぽいの作ってみた。

 


#Coefficient of Ordinality
CO<-function(dat,i,j){
t<-table(dat[,i],dat[,j])
a<-t[1,1]
c<-t[2,1]
d<-t[2,2]
n<-sum(t)
r<-1- (  (c/n)/(  (c+d)/n)/(  (a+c)/n))
r
}

 

#Analysis
allCO<-function(dat,t=.5){
library(igraph)
res1<-numeric(0)
res2<-numeric(0)
result<-numeric(0)
CO<-function(dat,i,j){
t<-table(dat[,i],dat[,j])
a<-t[1,1]
c<-t[2,1]
d<-t[2,2]

n<-sum(t)
r<-1- (  (c/n)/(  (c+d)/n)/(  (a+c)/n))
r
}
for(j in 1:ncol(dat)){
res1[j]<-CO(dat,1,j)
}
result<-res1
for(k in 2:ncol(dat)){
for(j in 1:ncol(dat)){
res2[j]<-CO(dat,k,j)
}
result<-rbind(result,res2)
}
result<-matrix(result,ncol(dat),ncol(dat))
COmatrix<-result
result[result>t]<-1
result[result<t]<-0
diag(result)<-0
ID<-apply(dat,2,mean)
plot(graph.adjacency(t(result)),layout=layout.fruchterman.reingold, vertex.size=21,vertex.color=0, vertex.label.color=1, vertex.frame.color=1,vertex.label.cex=1.5, edge.color=1)
list("Item Difficulty"=ID,"Coefficient of Ordinality Matrix"=COmatrix,"Adjacency Matrix"=result,"Threshold"=t)
}

 

 

ちゃんと検証していないので,これから直していこう。とりあえずたたき台ってことで。(使わないでください,まちがっていると思うので)

使い方は,バイナリーデータと閾値をなげるだけ。

allCO(dat, t =.5)

igraphにもとづくグラフも自動で描くけど,これは項目関連構造解析のスピリットにもとづくものではないし,見難い。igraphパッケージがないとエラーを吐くので,

install.packages("igraph")

しとくといい。

出力は,

allCO(dat3,t=.5)
$`Item Difficulty`
i12 i22 i2 i8 i32 i43 i4 i10 i13
0.96875 0.96875 0.93750 0.93750 0.93750 0.93750 0.90625 0.90625 0.90625
i23 i28 i42
0.90625 0.90625 0.90625

$`Coefficient of Ordinality Matrix`
[,1] [,2] [,3] [,4] [,5]
[1,] 1.00000000 -0.03225806 -0.03225806 0.48387097 0.48387097
[2,] -0.03225806 1.00000000 -0.03225806 -0.03225806 -0.03225806
[3,] -0.06666667 -0.06666667 1.00000000 -0.06666667 -0.06666667
[4,] 1.00000000 -0.06666667 -0.06666667 1.00000000 1.00000000
[5,] 1.00000000 -0.06666667 -0.06666667 1.00000000 1.00000000
[6,] 1.00000000 -0.06666667 -0.06666667 0.46666667 0.46666667
[7,] -0.10344828 -0.10344828 -0.10344828 -0.10344828 -0.10344828
[8,] 1.00000000 -0.10344828 0.44827586 0.44827586 0.44827586
[9,] -0.10344828 1.00000000 -0.10344828 -0.10344828 -0.10344828
[10,] 1.00000000 1.00000000 0.44827586 0.44827586 0.44827586
[11,] -0.10344828 -0.10344828 -0.10344828 -0.10344828 -0.10344828
[12,] 1.00000000 -0.10344828 0.44827586 0.44827586 0.44827586
[,6] [,7] [,8] [,9] [,10]
[1,] 0.48387097 -0.03225806 0.31182796 -0.03225806 0.3118280
[2,] -0.03225806 -0.03225806 -0.03225806 0.31182796 0.3118280
[3,] -0.06666667 -0.06666667 0.28888889 -0.06666667 0.2888889
[4,] 0.46666667 -0.06666667 0.28888889 -0.06666667 0.2888889
[5,] 0.46666667 -0.06666667 0.28888889 -0.06666667 0.2888889
[6,] 1.00000000 -0.06666667 0.28888889 -0.06666667 0.2888889
[7,] -0.10344828 1.00000000 -0.10344828 -0.10344828 -0.1034483
[8,] 0.44827586 -0.10344828 1.00000000 -0.10344828 0.6321839
[9,] -0.10344828 -0.10344828 -0.10344828 1.00000000 0.2643678
[10,] 0.44827586 -0.10344828 0.63218391 0.26436782 1.0000000
[11,] -0.10344828 0.26436782 -0.10344828 -0.10344828 -0.1034483
[12,] 0.44827586 -0.10344828 0.63218391 -0.10344828 0.6321839
[,11] [,12]
[1,] -0.03225806 0.31182796
[2,] -0.03225806 -0.03225806
[3,] -0.06666667 0.28888889
[4,] -0.06666667 0.28888889
[5,] -0.06666667 0.28888889
[6,] -0.06666667 0.28888889
[7,] 0.26436782 -0.10344828
[8,] -0.10344828 0.63218391
[9,] -0.10344828 -0.10344828
[10,] -0.10344828 0.63218391
[11,] 1.00000000 0.26436782
[12,] 0.26436782 1.00000000

$`Adjacency Matrix`
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,] 0 0 0 0 0 0 0 0 0 0 0 0
[2,] 0 0 0 0 0 0 0 0 0 0 0 0
[3,] 0 0 0 0 0 0 0 0 0 0 0 0
[4,] 1 0 0 0 1 0 0 0 0 0 0 0
[5,] 1 0 0 1 0 0 0 0 0 0 0 0
[6,] 1 0 0 0 0 0 0 0 0 0 0 0
[7,] 0 0 0 0 0 0 0 0 0 0 0 0
[8,] 1 0 0 0 0 0 0 0 0 1 0 1
[9,] 0 1 0 0 0 0 0 0 0 0 0 0
[10,] 1 1 0 0 0 0 0 1 0 0 0 1
[11,] 0 0 0 0 0 0 0 0 0 0 0 0
[12,] 1 0 0 0 0 0 0 1 0 1 0 0

$Threshold
[1] 0.5

こんな感じで,項目困難度(古典的テスト理論),順序性係数行列,隣接行列,閾値をリスト形式で。

グラフはこんな感じ。まだまだ調整しないと。これだと1から派生的になっているという感じね…

f:id:kusanagik:20150603231915p:plain