【R】任意の因子負荷から架空データを発生させる(1因子モデル編)
久しぶりの更新です。
更新したいネタはたくさんあるのですが,なかなか筆を執ることができません。
そんなどうでもいい個人的事情はおいておきまして,今回は備忘もかねて,統計ソフトRの{psych}パッケージを利用して任意の因子負荷行列から架空データを発生させる方法を書いておこうと思います。
{psych}パッケージのマニュアルはこちら。(※リンク先pdf注意)
大まかに次のような手順を踏みます。
- 因子負荷行列を用意する
- {psych}パッケージのsim関数を用いて相関行列に変換
- {MASS}パッケージのmvrnorm関数で正規乱数を発生
とりあえずということで,まずは1因子モデルでの方法をこの記事にまとめます。
まとめるといっても手順は少ないので,ごく簡単に使う関数を載せて,簡単な具体例を付記するのみですが。
ちょっと手抜きをしており,各関数の引数は必要最小限のみ指定しています。
わかりやすさを重視して各セクションごとにコードを分割して記載,一番最後にコピーペーストや参照しやすさの観点からひとつにまとめたものを記載というスタイルといたします。
因子負荷の状況設定~相関行列への変換
まずはここからです。
せっかくなので,CiNiiでオープンアクセスできる心理尺度を参考に状況設定してみます。
今回は(自分の性格を鑑みて,ダメージ的な意味で)心に突き刺さるものがあったので教育心理学研究に投稿された次の論文を選んでみました。
小浜 駿(2010).先延ばし意識特性尺度の作成と信頼性および妥当性の検証.教育心理学研究,58,325-337.ci.nii.ac.jp
この論文で作成された尺度の第1因子である「先延ばし中の否定的感情」を構成するとされる7項目について因子負荷を引用すると,.88, .82, .79, .77, .59, .57, .56という数字が得られます。
これを因子負荷ベクトルとして与えて相関行列を生成し,そこからデータを発生させるというわけです。*1
#psychパッケージの読み込み
library(psych)
#引っ張ってきた因子負荷をベクトルとして変数flの中に格納
fl<-c(0.88, 0.82, 0.79, 0.77, 0.59, 0.57, 0.56)
#psychパッケージのsim関数を使う
#今回は1因子モデルなのでsim.congeneric()を用いる
#生成した相関行列を変数cor.matの中に格納
cor.mat<-sim.congeneric(loads=fl)
任意の平均,相関行列から架空データ生成
ここまでで相関行列の生成ができましたので,このセクションではそこからデータを生成します。
{MASS}パッケージのmvrnorm関数で一発です,便利な時代になりました。
#MASSパッケージの読み込み
library(MASS)
#平均値のベクトルを用意する
#今回は7項目なので,各項目について計7つ平均があればよい
#今回は5件法とのことなので便宜的に3としました
mux<-c(3, 3, 3, 3, 3, 3, 3)
#架空データの発生
#作成したデータをデータフレームとするためにdata.frame()をかませています
#empiricalはTRUEならば指示通り(与えた通り)のデータを生成する模様
#nはサンプルサイズなので適当に与えてください
data<-data.frame(mvrnorm(n=100, mu=mux, Sigma=fl, empirical=TRUE))
これで,サンプルサイズが100の,7項目に関するデータが生成されているはずです。
コードのまとめ
2つに分割して記載しているので,ひとまとめにしたものも以下に用意しておきます。
説明のためのコメントが多いのは備忘録的性質の記事のためご愛敬ということで。
#パッケージの読み込み
library(MASS)
library(psych)
#引っ張ってきた因子負荷をベクトルとして変数flの中に格納
fl<-c(0.88, 0.82, 0.79, 0.77, 0.59, 0.57, 0.56)
#psychパッケージのsim関数を使う
#今回は1因子モデルなのでsim.congeneric()を用いる
#生成した相関行列を変数cor.matの中に格納
cor.mat<-sim.congeneric(loads=fl)
#平均値のベクトルを用意する
#今回は7項目なので,各項目について計7つ平均があればよい
#今回は5件法とのことなので便宜的に3としました
mux<-c(3, 3, 3, 3, 3, 3, 3)
#架空データの発生
#作成したデータをデータフレームとするためにdata.frame()をかませています
#empiricalはTRUEならば指示通り(与えた通り)のデータを生成する模様
#nはサンプルサイズなので適当に与えてください
data<-data.frame(mvrnorm(n=100, mu=mux, Sigma=fl, empirical=TRUE))
そのうち1~4因子まですべてまとめて因子負荷行列として与えたうえで架空データを生成できるようなものをまとめようという気持ちはあります。
論文で明記されているデータを再現するようなデータを発生させて,それを分析してみるなんていうのは勉強になりそうなのでいいですよね。
この記事では既存の関数だけを使ってやりくりしていますが,そのうち目的に応じて関数を組む必要も出てきそうです。
次の本,『みんなのR』と言いますが,バイブルクラスに出来がいいらしいので私も早く買います。
友人も即買って,べた褒めいていました。
なんだかんだ,Rもまだまだできない方なのが悩みの種です。
- 作者: Jared P. Lander,Tokyo.R(協力),高柳慎一,牧山幸史,簑田高志
- 出版社/メーカー: マイナビ
- 発売日: 2015/06/30
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
*1:本当は第4因子まであるので,4因子のモデルとして因子負荷行列を与えてデータ生成するほうが望ましいのだと思いますが,今回は単純化のために中から第1因子のみをピックアップして記事にしています。