No.17532 検証的因子分析  【コロン】 2012/10/11(Thu) 15:15

ご教授願います

青木先生作成の検証的因子分析のR関数cfaですが,実行すると下記メッセージが現れます。これはどのような意味でしょうか?

以下にエラー cfa(r, n, loc1) : convergence = 52

よろしくお願いいたします。

No.17533 Re: 検証的因子分析  【コロン】 2012/10/11(Thu) 15:22

申し訳ありません。情報が不足しておりました。
(データは豊田秀樹(2012)より(タイトル行は削除))

5 5 6 3 3 3 5 3 2
7 6 6 6 6 5 5 6 2
3 3 3 3 3 3 5 5 3
5 5 5 5 5 5 5 5 3
3 3 3 5 5 6 2 3 5
6 6 6 2 2 3 2 3 6
5 6 6 5 5 5 5 5 2
2 2 3 2 1 2 5 6 2
3 2 2 2 3 3 6 6 2
7 6 6 2 2 2 2 3 7
1 2 3 2 2 2 7 7 1
6 6 5 2 2 3 6 6 2
6 5 6 5 6 5 3 3 5
2 2 2 3 2 3 6 5 3
6 6 5 5 5 3 2 5 5
1 2 3 1 2 2 2 2 5
2 3 2 6 5 5 2 2 5
1 2 2 6 6 6 1 2 5
3 2 3 3 3 3 6 6 1
3 2 3 2 3 2 3 2 6
1 2 3 1 3 2 6 6 3
3 2 2 2 2 3 6 5 3
5 5 5 2 2 3 6 5 3
6 6 7 6 6 5 3 3 5

上は生データです。

青木先生から以前回答頂いたことを参考に下記のようにいたしました。
上記データは左から3つずつ一つの因子にまとまり,3因子解となります

r<-cor(dat)
n<-nrow(dat)
loc1<-matrix(c(
+ 1,0,0,
+ 1,0,0,
+ 1,0,0,
+ 0,1,0,
+ 0,1,0,
+ 0,1,0,
+ 0,0,1,
+ 0,0,1,
+ 0,0,1), byrow=TRUE, nc=3
+ )
cfa(r, n, loc1)

とすると,エラーメッセージが出て参ります。

No.17534 Re: 検証的因子分析  【青木繁伸】 2012/10/11(Thu) 15:58

cfa 関数の中で,
        ans <- optim(par, get.chi.sq, method="L-BFGS-B",        # 最適化(-1 〜 1 の制約付きで)
lower=rep(-lim, length(par)), upper=rep(lim, length(par)))
if (ans$convergence) {
stop(paste("convergence =", ans$convergence)) # 何らかの原因で収束しなかったら,理由を明示し停止
}
と書いてあります。エラーが起きたから停止した。

理由は,optim 関数のオンラインヘルプを読むと,
convergence	

An integer code. 0 indicates successful completion (which is always the case for "SANN" and "Brent"). Possible error codes are
:
:

52

indicates an error from the "L-BFGS-B" method; see component message for further details.
で,

message を書き出すようにプログラムを細工すると,
message = ERROR: ABNORMAL_TERMINATION_IN_LNSRCH
ということで,エラーの原因ははっきり書かれていないですね。optim 関数をトレースしていけばわかるかもしれませんが。

なお,method="Nelder-Mead" として,推定値の限界を外して,iteration を増やして以下のようにすると,
        ans <- optim(par, get.chi.sq, method="Nelder-Mead",        # 最適化(-1 〜 1 の制約付きで)
# lower=rep(-lim, length(par)), upper=rep(lim, length(par)),
control=list(maxit=100000))
取りあえず答は求まりますが,以下のように因子負荷量が1を超えるので,適切な解ではありません。結局の所,問題となっているエラーメッセージは,制約条件を満たす解が得られなかったというようなことでしょう。
> cfa(r, n, loc1)
$loadings
[,1] [,2] [,3]
[1,] 0.7592750 0.0000000 0.0000000
[2,] 1.2099019 0.0000000 0.0000000
[3,] 0.1286801 0.0000000 0.0000000
[4,] 0.0000000 0.9543056 0.0000000
[5,] 0.0000000 0.9469586 0.0000000
[6,] 0.0000000 0.9347775 0.0000000
[7,] 0.0000000 0.0000000 0.4964098
[8,] 0.0000000 0.0000000 0.1331915
[9,] 0.0000000 0.0000000 -1.7407278
まあ,元のデータの探索的因子分析(最尤法,promax 回転)の結果が,
> factanal2(dat, 3, rotation="p")
H0: 3 factors are sufficient.
Chi sq. d.f. P value
10.52204 12 0.5702615

Factor loadings(rotation:promax)
Factor1 Factor2 Factor3 Communality
x1 0.942001941 -0.003881102 0.004496049 0.8841625
x2 0.973269763 0.055047842 -0.014424439 0.9852427
x3 0.941476681 -0.024821431 -0.007323464 0.8756312
x4 0.035011236 0.982361400 0.023120552 0.9715476
x5 0.024800520 0.915174973 -0.039055811 0.8756012
x6 -0.032242130 0.930097518 0.023146592 0.8361596
x7 0.004624887 -0.136583111 0.912960063 0.9301721
x8 0.092673106 -0.040068671 0.879157181 0.7807291
x9 0.088553559 -0.159651455 -0.975963084 0.9025784
のように,作り物のデータとはいえ因子負荷量が 1 にきわめて近いという特殊なものなので,通常のプログラムでは収束しなかったのでしょう。

No.17536 Re: 検証的因子分析  【コロン】 2012/10/11(Thu) 16:29

青木先生

とても詳しい解説を本当にありがとうございます。

すっきりとしました。

ありがとうございました。

● 「統計学関連なんでもあり」の過去ログ--- 045 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る