井出草平の研究ノート

2値カテゴリカル因子分析と潜在クラス分析のシミュレーション, その2

前回のエントリ、2値のカテゴリカル因子分析と潜在クラス分析の結果の差異で因子分析と潜在クラス分析のグループ分けの違いを分析した。

今回は以前のエントリで使用した児童向けウェクスラー式知能検査(Wechsler Intelligence Scale for Children; WISC)のデータを用いて、シミュレーションをしてみたい。今回は連続変数(打ち切り)が元データである。

データの読み込み

library(foreign)
data <- read.spss("wiscsem.sav", to.data.frame=TRUE)
d1 <- data[3:13] ## 因子分析に使用するのは3~13列目,連続変数のためのデータ
library(OneR)
d2 <- bin(d1, nbins = 2, labels = c(1,2))
library(dplyr)
d3 <- d2 %>% mutate_if(is.factor, as.integer) # 整数型への変換

d1が連続変数のデータ、d2が2値のfactor型データ、d3が2値の整数型のデータである。
因子数の2であったため、今回も2因子として分析する。

2値の因子分析を行う。

library("psych")
library("GPArotation")
fa2.ca <- fa(r = d3, nfactors = 2, fm = "minres", 
                   rotate = "oblimin", scores=TRUE, cor="tet")
print(fa2.ca, digits = 3)
因子1 因子2
info 0.978 -0.085
comp 0.351 0.438
arith 0.453 0.335
simil 0.647 0.214
vocab 0.785 0.033
digit 0.353 -0.023
pictcomp 0.080 0.679
parang -0.082 0.444
block 0.087 0.537
object -0.101 0.731
coding -0.141 0.231

参考までに連続変数の因子分析もしておこう。

fa2.n <- fa(r = d1, nfactors = 2, fm = "minres", 
                  rotate = "oblimin", scores=TRUE, cor="cor")
print(fa2.n, digits = 3)

結果は以下のようになる。

因子1 因子2
info 0.831 -0.075
comp 0.502 0.315
arith 0.604 -0.031
simil 0.562 0.225
vocab 0.743 0.029
digit 0.487 -0.128
pictcomp 0.063 0.587
parang 0.095 0.382
block 0.057 0.616
object -0.088 0.656
coding 0.101 -0.021

やはり連続変数で分けた方が明確な結果が得られる。
前半は言語性IQ、後半は動作性IQと言われるものである。

特徴としては、符号(coding)はどちらの因子にも含まれていないという点であろうか。

さて、これを潜在クラス分析で2クラスにしてみるとどのようになるだろうか。

Rで潜在クラス分析

library(poLCA)
f <- cbind(info,comp,arith,simil,vocab,digit,
                 pictcomp,parang,block,object,coding)~1 
                  #fomulaの設定。潜在クラス分析に入れる変数を選ぶ
lca2 <- poLCA(f, d2, nclass=2,maxiter=3000, nrep=100) #5クラスモデル

結果は以下のようになる。

クラス1 クラス2
info 0.0465 0.5041
comp 0.3329 0.8528
arith 0.0781 0.4652
simil 0.2218 0.8748
vocab 0.2061 0.8176
digit 0.3686 0.5790
pictcomp 0.2982 0.7680
parang 0.5594 0.7648
block 0.3430 0.6872
object 0.2692 0.6506
coding 0.6412 0.6003

クラス1はIQでストが悪かったタイプ、クラス2はIQテストが良かったタイプというように分かれた。符号(coding)はどちらの割合も高い。

今回もかなり異なったグループ分けとなった。
因子分析は言語性と動作性という2つIQ概念の違いが出てきた。因子分析は項目、つまり概念のグループ分けだからだ。
一方で、潜在クラス分析はIQが低いタイプとIQが高いタイプという2分割がされた。潜在クラス分析はケース、つまり、人の持つ性質のグループ分けだからだ。

潜在クラス分析の適正なクラス数

潜在クラス分析の結果が身もふたもない結果だったので、潜在クラス分析の適正なクラス数の推定しておこう。詳しくは以前のエントリを参照してほしい。

データの出力

write.csv(d3, file = "WISC.csv", row.names=FALSE, fileEncoding = "UTF-8")

Mplusのコマンドも一応書いておこう。

  TITLE:
    Categorical Factor Analysis vs. Latent class Analysis, using WISC Data
    
  DATA:
    FILE = WISC.csv;

  VARIABLE:
    NAMES = info comp arith simil vocab digit pictcomp parang block object coding;
    USEVARIABLES = info comp arith simil vocab digit pictcomp parang block object coding;
    CATEGORICAL = info comp arith simil vocab digit pictcomp parang block object coding;
    CLASSES = c (2);

  ANALYSIS:
    TYPE = MIXTURE;
    
  OUTPUT:
    TECH14;

BICとBLRTとP-vlaueは次のようになった。

BIC BLRT
Approximate P-Value
2class 2456.137 0.0000
3class 2475.115 0.0000
4class 2509.824 0.1923

指標間の差はなく3クラスが提案されている。
Mplusで出力された3クラスの結果は以下。

Class1 Class2 Class3
所属割合 0.371 0.217 0.411
info 0.612 0.000 0.061
comp 0.850 0.693 0.235
arith 0.478 0.191 0.078
simil 0.910 0.400 0.216
vocab 0.926 0.213 0.221
digit 0.628 0.253 0.429
pictcomp 0.758 0.669 0.192
parang 0.756 0.788 0.480
block 0.659 0.717 0.228
object 0.613 0.776 0.096
coding 0.572 0.807 0.567

クラス1はすべての能力が高いタイプ。
クラス2は動作性IQが高いタイプだ。ただComprehension(理解力)のみ高い。

クラス3は言語性IQのみ高いタイプであれば、きれいな結果なのだが、少し変わったクラスが作成れている。Digit Span、Paragraph Arrangement、codingが高く、Information、Arithmetic、Object Assemblyが低いというクラスだ。IQ検査を数多く実施している臨床家であれば、こういう児童がいることに心当たりがあるのかもしれないが、僕は臨床家でもなければIQについても詳しくないので、さっぱりわからない。

WISCを利用した臨床研究は「Aさんはこのようなタイプの能力が高かった/低かった」という論じ方が多い。個別例であれば特に問題はないが、ある程度の人数を根拠に傾向を論じるのであれば、因子分析を用いて妥当性が確保するWISCとの齟齬が生じる。臨床研究は人(ケース)単位で考えるので、潜在クラス分析の推定の方が理論と統計学の手技がフィットするからだ。

WISCやWAISといった知的機能検査というのは、概念(各種検査)を用いたグループ分けで妥当性が確保されている。しかし、そういった知的機能検査を、人を単位とした臨床のパターンについて語るのは望ましくないはずなのだが、臨床心理学のIQの議論では当たり前のようにされている。そのあたりの事情は臨床家は勉強することからは外れているので知らなくても仕方ないのだが、計量の学者からわかりやすく伝える努力が必要になってくるだろう。