Saya menganggap fokus pertanyaannya kurang pada sisi teoretis, dan lebih pada sisi praktis, yaitu, bagaimana menerapkan analisis faktor data dikotomis dalam R.
Pertama, mari kita simulasikan 200 pengamatan dari 6 variabel, yang berasal dari 2 faktor ortogonal. Saya akan mengambil beberapa langkah perantara dan mulai dengan data kontinu normal multivarian yang kemudian saya lakukan dikotomi. Dengan begitu, kita dapat membandingkan korelasi Pearson dengan korelasi polikorik, dan membandingkan pemuatan faktor dari data kontinu dengan yang dari data dikotomis dan pemuatan yang benar.
set.seed(1.234)
N <- 200 # number of observations
P <- 6 # number of variables
Q <- 2 # number of factors
# true P x Q loading matrix -> variable-factor correlations
Lambda <- matrix(c(0.7,-0.4, 0.8,0, -0.2,0.9, -0.3,0.4, 0.3,0.7, -0.8,0.1),
nrow=P, ncol=Q, byrow=TRUE)
Sekarang mensimulasikan data aktual dari model , dengan menjadi nilai-nilai variabel yang diamati seseorang, loadings benar matriks, skor faktor laten, dan iid, mean 0, kesalahan normal.x = Λ f+ exΛfe
library(mvtnorm) # for rmvnorm()
FF <- rmvnorm(N, mean=c(5, 15), sigma=diag(Q)) # factor scores (uncorrelated factors)
E <- rmvnorm(N, rep(0, P), diag(P)) # matrix with iid, mean 0, normal errors
X <- FF %*% t(Lambda) + E # matrix with variable values
Xdf <- data.frame(X) # data also as a data frame
Lakukan analisis faktor untuk data kontinu. Taksiran pemuatan mirip dengan yang sebenarnya ketika mengabaikan tanda yang tidak relevan.
> library(psych) # for fa(), fa.poly(), factor.plot(), fa.diagram(), fa.parallel.poly, vss()
> fa(X, nfactors=2, rotate="varimax")$loadings # factor analysis continuous data
Loadings:
MR2 MR1
[1,] -0.602 -0.125
[2,] -0.450 0.102
[3,] 0.341 0.386
[4,] 0.443 0.251
[5,] -0.156 0.985
[6,] 0.590
Sekarang mari kita mendikotomi data. Kami akan menyimpan data dalam dua format: sebagai kerangka data dengan faktor yang diurutkan, dan sebagai matriks numerik. hetcor()
dari paket polycor
memberi kita matriks korelasi polikorik yang nantinya akan kita gunakan untuk FA.
# dichotomize variables into a list of ordered factors
Xdi <- lapply(Xdf, function(x) cut(x, breaks=c(-Inf, median(x), Inf), ordered=TRUE))
Xdidf <- do.call("data.frame", Xdi) # combine list into a data frame
XdiNum <- data.matrix(Xdidf) # dichotomized data as a numeric matrix
library(polycor) # for hetcor()
pc <- hetcor(Xdidf, ML=TRUE) # polychoric corr matrix -> component correlations
Sekarang gunakan matriks korelasi polikorik untuk melakukan FA biasa. Perhatikan bahwa taksiran beban cukup mirip dengan yang dari data kontinu.
> faPC <- fa(r=pc$correlations, nfactors=2, n.obs=N, rotate="varimax")
> faPC$loadings
Loadings:
MR2 MR1
X1 -0.706 -0.150
X2 -0.278 0.167
X3 0.482 0.182
X4 0.598 0.226
X5 0.143 0.987
X6 0.571
Anda dapat melewati langkah menghitung matriks korelasi polikorik sendiri, dan langsung menggunakan fa.poly()
dari paket psych
, yang melakukan hal yang sama pada akhirnya. Fungsi ini menerima data dikotomis mentah sebagai matriks numerik.
faPCdirect <- fa.poly(XdiNum, nfactors=2, rotate="varimax") # polychoric FA
faPCdirect$fa$loadings # loadings are the same as above ...
EDIT: Untuk skor faktor, lihat paket ltm
yang memiliki factor.scores()
fungsi khusus untuk data hasil politom. Contoh disediakan di halaman ini -> "Skor Faktor - Estimasi Kemampuan".
Anda dapat memvisualisasikan pemuatan dari analisis faktor menggunakan factor.plot()
dan fa.diagram()
, keduanya dari paket psych
. Untuk beberapa alasan, factor.plot()
hanya menerima $fa
komponen hasil dari fa.poly()
, bukan objek penuh.
factor.plot(faPCdirect$fa, cut=0.5)
fa.diagram(faPCdirect)
Analisis paralel dan analisis "struktur yang sangat sederhana" memberikan bantuan dalam memilih sejumlah faktor. Sekali lagi, paket psych
memiliki fungsi yang diperlukan. vss()
mengambil matriks korelasi polikorik sebagai argumen.
fa.parallel.poly(XdiNum) # parallel analysis for dichotomous data
vss(pc$correlations, n.obs=N, rotate="varimax") # very simple structure
Analisis paralel untuk polikorik FA juga disediakan oleh paket random.polychor.pa
.
library(random.polychor.pa) # for random.polychor.pa()
random.polychor.pa(data.matrix=XdiNum, nrep=5, q.eigen=0.99)
Perhatikan bahwa fungsinya fa()
dan fa.poly()
menyediakan lebih banyak opsi untuk mengatur FA. Selain itu, saya mengedit beberapa output yang memberikan uji kelaikan yang baik, dll. Dokumentasi untuk fungsi-fungsi ini (dan paket psych
secara umum) sangat bagus. Contoh ini di sini hanya dimaksudkan untuk membantu Anda memulai.