主成分分析と因子分析で正規化が必要か? [データサイエンス、統計モデル]
統計の講師をしていて、なるほど!と思う質問を受けることがあります。
せっかくなので、その中からピックアップして紹介できればと思います。
【質問】
主成分分析と因子分析で正規化が必要か?
【回答】
まず、主成分分析と因子分析で何を元に計算されているかですが、
主成分分析:分散共分散行列
因子分析:相関行列
となっています。
主成分分析では分散共分散行列を使うため、単位の影響を受けてしまいます。
なので、単位が1000倍近くあると(gとkgみたいに)何かと問題になりやすい。
一方で、因子分析では相関行列を使っているため、標準化は必須ではないです。
パッケージのlavaanを使っていると、
lavaan WARNING: some observed variances are (at least) a factor 1000 times larger than others; use varTable(fit) to investigate
という警告文が出てくる場合があります。
モデル1とモデル2(100倍したもの)でモデルを作って比較すると、CFI、RMSEA、SRMRなどは同じ値になっていることが確認できるかと思います。
一方で、データそのものの値を使うAICなどは値が当然変わっています。
データが違うので、AICではモデル1とモデル2の比較は比較できません。
係数を見てみると、100倍したモデル2では、係数も100倍となっています。
########################################
library(lavaan)
library(psych)
#分析前にNA(欠測)を含む個体(対象者)を除外する
#リストワイズ削除
bfi2<-na.omit(bfi[ , c("A1", "A2", "A3", "A4", "A5", "gender")])
#変数に名前を付ける
colnames(bfi2)<-c("a1","a2","a3","a4","a5","gender")
bfi2_100 <- bfi2
bfi2_100$a1 <- bfi2_100$a1 * 100
#分析モデル 1
model <- '
A =~ a1 + a2 + a3 + a4 + a5
a1 ~~ a1;a2 ~~ a2;a3 ~~ a3;a4 ~~ a4;a5 ~~ a5
A ~~ 1*A
'
fit1 <- lavaan(model, data=bfi2)
summary(fit1, standardized=T, fit.measures = TRUE)
#分析モデル 2
fit2 <- lavaan(model, data=bfi2_100)
summary(fit2, standardized=T, fit.measures = TRUE)
せっかくなので、その中からピックアップして紹介できればと思います。
【質問】
主成分分析と因子分析で正規化が必要か?
【回答】
まず、主成分分析と因子分析で何を元に計算されているかですが、
主成分分析:分散共分散行列
因子分析:相関行列
となっています。
主成分分析では分散共分散行列を使うため、単位の影響を受けてしまいます。
なので、単位が1000倍近くあると(gとkgみたいに)何かと問題になりやすい。
一方で、因子分析では相関行列を使っているため、標準化は必須ではないです。
パッケージのlavaanを使っていると、
lavaan WARNING: some observed variances are (at least) a factor 1000 times larger than others; use varTable(fit) to investigate
という警告文が出てくる場合があります。
モデル1とモデル2(100倍したもの)でモデルを作って比較すると、CFI、RMSEA、SRMRなどは同じ値になっていることが確認できるかと思います。
一方で、データそのものの値を使うAICなどは値が当然変わっています。
データが違うので、AICではモデル1とモデル2の比較は比較できません。
係数を見てみると、100倍したモデル2では、係数も100倍となっています。
########################################
library(lavaan)
library(psych)
#分析前にNA(欠測)を含む個体(対象者)を除外する
#リストワイズ削除
bfi2<-na.omit(bfi[ , c("A1", "A2", "A3", "A4", "A5", "gender")])
#変数に名前を付ける
colnames(bfi2)<-c("a1","a2","a3","a4","a5","gender")
bfi2_100 <- bfi2
bfi2_100$a1 <- bfi2_100$a1 * 100
#分析モデル 1
model <- '
A =~ a1 + a2 + a3 + a4 + a5
a1 ~~ a1;a2 ~~ a2;a3 ~~ a3;a4 ~~ a4;a5 ~~ a5
A ~~ 1*A
'
fit1 <- lavaan(model, data=bfi2)
summary(fit1, standardized=T, fit.measures = TRUE)
#分析モデル 2
fit2 <- lavaan(model, data=bfi2_100)
summary(fit2, standardized=T, fit.measures = TRUE)
コメント 0