Mokken尺度分析の概要
Mokken尺度分析(Mokken Scale Analysis; MSA)とは、質問紙の複数項目が同一の潜在特性(能力、傾向、症状の強さなど)に沿って「順序尺度」として機能しているかを、比較的弱い仮定のもとで点検する方法である。項目反応理論(IRT)の一種に位置づけられるが、2PLや段階反応モデル(GRM)のように「反応確率がロジスティック曲線に従う」といった特定の関数形を強く仮定しない。したがって、モデルの当てはまりを精緻に競うというより、「合計得点で序列づけしてよいか」「項目群が一つの尺度としてまとまるか」といった、尺度の内部構造に関する妥当性の証拠をデータから引き出すことを主眼とする。
MSAの核となるのは単調性(monotonicity)である。潜在特性が高い人ほど、高いカテゴリ(より強い肯定、より重い症状など)を選ぶ確率が下がらない、という要請が単調性であり、これが大きく破綻していると、合計点が潜在特性の順序を反映しているという解釈が難しくなる。MSAではこの単調性を、他項目得点(restscore)で被験者を区分し、その区分ごとにカテゴリ反応の挙動が“逆走”しないかという形で診断することが多い。
もう一つの重要概念が尺度性(scalability)で、LoevingerのHという指標で要約される。Hは「その項目群が同一の潜在特性に沿ってどれだけ整然と並ぶか」を表す指標であり、全体H(尺度全体のまとまり)、項目別Hi(各項目が尺度にどれだけ寄与しているか)、項目ペア別H_ij(どの項目同士が強く結びついているか)として評価できる。実務上はHの大きさを手がかりに、項目群を一つの尺度として扱う妥当性がどの程度かを述べる。加えてAISP(Automated Item Selection Procedure)という自動項目選択手続きにより、指定した下限値(lowerbound)を満たす項目集合が「尺度として抽出されるか」を確認し、尺度構成の頑健性を点検することもできる。
さらに強い性質として、不変項目順序(Invariant Item Ordering; IIO)がある。これは潜在特性の水準にかかわらず、項目の“難しさ順”が入れ替わらないという性質であり、成立すれば「項目の序列そのもの」に安定した解釈が可能になる。ただしIIOは単調性より厳しい仮定であり、短い尺度やカテゴリ分布が極端に偏ったデータでは評価が不安定になりやすい。そのため、IIOは探索的に扱い、尺度の中心的主張はあくまで「尺度性(H)と単調性が概ね支持された」という水準に置く方が安全である。
要するにMokken尺度分析は、外的基準(診断、近縁尺度、将来転帰)が手元にない状況でも、データ内部から「この尺度を合計点で運用することは、順序尺度として筋が通るか」を追加検証するための実践的な道具立てである。特に、CFAの適合度が自由度不足で評価しにくい短尺度や、パラメトリックIRTの仮定が重いと感じる場面で、妥当性の証拠を補強する用途に向く。
他の方法との比較
古典的テスト理論(CTT)との比較では、CTTは主に信頼性(αやω)や項目—総得点相関といった指標で「一貫性」を見るのに強い一方、個々の項目反応が潜在特性に対して“順序尺度として”素直に動いているか(単調性)や、項目集合が順序尺度としてどれだけ並ぶか(H)のような構造的性質は直接は点検しにくい。MokkenはCTTより一段だけ構造に踏み込み、しかもパラメトリックIRTほどの強いモデル仮定を置かずに、内部構造の妥当性を語れる点が強みである。したがって「ωは高いが、項目が順序尺度として破綻していないかを確認したい」といった局面で相補的に働く。
CFA(確認的因子分析)との比較では、CFAは潜在変数モデルとして明確であり、複数因子や測定不変性といった枠組みを扱える長所がある。ただし短尺度では自由度の問題が出やすく、適合度が評価しにくいことがある。また順序カテゴリを扱う場合は推定法や多重閾値の取り扱いが絡み、実装と解釈がやや重くなる。Mokkenは因子モデルの代替というより、「短尺度でも実行できる内部構造チェック」として使うと役割分担が明確になる。
パラメトリックIRT(Rasch、2PL、GRMなど)との比較では、パラメトリックIRTは項目母数(識別力、困難度、閾値)を推定し、テスト情報量や尺度化、等化など高度な運用に強い。一方でモデル仮定が重く、カテゴリ分布が極端に偏るデータや短尺度では推定が不安定になったり、グローバル適合度が評価しにくかったりすることがある。Mokkenは「モデルを当てにいく」というより、「順序尺度として最低限の整合性があるか」を確認する診断的立場であり、パラメトリックIRTに進む前のスクリーニング、あるいはパラメトリックIRTが難しい状況での代替的証拠として位置づけると理解しやすい。
Guttman尺度との比較では、Guttmanは理想的には誤りのない決定論的な序列(完全な階層構造)を要請するが、現実データでは厳しすぎることが多い。Mokkenは確率的な誤りを許容しつつ階層性や順序性を評価するため、Guttmanの考え方を現実データに適用可能な形へ緩めた枠組みとして捉えると腑に落ちる。
総じて、Mokken尺度分析は「外的基準が乏しい」「短尺度でCFA/IRTが重い」「カテゴリ分布が偏っている」といった現実的な制約のもとで、内部構造の妥当性を追加で語るための、使い勝手の良い中間的アプローチである。ただし、Mokkenで増えるのはあくまで内部構造の証拠であり、併存妥当性や基準関連妥当性そのものが得られるわけではない点は明確にしておく必要がある。
デモ
[1] "reliable" "honest" "unscrupulous*" "deceitful*" "unintelligent*" "obnoxious*" "thankless*" "unfriendly*" [9] "dependable" "cruel*" "active" "alert" "ambitious" "thorough" "energetic" "unambitious*" [17] "quitting*" "determined" "industrious" "persevering"
aclデータ
データの形式は 433×218の整数行列で、列名には形容詞が並ぶ。したがって「被験者×項目」の典型的な質問紙データ。
データ準備
# データフレームに
df.acl <- as.data.frame(acl, check.names = FALSE)
# 欠損処理
n_before <- nrow(df.acl)
df.acl <- na.omit(df.acl)
n_after <- nrow(df.acl)
cat("Rows before:", n_before, "Rows after na.omit:", n_after,
"Removed:", n_before - n_after, "\n")
#整数化
df.acl <- as.data.frame(lapply(df.acl, as.integer))
Rows before: 433 Rows after na.omit: 433 Removed: 0
値域と分布の確認
分析前の必須の点検。
range_df <- data.frame( item = names(df.acl), min = vapply(df.acl, min, integer(1), na.rm = TRUE), max = vapply(df.acl, max, integer(1), na.rm = TRUE) ) print(head(range_df, 20))
item min max reliable reliable 1 4 honest honest 0 4 unscrupulous. unscrupulous. 0 4 deceitful. deceitful. 0 4 unintelligent. unintelligent. 0 4 obnoxious. obnoxious. 0 4 thankless. thankless. 0 4 unfriendly. unfriendly. 0 4 dependable dependable 0 4 cruel. cruel. 0 4 active active 0 4 alert alert 0 4 ambitious ambitious 0 4 thorough thorough 0 4 energetic energetic 0 4 unambitious. unambitious. 0 4 quitting. quitting. 0 4 determined determined 0 4 industrious industrious 0 4 persevering persevering 0 4
(1) 想定外の値(例:9や99などの欠測コード)が混入していない
(2) 尺度全体として0〜4の範囲に収まっている、
(3) ただし(3) 一部項目では最下位カテゴリが観測されないなど、カテゴリ出現に偏りがありうる
といったことがわかる。
値域チェック
9や99の欠測コードや想定外のコードが入ってないか確かめる
cat("Overall min/max:", min(unlist(df.acl)), max(unlist(df.acl)), "\n")
Overall min/max: 0 4
分布例(最初の6項目)
print(lapply(df.acl[, 1:6, drop = FALSE], function(z) table(z, useNA = "ifany")))
$reliable z 1 2 3 4 14 58 236 125 $honest z 0 1 2 3 4 2 11 78 226 116
尺度性(scalability)の評価
尺度性(scalability)の評価とは、項目群が同一の潜在特性に沿って「順序尺度」としてどれだけ整然と並ぶかを点検する作業である。Mokken尺度分析では、この尺度性をLoevingerのHで要約する。Hは、項目間の応答パターンが「潜在特性が高い人ほど高いカテゴリを選びやすい」という方向にどれだけ一貫しているかを、誤差を許容した形で数値化した指標だと捉えるとよい。値が大きいほど、項目群は同一次元の順序尺度としてまとまりが強く、合計得点による序列づけが“それなりに筋が通る”ことを意味する。
Hには三つのレベルがある。尺度全体を要約する全体H(scale-level H)は、項目集合全体としてのまとまりの強さを示す。項目別Hi(item-level Hi)は、各項目がその尺度のまとまりにどれだけ寄与しているか、あるいは逆にどれだけ足を引っ張っているかを示す。さらに項目ペア別Hij(pairwise Hij)は、どの項目同士が強く結びついて尺度性を作っているかを可視化する。とくに、項目数が多いデータではHijは全体像の把握に役立ち、項目数が少ない場合は「尺度性が特定ペアに依存していないか」を確認する材料になる。
解釈の目安としては、慣用的にHが0.30未満なら尺度性が弱く、0.30〜0.40は弱い(weak)、0.40〜0.50は中程度(medium)、0.50以上は強い(strong)と述べられることが多い。ただしこれは経験則であり、項目数やカテゴリ分布、対象集団の異質性によっても値は変わる。ブログのデモでは、まずHを出して「どの程度まとまるデータなのか」を確認し、その後のAISP(自動項目選択)や単調性(monotonicity)の診断につなげる、という流れが自然である。
Hの推定
H <- coefH(df.acl) H$H # scale-level H(全体の尺度性) H$Hi # item-level Hi(各項目の寄与)
整形
目的は、coefH() が返す「各項目の尺度性(Hi)とその標準誤差(se)」を、後で並べ替えや抽出ができる“分析用の表”に整えることである。ところが H$Hi は数値の表ではなく、Hi が空白つき文字列、se が括弧つき文字列として返ってくるため、そのままだと order() などが素直に使えない。そこで、項目名・Hi・se をそれぞれ独立した列に分け、余計な空白や括弧を取り除いて数値として扱える形に変換し、Hi の大小で項目をランキングできる状態にしている。
Hi_mat <- as.matrix(H$Hi)
item_H <- data.frame(
item = rownames(Hi_mat),
Hi = as.numeric(trimws(Hi_mat[, "Item H"])),
se = as.numeric(gsub("[()]", "", Hi_mat[, "se"])),
row.names = NULL
)
# 確認
head(item_H)
item Hi se 1 reliable 0.061 0.013 2 honest 0.085 0.012 3 unscrupulous. 0.039 0.012 4 deceitful. 0.050 0.011 5 unintelligent. 0.076 0.011 6 obnoxious. 0.043 0.014
Hiの低い順/高い順
coefH() が返す項目別の Hi(Loevinger の item scalability)は、「その項目が、いま想定している“1つの順序尺度(単一潜在特性)”の中でどれだけ整列に寄与しているか」を表す指標である。尺度全体の H が低いときでも、項目ごとに寄与の強弱があるため、Hi を並べ替えることで「尺度性を支えている項目」と「尺度性を壊している(または別次元の可能性が高い)項目」を経験的に点検できる。ここでは、Hi を昇順・降順にソートして上位20件ずつを表示し、極端に低い項目と高い項目を確認している。
Hiの低い順に上位を確認(尺度性を弱めている候補)
item_H_low <- item_H[order(item_H$Hi), ] head(item_H_low, 20)
item Hi se 138 self.confident. -0.121 0.012 127 confident. -0.114 0.012 135 gloomy -0.105 0.011 139 weak -0.101 0.013 134 pessimistic -0.097 0.012 129 spineless -0.093 0.014 121 fearful -0.086 0.014 132 despondent -0.086 0.012 98 indifferent -0.075 0.013 131 cowardly -0.067 0.014 126 independent. -0.066 0.013 104 unkind -0.065 0.012 124 complaining -0.064 0.014 130 anxious -0.063 0.013 133 submissive -0.063 0.013 100 tactful. -0.060 0.014 120 dependent -0.054 0.012 128 self.pitying -0.051 0.013 125 nervous -0.048 0.012 122 whiny -0.043 0.013
Hiの高い順に上位を確認(尺度性を支えている候補)
item_H_high <- item_H[order(-item_H$Hi), ] head(item_H_high, 20)
item Hi se 27 enterprising 0.153 0.010 15 energetic 0.150 0.010 117 initiative 0.148 0.010 205 spunky 0.143 0.010 76 cheerful 0.140 0.011 11 active 0.139 0.010 116 enthusiastic 0.134 0.011 18 determined 0.132 0.011 207 spontaneous 0.132 0.010 143 forceful 0.130 0.011 28 strong 0.129 0.011 77 optimistic 0.129 0.011 12 alert 0.125 0.012 115 daring 0.125 0.011 20 persevering 0.124 0.011 208 temperamental 0.124 0.010 164 courageous 0.119 0.011 79 versatile 0.118 0.011 74 sociable 0.115 0.011 196 practical 0.113 0.011
Hijの要約(最大値)
coefH() が返す 項目ペアごとの尺度性 Hij を「数値の対称行列」として復元し、重複を避けたうえで 最も強い結びつき(maxHij) を取り出すための前処理である。
# H$Hij を「文字行列」として確保
Hij_mat0 <- as.matrix(H$Hij)
# 列数は「値列+se列」で偶数になるはず
stopifnot(ncol(Hij_mat0) %% 2 == 0)
# 奇数列=Hij(値)、偶数列=se(括弧つき)
val_idx <- seq(1, ncol(Hij_mat0), by = 2)
# 値列だけ取り出して数値化
Hij_chr <- Hij_mat0[, val_idx, drop = FALSE]
Hij <- matrix(
as.numeric(gsub("[()]", "", trimws(Hij_chr))),
nrow = nrow(Hij_chr),
dimnames = list(rownames(Hij_mat0), colnames(Hij_mat0)[val_idx])
)
# 上三角だけ残して最大
Hij_ut <- Hij
Hij_ut[lower.tri(Hij_ut, diag = TRUE)] <- NA
maxHij <- max(Hij_ut, na.rm = TRUE)
maxHij
観測された最強の項目ペアの Hij を maxHij = 0.879 として得た。
上位ペア抽出
thr <- quantile(Hij_ut, 0.995, na.rm = TRUE) idx <- which(Hij_ut >= thr, arr.ind = TRUE) top_pairs <- data.frame( item1 = rownames(Hij_ut)[idx[, 1]], item2 = colnames(Hij_ut)[idx[, 2]], Hij = Hij_ut[idx] ) top_pairs <- top_pairs[order(-top_pairs$Hij), ] head(top_pairs, 20)
「特に結びつきが強い項目ペア」だけを上位から抜き出して、どの語同士が強くまとまっているかを把握するための処理。
item1 item2 Hij 74 handsome good.looking 0.879 38 noisy loud 0.861 4 ambitious unambitious. 0.823 71 attractive handsome 0.813 35 witty humorous 0.803 58 fearful anxious 0.799 63 confident. self.confident. 0.778 3 active energetic 0.765 99 confused. absent.minded. 0.765 73 attractive good.looking 0.762 45 tactless tactful. 0.756 15 conscientious precise 0.755 82 distrustful. suspicious. 0.749 29 stable poised 0.738 66 strong forceful 0.722 100 slipshod. disorderly. 0.719 22 fair.minded reasonable 0.718 1 reliable dependable 0.717 93 organized orderly 0.712 86 cruel. resentful. 0.710
handsome–good.looking(0.879)、noisy–loud(0.861)、witty–humorous(0.803)、fearful–anxious(0.799)、confident.–self.confident.(0.778)など、意味的に非常に近い語が上位に並んでいる。これは、acl の中に「ほぼ同じ内容を言い換えている項目ペア」や「同じ下位特性を強く共有する項目ペア」が多数含まれていることを示唆する。加えて、ambitious–unambitious. や tactless–tactful. のように反対語が強く結びつくのは、反対方向の項目が(符号の扱い次第で)同じ次元上で対になって動くためであり、スケール全体を一括で解釈するよりも、AISPなどで同質なクラスター(下位尺度)として取り出して扱うほうが自然である、という判断材料にもなる。
次回
次回はAISPにより、lowerboundを変えながら下位尺度(クラスター)を抽出し、どの程度安定して同じまとまりが得られるかを確認する。
文献
Mokken尺度分析の理論的背景と実務的解説としては、まずMokken自身による古典的文献が出発点になる。現代的な整理と応用の入口としては、SijtsmaとMolenaarによる単行本が定番であり、Rで実行する場合はvan der Arkによるmokkenパッケージの論文が最も参照されることが多い。
- Mokken, R. J. (1971). A Theory and Procedure of Scale Analysis. The Hague: Mouton.
- Sijtsma, K., & Molenaar, I. W. (2002). Introduction to Nonparametric Item Response Theory. Sage.
- Molenaar, I. W. (1997). Nonparametric models for polytomous responses.(章・レビューとして引用されることが多い)
- van der Ark, L. A. (2007). Mokken Scale Analysis in R. Journal of Statistical Software, 20(11), 1–19.(mokkenパッケージの基本文献)
- Sijtsma, K., & van der Ark, L. A.(MSAの発展的話題、IIOや診断法に関する論文群。必要に応じて追加するのがよい)