Rを使用した二分データ(バイナリ変数)の因子分析の例を介してステップを探しています


14

バイナリ変数のみのいくつかの二分データがあり、上司は四分相関行列を使用して因子分析を実行するように頼みました。私は以前、ここにある例とUCLAのstatサイトなどのサイトに基づいて異なる分析を実行する方法を自分自身に教えることができましたが、二分法の因子分析の例を通してステップを見つけることはできないようです。 Rを使用したデータ(バイナリ変数)

私が見たのCHLの応答ややまねの質問には、私も見ましたttnphns'答えを、私はもっと何かを探しています綴ら、私が一緒に働くことができる例を通してステップ。

ここの誰かが、Rを使用したバイナリ変数の因子分析の例を通してそのようなステップを知っていますか?

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

また、3次元の確立された機器で作業していることを追加する必要があります。これにいくつかの質問を追加し、4つの異なる次元を見つけたいと考えています。さらに、サンプルサイズはのみで、現在個のアイテムがあります。サンプルサイズとアイテムの数をいくつかの心理学の記事と比較しましたが、間違いなく低価格ですが、とにかく試してみたかったのです。しかし、これは私が探しているステップスルーの例にとって重要ではなく、以下のカラカルのは本当に素晴らしいようです。朝一番に自分のデータを使って作業を進めます。n=15319


1
関心のある質問によっては、FAが必ずしも最良の選択とは限らない場合がありますので、研究の背景について詳しくお聞かせください。
-chl

@chl、私の質問に答えてくれてありがとう、私たちはPTSDに関するいくつかの質問の根底にある因子構造を調査しています。1)いくつかのドメイン(クラスター)を特定し、2)各ドメインに異なる質問がどれだけロードされるかを調査します
エリックフェール

1
念のため、(a)サンプルサイズは何ですか、(b)これは既存の(既に検証済みの)楽器ですか、それとも自作のアンケートですか?
chl

@chl、ご質問ありがとうございます。(a)サンプルサイズはで、現在19個のアイテムがあります。サンプルサイズとアイテム数をJournal of Traumatic Stressで見つけられるものと比較しましたが、間違いなく低価格帯にありますが、とにかく試してみたかったのです。(b)既存の楽器を使用していますが、欠落していると思われるいくつかの自作の質問が追加されています。n=153
エリックフェール

1
わかりました、これに感謝します。これは、Rの図で実例を簡単にセットアップできるはずです
。– chl

回答:


22

私は、問題の焦点は理論的な側面ではなく、実際的な側面、つまりRの二分データの因子分析をどのように実装するかということに焦点を当てていると思います。

最初に、2つの直交因子からの6つの変数から200の観測値をシミュレートしましょう。いくつかの中間ステップを取り、後で二分する多変量の通常の連続データから始めます。そのようにして、ピアソン相関と多項相関を比較し、連続データからの因子負荷と二分データおよび真の負荷からの因子負荷を比較できます。

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、正常エラー。X Λ F Eバツ=Λf+eバツΛ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

連続データの因子分析を行います。推定負荷は、無関係な記号を無視した場合の真の負荷に似ています。

> 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       

次に、データを二分します。データを2つの形式で保持します。順序付けられた因子を持つデータフレームとして、および数値行列として。hetcor()パッケージからpolycorは、後で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()パッケージから直接使用することができます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()両方をパッケージを使用して、因子分析から負荷を視覚化できます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全般)のドキュメントは優れています。ここでのこの例は、開始するためのものです。


あなたのステップスルーの例は素晴らしいですね。午前中に自分のデータを使用して作業を進め、戻ってきます。これを書いてくれてありがとう。もし理論的な参考文献があったら、私も興味があります。Chl はRのサイコメトリクスについてRevelleの教科書を推奨しました。私は間違いなくそれを見ていきます。ありがとう
エリックFail

@caracal:通常のピアソンrの代わりにポリ/テトラコリック相関が使用されている場合psych、何らかの方法で因子スコアを推定できますか?
ttnphns

3
すみません、@ caracal、私はRユーザーではありません。それ私がそれを求めている理由です。元のPearson rではなく、テトラコリックrを使用したため、元のバイナリデータと読み込み行列の間の単純な線形代数リンクを失いました。この場合、古典的な回帰/バートレットの代わりに、いくつかの特別なアルゴリズムが使用されます(EMアプローチに基づくなど)。それでpsych、因子スコアを計算するとき、またはしないときに、通常のrではなく、四重項rを扱っていたという事実のためにそれを与えますか?
ttnphns

1
@EricFailポリコリック相関行列は、ペアワイズ相関を介して推定されるため、変数の数が増えるにつれて非正定値終了行列が実際に一般的になり、観測数が固定されます(このMPlusの説明を参照)。この場合nearcor()、from sfsmisccor.smooth()from psychなどの関数が使用されます。
カラカル

1
@ttnphns申し訳ありませんが、あなたの質問を誤解しました。良い質問!私はもともとMPlus技術的な付録のようなものが11が実装されたと仮定し、しかしためのコードを見てpsychfactor.scores()、このケースではありません。代わりに、スコアは連続した場合と同じように計算されます。ただし、factor.scores()パッケージ内の関数ltmは正しい手順を実装しているようです。この ->「ファクタースコア-能力の見積もり」とヘルプページを参照してください。
カラカル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.