R

尋找使用 R 對二分數據(二元變量)進行因子分析的示例的步驟

  • July 9, 2012

我有一些二元數據,只有二元變量,我的老闆讓我使用四色相關矩陣進行因子分析。我之前已經能夠根據此處以及UCLA 的統計站點和其他類似站點的示例自學如何運行不同的分析,但我似乎無法通過二分法的因子分析示例找到一個步驟使用 R 的數據(二進制變量)。

我確實看到了chl對一個有點相似的問題的回答,我也看到了ttnphns 的回答,但我正在尋找更詳細的內容,一步一步通過我可以使用的示例。

這裡有沒有人通過使用 R 對二元變量進行因子分析的示例知道這樣一個步驟?

2012-07-11 22:03:35Z 更新

我還應該補充一點,我正在使用具有三個維度的既定工具,我們在其中添加了一些額外的問題,我們現在希望找到四個不同的維度。此外,我們的樣本量僅為,我們目前有項目。我將我們的樣本量和項目數量與一些心理學文章進行了比較,我們肯定處於低端,但我們還是想嘗試一下。雖然,這對於我正在尋找的逐步示例並不重要,並且下面的 caracal 示例看起來非常棒。我會在早上第一件事就是使用我的數據來完成它。

我認為問題的重點不是理論方面,而是實踐方面,即如何在 R 中實現二分數據的因子分析。

首先,讓我們模擬來自 6 個變量的 200 個觀察值,來自 2 個正交因子。我將採取幾個中間步驟,從稍後將其二分法的多元正態連續數據開始。這樣,我們可以將 Pearson 相關性與多變量相關性進行比較,並將來自連續數據的因子載荷與來自二分數據和真實載荷的因子載荷進行比較。

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)

現在模擬來自模型的實際數據, 和是一個人的觀察變量值,真實載荷矩陣,潛在因素得分,和iid,均值為 0,正常錯誤。

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

對連續數據進行因子分析。忽略不相關符號時,估計的載荷與真實載荷相似。

> 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       

現在讓我們對數據進行二分法。我們將以兩種格式保存數據:作為具有有序因子的數據框和作為數字矩陣。hetcor()from packagepolycor為我們提供了我們稍後將用於 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

現在使用多變量相關矩陣進行常規 FA。請注意,估計的負載與來自連續數據的負載非常相似。

> 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       

你可以跳過自己計算多變量相關矩陣的步驟,直接使用fa.poly()from package psych,最終做同樣的事情。此函數接受原始二分數據作為數字矩陣。

faPCdirect <- fa.poly(XdiNum, nfactors=2, rotate="varimax")    # polychoric FA
faPCdirect$fa$loadings        # loadings are the same as above ...

編輯:對於因子分數,請查看ltm具有factor.scores()專門針對多分結果數據的功能的包。此頁面上提供了一個示例-> “因子分數 - 能力估計”。

factor.plot()您可以使用和可視化來自因子分析的載荷fa.diagram(),兩者都來自 package psych。出於某種原因,factor.plot()只接受$fa來自 的結果的組件,而fa.poly()不是完整的對象。

factor.plot(faPCdirect$fa, cut=0.5)
fa.diagram(faPCdirect)

factor.plot() 和 fa.diagram() 的輸出

平行分析和“非常簡單的結構”分析有助於選擇因素的數量。同樣,包psych具有所需的功能。vss()將多變量相關矩陣作為參數。

fa.parallel.poly(XdiNum)      # parallel analysis for dichotomous data
vss(pc$correlations, n.obs=N, rotate="varimax")   # very simple structure

該軟件包還提供了對多色 FA 的並行分析random.polychor.pa

library(random.polychor.pa)    # for random.polychor.pa()
random.polychor.pa(data.matrix=XdiNum, nrep=5, q.eigen=0.99)

fa.parallel.poly() 和 random.polychor.pa() 的輸出

請注意這些功能fa()fa.poly()提供更多選項來設置 FA。此外,我編輯了一些輸出,這些輸出給出了擬合測試的優劣等。這些函數(以及psych一般的包)的文檔非常好。這裡的這個例子只是為了讓你開始。

引用自:https://stats.stackexchange.com/questions/31948

comments powered by Disqus