因子分析 のRによる実施例です。
library(psych) # ライブラリの読み込み
library(GPArotation) # ライブラリの読み込み
setwd("C:/Rtest") # 作業用ディレクトリを変更
Data <- read.csv("Data.csv", header=T) # データを読み込み
fa(Data, nfactors = 2, fm = "ml", rotate = "varimax")$loadings # 因子数を2と仮定して、因子負荷量を出力
この実施例のデータは、AとBという変数を乱数で作っています。
いずれも、平均が10、標準偏差が1で正規分布になる乱数です。
AとBは相関がありません。
A1B10という変数があり、これは、
A1B10 = A + 10B + 平均が0、標準偏差が0.1の乱数」
という式で作っています。
そのため、ML1という因子がB、ML2という因子がAとして、因子をほぼ正確に見つけることができています。 A1B10の因子負荷量が、0.993と0.102というのも、前者が後者のほぼ10倍なので、元の変数の作り方を見つけることができています。
因子負荷量をグラフにする例は、以下の2つです。 ヒートマップの方は、部分的に拡大ができるので、項目が多い時に便利です。
library(psych) # ライブラリの読み込み
library(GPArotation) # ライブラリの読み込み
setwd("C:/Rtest") # 作業用ディレクトリを変更
Data <- read.csv("Data.csv", header=T) # データを読み込み
fa.diagram(fa(Data, nfactors = 2, fm = "ml", rotate = "varimax")) # 因子数を2と仮定して、因子負荷量を出力
library(psych) # ライブラリの読み込み
library(GPArotation) # ライブラリの読み込み
library(heatmaply) # ライブラリの読み込み
setwd("C:/Rtest") # 作業用ディレクトリを変更
Data <- read.csv("Data.csv", header=T) # データを読み込み
heatmaply(fa(Data, nfactors = 2, fm = "ml", rotate = "varimax")$loadings) # 因子数を2と仮定して、因子負荷量を出力
グラフは、因子負荷量の小さな値を自動でカットしたりするので、小さな値を見落とさないためには、数字データを直接チェックする方が確実と思います。
上記では回転の種類にvarimaxを使っています。
結論から書くと、
隠れ変数の探索
をするのに適しているのは、varimaxです。
psychには、その他の回転方法もありますが、感度が悪いです。
varimaxでは、 A1B10という変数には、2つの因子が影響していることが導き出すことができましたが、 その他の回転では、Aの影響がA1B10にあることを導き出せませんでした。
なお、 隠れ変数の探索 で行う分析の特徴は下記になります。
こういう時にはvarimaxが一番良いらしいということは、上記の例でわかりましたが、 どんな分析でもvarimaxを使えば良い、という訳ではないです。
Rの比較的古い文献では、因子分析のライブラリとしてfactanalが紹介されています。
factanalは、デフォルトのRで使えるため、ライブラリのインストールの手間や、ライブラリの読み込みの行が不要です。 また、varimaxとpromaxが使えるようになっています。
そのため、 隠れ変数の探索 が目的なら、psychよりもfactanalの方が手軽です。
ただ、factanalで、上記の例を実行しようとすると下記のエラーになり、計算ができません。
変数が4個でもエラーになります。
変数が5個あれば、2因子の探索ができるようになります。
この点を考えると、多少手間でも、psychを使う方が良いようです。
上記は、変数と因子の関係を見る分析でした。
因子分析の使い道として、サンプルと因子の関係を見たい時もありますので、その場合の例が下記になります。
library(psych) # ライブラリの読み込み
library(GPArotation) # ライブラリの読み込み
library(heatmaply) # ライブラリの読み込み
setwd("C:/Rtest") # 作業用ディレクトリを変更
Data <- read.csv("Data.csv", header=T, row.names=1) # データを読み込み。1列目をサンプル名とする
fa_result <- fa(Data, nfactors = 2, fm = "ml", rotate = "varimax") # 因子数を2と仮定して、因子分析
heatmaply(fa_result$loadings) # 変数と因子の関係の分析
heatmaply(fa_result$scores) # サンプルと因子の関係の分析
Rによる統計入門 津田裕之氏のページ
psychの使い方
https://htsuda.net/stats/factor-analysis.html
同志社大学 金明哲先生のページ
因子分析の解説と、factanalの使い方
https://www1.doshisha.ac.jp/~mjin/R/Chap_25/25.html