Tôi lấy nó làm trọng tâm của câu hỏi ít hơn ở khía cạnh lý thuyết, và nhiều hơn về mặt thực tiễn, tức là làm thế nào để thực hiện phân tích nhân tố của dữ liệu nhị phân trong R.
Đầu tiên, hãy mô phỏng 200 quan sát từ 6 biến, đến từ 2 yếu tố trực giao. Tôi sẽ thực hiện một vài bước trung gian và bắt đầu với dữ liệu liên tục thông thường nhiều biến số mà sau này tôi sẽ phân đôi. Bằng cách đó, chúng ta có thể so sánh tương quan Pearson với tương quan đa âm và so sánh tải nhân tố từ dữ liệu liên tục với dữ liệu nhị phân và tải trọng thực.
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)
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
Làm phân tích nhân tố cho dữ liệu liên tục. Các tải trọng ước tính tương tự như tải thật khi bỏ qua dấu hiệu không liên quan.
> 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
Bây giờ hãy phân đôi dữ liệu. Chúng tôi sẽ giữ dữ liệu ở hai định dạng: dưới dạng khung dữ liệu với các yếu tố được sắp xếp và dưới dạng ma trận số. hetcor()
từ gói polycor
cung cấp cho chúng tôi ma trận tương quan đa âm sau này chúng ta sẽ sử dụng cho 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
Bây giờ sử dụng ma trận tương quan đa âm để làm FA thông thường. Lưu ý rằng các tải trọng ước tính khá giống với các tải từ dữ liệu liên tục.
> 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
Bạn có thể bỏ qua bước tự tính toán ma trận tương quan đa âm và trực tiếp sử dụng fa.poly()
từ gói psych
, thực hiện điều tương tự cuối cùng. Hàm này chấp nhận dữ liệu nhị phân thô dưới dạng ma trận số.
faPCdirect <- fa.poly(XdiNum, nfactors=2, rotate="varimax") # polychoric FA
faPCdirect$fa$loadings # loadings are the same as above ...
EDIT: Đối với điểm yếu tố, hãy xem gói ltm
có factor.scores()
chức năng dành riêng cho dữ liệu kết quả đa hình. Một ví dụ được cung cấp trên trang này -> "Điểm yếu tố - Ước tính khả năng".
Bạn có thể hình dung các tải từ phân tích nhân tố bằng cách sử dụng factor.plot()
và fa.diagram()
cả hai từ gói psych
. Vì một số lý do, factor.plot()
chỉ chấp nhận$fa
thành phần của kết quả fa.poly()
chứ không phải đối tượng đầy đủ.
factor.plot(faPCdirect$fa, cut=0.5)
fa.diagram(faPCdirect)
Phân tích song song và phân tích "cấu trúc rất đơn giản" cung cấp trợ giúp trong việc lựa chọn số lượng các yếu tố. Một lần nữa, góipsych
có các chức năng cần thiết. vss()
lấy ma trận tương quan đa âm làm đối số.
fa.parallel.poly(XdiNum) # parallel analysis for dichotomous data
vss(pc$correlations, n.obs=N, rotate="varimax") # very simple structure
Phân tích song song cho FA đa âm cũng được cung cấp bởi gói random.polychor.pa
.
library(random.polychor.pa) # for random.polychor.pa()
random.polychor.pa(data.matrix=XdiNum, nrep=5, q.eigen=0.99)
Lưu ý rằng các chức năng fa()
và fa.poly()
cung cấp nhiều tùy chọn khác để thiết lập FA. Ngoài ra, tôi đã chỉnh sửa một số đầu ra mang lại sự tốt cho các bài kiểm tra phù hợp, vv Tài liệu cho các chức năng này (và góipsych
nói chung) là tuyệt vời. Ví dụ này ở đây chỉ nhằm mục đích giúp bạn bắt đầu.