重回帰の変数の数を減らす


9

時間の経過に伴うインデックスファンドの動作を予測するために重回帰で使用できる数百の金融変数の値で構成される大きなデータセットがあります。できるだけ多くの予測力を維持しながら、変数の数を10程度に減らしたいと思います。 追加:元の変数の経済的意味を維持するために、削減された変数のセットは元の変数セットのサブセットである必要があります。したがって、たとえば、私は元の変数の線形結合または集計に終わるべきではありません。

これを行う方法についてのいくつかの(おそらくナイーブな)考え:

  1. 各変数を使用して単純な線形回帰を実行し、値が最大の10を選択します。もちろん、組み合わされた10個の最良の個々の変数が10個の最良のグループになるという保証はありません。R2
  2. 主成分分析を実行し、最初のいくつかの主軸との関連が最も大きい10個の元の変数を見つけようとします。

変数は実際にはネストされていないため、階層回帰を実行できないと思います。組み合わせが多すぎるため、10個の変数の可能なすべての組み合わせを試すことは、計算上実行不可能です。

重回帰で変数の数を減らすというこの問題に取り組むための標準的なアプローチはありますか?

これは、標準的なアプローチがあるという十分に一般的な問題であるように思われます。

非常に役立つ答えは、標準的な方法に言及しているだけでなく、それがどのようにそしてなぜ機能するかの概要も提供するものでしょう。または、標準的なアプローチが1つではなく、長所と短所が異なる複数のアプローチがある場合、非常に役立つ答えは、長所と短所を説明するものです。

以下のwhuberのコメントは、最後の段落の要求が広すぎることを示しています。代わりに、主なアプローチのリストを、おそらくそれぞれの非常に簡単な説明とともに、良い答えとして受け入れます。条件が決まったら、自分の詳細を掘り下げることができます。


1
マイク、ESLに慣れていない場合は、ESLの第3章を参照してください。提供されたリンクのページは、テキストの無料の合法PDFを示しています。
枢機卿

たとえば、元の変数を10個だけ保持することを検討しているか、または元の変数の線形結合の小さなサブセットを使用するメソッドに関心があるかどうかを明確にできますか(後者は従来の主成分回帰のようなものです)あなたに与えるでしょう)。
枢機卿

3
この返信は、メソッド1の(多くの)問題の1つの具体例を示しています。フランクハレルの返信に対する@cardinalのコメントは、メソッド2の問題の核心に到達します。従属変数との関係、リスクは無関係または悪化している。標準的または「標準的な」回答に関して言えば、ここで1つ質問することは、楕円曲線上の有理点を見つけるためのすべての方法について、その長所と短所を含めて議論するのと少し似ています。
whuber

2
ここで他の人が指摘しているように、方法1では問題が発生します。:それは本当だ理由の直感的にアクセスできる治療のために/このアプローチの問題のもう一つの説明は、あなたはこの読むことをお勧めしますstats.stackexchange.com/questions/20836/...
GUNG -復活モニカ

1
最初のアイデアの問題を説明してくれたwhuberとgungに感謝します。
Mike Spivey、2012

回答:



6

方法1は機能しません。方法2は、方法に応じて希望があります。説明された分散の降順で主成分を入力することをお勧めします。より解釈可能なアプローチは、変数クラスタリングを実行し、各クラスターを(Yを使用せずに)単一のスコアに減らし、モデルをクラスタースコアで近似することです。


+1。「変数クラスタリング」とは、因子分析を意味しますか-それは私が使用するかもしれない戦略です(yを見る前にも)。クラスター分析は、変数ではなく観測値をグループ化したものと考えていますが、私はクラスター分析の表面的な知識しか持っていません。
gung-モニカの回復

1
予測変数の最大分散の方向は、必然的に応答と高度に相関していると考える先験的な理由はないようです。おそらく私はあなたのコメントを間違えたか、誤解しました。明確にしてもらえますか?
枢機卿

1
また、OPは、(非常に)彼の方法2に主要コンポーネント回帰を説明ないように聞こえる
カーディナル

元の投稿では完全には明確ではありませんでしたが、元の変数のサブセットが必要です。したがって、単純な主成分分析またはクラスタリングは、私が実際に求めているものではありません。
Mike Spivey、2012

1
varclusHmiscP

3

Rによるデータマイニングの第5章で、著者は最も有用な予測子を選択するいくつかの方法を示しています。(バイオインフォマティクスのコンテキストでは、各サンプル行には12,000以上の列があります!)

彼はまず、統計的分布に基づいていくつかのフィルターを使用します。たとえば、すべて同じような平均とsdを持つ6ダースの予測子がある場合、それらの1つを保持するだけで問題を回避できます。

次に、ランダムフォレストを使用して、どのフォレストが最も有用な予測子であるかを見つける方法を示します。これは自己完結型の抽象的な例です。良い予測変数が5つ、悪い予測変数が5つあることがわかります。コードは、ベスト3を維持する方法を示しています。

set.seed(99)

d=data.frame(
  y=c(1:20),
  x1=log(c(1:20)),
  x2=sample(1:100,20),
  x3=c(1:20)*c(11:30),
  x4=runif(20),
  x5=-c(1:20),
  x6=rnorm(20),
  x7=c(1:20),
  x8=rnorm(20,mean=100,sd=20),
  x9=jitter(c(1:20)),
  x10=jitter(rep(3.14,20))
  )

library(randomForest)
rf=randomForest(y~.,d,importance=T)
print(importance(rf))
#         %IncMSE IncNodePurity
# x1  12.19922383    130.094641
# x2  -1.90923082      6.455262
# ...

i=importance(rf)
best3=rownames(i)[order(i[,"%IncMSE"],decreasing=T)[1:3]]
print(best3)
#[1] "x1" "x5" "x9"

reduced_dataset=d[,c(best3,'y')]

著者の最後のアプローチは、階層的クラスタリングアルゴリズムを使用して、類似した予測子をたとえば30グループにクラスター化することです。30の多様な予測子が必要な場合は、それらの30グループのそれぞれから1つをランダムに選択します。

以下は、上記と同じサンプルデータを使用して、10列のうち3列を選択するコードです。

library(Hmisc)
d_without_answer=d[,names(d)!='y']
vc=varclus(as.matrix(d_without_answer))
print(cutree(vc$hclust,3))
# x1  x2  x3  x4  x5  x6  x7  x8  x9 x10 
#  1   2   1   3   1   1   1   2   1   3 

私のサンプルデータはこのアプローチにまったく適していません。これは、5つの優れた予測子と5つが単なるノイズであるためです。すべての10個の予測をわずかに相関していた場合yおよび(金融ドメイン内に十分に可能である)を一緒に使用する場合であっても良くあることのチャンスがあったが、これは良いアプローチかもしれません。


2

LASSOのような、パラメーターのベクトルの1つのノルムを最小化するソリューションを選択して最小二乗を正則化する方法の使用を検討する場合があります。これは、パラメーターベクトルの非ゼロエントリの数を最小限に抑える効果があることがわかります。LASSOは一部の統計界で人気がありますが、圧縮センシングの世界では他の多くの関連する方法が検討されています。


ありがとう。LASSOを検索します。(それも参照枢機卿のギブで言及されているように見えます。)
マイク・スパイビー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.