★ 重回帰分析などの変数の総当たり法について ★

2771. 重回帰分析などの変数の総当たり法について 太一 2004/03/17 (水) 09:48
├2777. Re: 重回帰分析などの変数の総当たり法について 青木繁伸 2004/03/17 (水) 12:42
│└2780. Re^2: 重回帰分析などの変数の総当たり法について 太一 2004/03/17 (水) 16:45
└2772. re:総当たり法について ひの 2004/03/17 (水) 09:59
 └2774. Re: re:総当たり法について 太一 2004/03/17 (水) 11:30


2771. 重回帰分析などの変数の総当たり法について 太一  2004/03/17 (水) 09:48
重回帰分析などで,変数の総当たり法を実行するアルゴリズムについて,質問させてください。

変数選択の基準に,いろいろなものを試してみたいので(F値や,AIC,BIC など),また,単に重回帰分析だけでなく,プロビット分析や,ロジット分析を行う際にも,利用したいので,MATLABや,Rなどの行列言語をつかって,自分で,コードを作成しようとしています。

すぐに思いついた方法は,変数の数だけ,ループを作成することです。
例えば,変数が10個なら,"for i = 0:1 〜 next i " を,10重のループにして( i=0の時は当該変数を加えない,i=1の時は,当該変数を加える),2の10乗回の処理を行って,データ行列を作成し,回帰係数やAICなどを,各モデルごとに計算して比べるという方法です。変数が10個くらいならよいのですが,もっと多いときには,for 〜 next 文を繰り返すだけではあるのですが,コードを書くこと自体がかなり大変です。

ネット上を検索したところ,総当たり法で重回帰分析を実行できるSPSSのスクリプトを,SPSS社のホームページからダウンロード出来るのを発見したのですが,SPSSのシンタックスは扱ったことがなく,コードをのぞいて見ても,どのようなアルゴリズムが使われているのか,全くわからない状態です。
2の変数の数乗だけの処理を行わなければならないことには変わりはないのですが,どなたかこれを実行する効率的なコーディングの仕方をご存知の方がいらっしゃいましたら,どうかご教唆頂けないでしょうか。よろしくお願いします。

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


2777. Re: 重回帰分析などの変数の総当たり法について 青木繁伸  2004/03/17 (水) 12:42
全ての組み合わせを発生・管理するには,私は以下のようにします。

n個の対象があるとき,0〜(2^n)-1 の範囲で一重のループを作ります。
ループの中で,ループ制御変数の二進表示を見れば,どの要素を対象にして操作をすればよいかわかります。

「C 風」のコーディングで...
for (i = 0; i < 2^n; i) {
  k = i
  for (j = 0; j < n; j=j+1) {
    if (mod(k, 2) == 1) { # ビットが立ってる(^_^)
      j は操作対象とする
    }
    else {
      j は操作対象ではない
    }
    k = int(k/2)
  }
  操作対象であるもの全部について,操作する
}
太一さんは R ということなので,実際に動くコードとその結果を以下に示しておきます。短いです(^_^)
要するに,整数の二進展開です。
> n <- 4
> bit <- rep(0, n)
> for (i in 0:(2^n-1)) {
+     k <- i
+     for (j in 1:n) {
+         bit[j] <- k %% 2
+         k <- k %/% 2
+     }
+     print(c(paste(i, ":"), bit))
+ }
[1] "0 :" "0"   "0"   "0"   "0"  
[1] "1 :" "1"   "0"   "0"   "0"  
[1] "2 :" "0"   "1"   "0"   "0"  
[1] "3 :" "1"   "1"   "0"   "0"  
[1] "4 :" "0"   "0"   "1"   "0"  
[1] "5 :" "1"   "0"   "1"   "0"  
[1] "6 :" "0"   "1"   "1"   "0"  
[1] "7 :" "1"   "1"   "1"   "0"  
[1] "8 :" "0"   "0"   "0"   "1"  
[1] "9 :" "1"   "0"   "0"   "1"  
[1] "10 :" "0"    "1"    "0"    "1"   
[1] "11 :" "1"    "1"    "0"    "1"   
[1] "12 :" "0"    "0"    "1"    "1"   
[1] "13 :" "1"    "0"    "1"    "1"   
[1] "14 :" "0"    "1"    "1"    "1"   
[1] "15 :" "1"    "1"    "1"    "1"   
この方法は,整数が何ビットで表されているかによりますね。32ビット整数なら32変数までということです。
それを超えるとどうするか。たぶん,それを考える前に,実際にそれを実行するとどれくらい計算時間がかかるかを計算してからの方がよいでしょうね(^_^)
どうしてもやり方を考えようと言うことでしたら,考え方は上と同じで,配列を作ってビットの管理をやればいいのです。100ビット(100変数)を考えるには要素100個の配列で,個々の配列が1ビットを担当するとして,あとは二進数の管理をやっていく。つまり,最初は全要素を0にして,次には順次最下位の要素に1を加えて桁上がり処理をして,というわけです。

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


2780. Re^2: 重回帰分析などの変数の総当たり法について 太一  2004/03/17 (水) 16:45
青木先生ありがとうございました。
大変よくわかりました。本当に短いコードで済みますね。
2進数表示は,気が付きませんでした。

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


2772. re:総当たり法について ひの  2004/03/17 (水) 09:59
すべての組み合わせを生成するアルゴリズムですね。たとえば以下のところにプログラム例があります(C言語)。
仙波一郎(1999)「組み合わせ数学」コロナ社 pp163-164
奥村晴彦(1991)「Cによる最新アルゴリズム事典」技術評論社 p60-61

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


2774. Re: re:総当たり法について 太一  2004/03/17 (水) 11:30
早速見てみます。
どうも,ありがとうございました。

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


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