Tìm kiếm một bước thông qua một ví dụ về phân tích nhân tố trên dữ liệu nhị phân (biến nhị phân) bằng R


14

Tôi có một số dữ liệu nhị phân, chỉ có các biến nhị phân và ông chủ của tôi đã yêu cầu tôi thực hiện phân tích nhân tố bằng cách sử dụng ma trận tương quan tetrachoric. Trước đây tôi đã có thể tự dạy mình cách chạy các phân tích khác nhau dựa trên các ví dụ ở đây và tại trang thống kê của UCLA và các trang web khác giống như vậy, nhưng tôi dường như không thể tìm thấy một bước qua ví dụ về phân tích nhân tố về phân đôi dữ liệu (biến nhị phân) sử dụng R.

Tôi đã thấy câu trả lời của chl cho một câu hỏi hơi mô phỏng và tôi cũng thấy câu trả lời của ttnphns , nhưng tôi đang tìm kiếm một cái gì đó thậm chí còn được đánh vần hơn , một bước qua một ví dụ tôi có thể làm việc với.

Có ai ở đây biết một bước như vậy thông qua một ví dụ về phân tích nhân tố trên các biến nhị phân bằng R không?

Cập nhật 2012-07-11 22: 03: 35Z

Tôi cũng nên nói thêm rằng tôi đang làm việc với một công cụ đã được thiết lập, có ba chiều, mà chúng tôi đã thêm một số câu hỏi bổ sung và bây giờ chúng tôi hy vọng sẽ tìm thấy bốn chiều khác biệt. Hơn nữa, cỡ mẫu của chúng tôi chỉ là và hiện tại chúng tôi có 19 mặt hàng. Tôi đã so sánh kích thước mẫu của chúng tôi và số lượng vật phẩm của chúng tôi với một số bài báo tâm lý và chúng tôi chắc chắn ở cấp thấp hơn, nhưng chúng tôi vẫn muốn thử nó. Mặc dù, điều này không quan trọng đối với bước qua ví dụ tôi đang tìm kiếm và ví dụ của caracal dưới đây trông thực sự tuyệt vời. Tôi sẽ làm việc theo cách của mình thông qua dữ liệu đầu tiên vào buổi sáng.n=15319


1
Vì FA có thể không nhất thiết là sự lựa chọn tốt nhất, tùy thuộc vào câu hỏi bạn quan tâm, bạn có thể nói nhiều hơn về bối cảnh học tập của mình không?
chl

@chl, cảm ơn bạn đã trả lời câu hỏi của tôi, chúng tôi đang điều tra cấu trúc yếu tố cơ bản của một số câu hỏi liên quan đến PTSD. Chúng tôi quan tâm đến 1) xác định một số tên miền (cụm) và 2) điều tra xem có bao nhiêu câu hỏi khác nhau tải trên mỗi tên miền .
Eric Fail

1
Để chắc chắn, (a) cỡ mẫu của bạn là bao nhiêu, (b) đây có phải là một công cụ hiện có (đã được xác thực) hoặc một bảng câu hỏi tự làm không?
chl

@chl, tôi thực sự đánh giá cao câu hỏi của bạn. (a) Cỡ mẫu của chúng tôi là và hiện tại chúng tôi có 19 mặt hàng. Tôi đã so sánh kích thước mẫu của chúng tôi và số lượng vật phẩm của chúng tôi với những gì tôi có thể tìm thấy trong Tạp chí Stress chấn thương và chúng tôi chắc chắn ở cấp thấp hơn, nhưng chúng tôi vẫn muốn thử nó. (b) Chúng tôi đang sử dụng một công cụ hiện có, nhưng với một số câu hỏi tự tạo được thêm vào vì chúng tôi tin rằng chúng bị thiếu . n=153
Eric Fail

1
Ok, cảm ơn vì điều này. Điều đó thật dễ dàng để thiết lập một ví dụ hoạt động với hình minh họa trong R.
chl

Câu trả lời:


22

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 polycorcung 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 ltmfactor.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()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)

đầu ra từ Fact.plot () và fa.diagram ()

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)

đầu ra từ fa.pool.poly () và Random.polychor.pa ()

Lưu ý rằng các chức năng fa()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.


Bước qua ví dụ của bạn trông tuyệt vời. Tôi sẽ làm việc theo cách của mình thông qua dữ liệu của mình vào buổi sáng và lấy lại cho bạn. Cảm ơn bạn đã dành thời gian để viết này. Nếu bạn tình cờ có một số tài liệu tham khảo lý thuyết tôi cũng sẽ quan tâm đến chúng. Chl đề nghị sách giáo khoa của Revelle về tâm lý học trong R và tôi chắc chắn sẽ xem xét điều đó. Cảm ơn
Eric Fail

@caracal: có psychcho phép bằng cách nào đó ước tính điểm yếu tố khi tương quan poly / tetra-choric được sử dụng thay cho Pearson r thông thường không?
ttnphns

3
Xin lỗi, @caracal, tôi không phải là người dùng R. Đó là lý do tại sao tôi hỏi nó. Vì bạn đã sử dụng không phải Pearson r ban đầu mà là tetrachoric r, bạn đã mất liên kết đại số tuyến tính đơn giản giữa dữ liệu nhị phân gốc và ma trận tải. Tôi tưởng tượng rằng trong trường hợp này, một số thuật toán đặc biệt sẽ được sử dụng (ví dụ dựa trên phương pháp EM) thay cho hồi quy cổ điển / Bartlett một. Vì vậy, có psychphải là do thực tế là chúng ta đã xử lý tetrachoric r, không phải r thông thường, khi nó tính điểm yếu tố, hay không?
ttnphns

1
@EricFail Vì ma trận tương quan đa âm được ước tính bằng cách trải qua các tương quan cặp, một ma trận kết thúc không xác định thực sự trở nên phổ biến hơn khi số lượng biến tăng và số lượng quan sát được cố định (xem phần thảo luận MPlus này ). Các chức năng như nearcor()từ sfsmischoặc cor.smooth()từ psychđược sử dụng cho trường hợp này.
caracal

1
@ttnphns Xin lỗi, tôi đã hiểu nhầm câu hỏi của bạn. Câu hỏi hay! Tôi ban đầu cho rằng một cái gì đó giống như MPlus phụ lục kỹ thuật 11 đã được thực hiện, nhưng nhìn vào mã cho psych's factor.scores(), đây không phải là trường hợp. Thay vào đó, điểm số được tính giống như trong trường hợp liên tục. Tuy nhiên, factor.scores()chức năng trong gói ltmdường như thực hiện các quy trình chính xác, xem ví dụ này -> "Điểm yếu tố - Ước tính khả năng" và trang trợ giúp.
caracal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.