★ qt1()でのエラー ★

4603. qt1()でのエラー Shimp 2004/10/13 (水) 10:09
└4604. Re: qt1()でのエラー 青木繁伸 2004/10/13 (水) 12:09
 └4605. Re^2: qt1()でのエラー 青木繁伸 2004/10/13 (水) 13:22
  └4612. Re^3: qt1()でのエラー Shimp 2004/10/13 (水) 19:38


4603. qt1()でのエラー Shimp  2004/10/13 (水) 10:09
群別データ分布図について,本当に有り難う御座いました。

 舌の根の乾かぬ内に立て続けで申し訳ありません。
 http://aoki2.si.gunma-u.ac.jp/R/qt1.html
 で,
dat <- matrix(c(
           1, 1, 4, -0.918,
           2, 2, 3, -0.770,
           2, 1, 4,  0.218,
           1, 3, 5,  0.721,
           4, 2, 5,  0.739,
           3, 3, 5,  0.799,
           4, 3, 5,  0.809,
           2, 3, 5,  0.895,
           4, 3, 2,  0.917,
           2, 3, 1,  0.931,
           5, 3, 5,  1.236,
           4, 3, 3,  1.518,
           4, 2, 1,  1.699
),  ncol=4, byrow=TRUE)
qt1(dat)
 を実行すると,
Error in drop(.Call("La_dgesv", a, as.matrix(b), tol, PACKAGE = "base")) : 
        system is computationally singular: reciprocal condition number = 4.69363e-017
 となってしまいます。

 3列目の独立変数を削除して,
dat <- matrix(c(
           1, 1, -0.918,
           2, 2, -0.770,
           2, 1,  0.218,
           1, 3,  0.721,
           4, 2,  0.739,
           3, 3,  0.799,
           4, 3,  0.809,
           2, 3,  0.895,
           4, 3,  0.917,
           2, 3,  0.931,
           5, 3,  1.236,
           4, 3,  1.518,
           4, 2,  1.699
),  ncol=3, byrow=TRUE)
 であれば,問題なく演算結果が得られます。

 実は3列目の独立変数は,4列目の従属変数に対してそれほど高い相関係数を有していない(r=-0.33)ことを覚悟の上で試行錯誤的に試しているのですが,これが遠因かもしれません。

 お手すきの折にでも,原因と対策についてコメントを頂戴できると幸甚に存じます。
 宜しくお願い致します。

     [このページのトップへ]


4604. Re: qt1()でのエラー 青木繁伸  2004/10/13 (水) 12:09
計算途中で逆行列が求まらない(singular matrix)ためですね。
原因は第3列目の変数です。
対策は,solve をやめて ginv にすることです。
ただ,全部 ginv にすると,潜在的な問題に気づかないので,教育的には solve にする(もしくは,デフォールトは solve にしておく)ということでしょうね。

     [このページのトップへ]


4605. Re^2: qt1()でのエラー 青木繁伸  2004/10/13 (水) 13:22
なぜ,No. 4603 のデータ(上側)が不都合かというと,ダミー変数に展開して以下のようになるデータをよく眺めると,
X1=2 X1=3 X1=4 X1=5 X2=2 X2=3 X3=2 X3=3 X3=4 X3=5 従属な変数
0   0   0   0   0   0   0   0   1   0   1
1   0   0   0   1   0   0   1   0   0   0
1   0   0   0   0   0   0   0   1   0   1
0   0   0   0   0   1   0   0   0   1   0
0   0   1   0   1   0   0   0   0   1   0
0   1   0   0   0   1   0   0   0   1   0
0   0   1   0   0   1   0   0   0   1   0
1   0   0   0   0   1   0   0   0   1   0
0   0   1   0   0   1   1   0   0   0   0
1   0   0   0   0   1   0   0   0   0   0
0   0   0   1   0   1   0   0   0   1   0
0   0   1   0   0   1   0   1   0   0   0
0   0   1   0   1   0   0   0   0   0   0
一番右の列の従属な変数と書いたところには,x2=2 と X2=3 に対応するダミー変数の和を1から差し引いた値が書いてあります。つまり
従属な変数=1−(x2=2)-(x2=3)
です。これは二つの変数から作り出されるものですから,従属な訳です。
そして,この変数と,x3=4 に対応するダミー変数を比較してみましょう。同じですね。つまり,x2=2 と x2=3 と x3=4 に対応する3つのダミー変数は従属な訳です。
よって,このデータから作られる行列の逆行列がとれないのです。

このようなことはある意味では,偶然起こるものであるといえるでしょう。データ数が多くなればそのような偶然の起こる確率はグ〜〜ンと低くなりますが,テストデータレベルの(あるいは,データ数が小さい)場合には,偶然というか,よく起こることになってしまうのです。

対策は,以下の何れか。
データをたくさん集める。
従属となる変数を除く。

     [このページのトップへ]


4612. Re^3: qt1()でのエラー Shimp  2004/10/13 (水) 19:38
 大変ていねいな解説を有り難う御座いました。
 とても良く判りました。

 しかもコメントにあったキーワード「逆行列 従属」あたりで過去ログを検索してみたら,これまでにもさんざん繰り返されてきたFAQ的な内容だった様です。大変失礼致しました。

 今回の私のケースは,(テストデータレベルというわけではなく)データ数が小さいです。
 データ数が小さいのにも関わらず,いたずらにカテゴリー/アイテムを増やすことはグ〜〜ンとリスクを背負うことがよく判りました。

 有り難う御座いました。

     [このページのトップへ]


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