ロジスティック回帰モデルの正しい方法で予測子を減らす方法


9

現在の状況では、バイナリ応答データに基づいてロジスティックモデルを実行する必要があるため、モデリング(特にハレルの「回帰モデリング戦略」)に関する本(またはその一部)を読んでいます。データセットに、連続データ、カテゴリデータ、およびバイナリデータ(予測子)の両方があります。基本的に、私は現在約100の予測子を持っていますが、これは優れたモデルには明らかに多すぎます。また、これらの予測子の多くは、多少は異なりますが、同じメトリックに基づいていることが多いため、一種の関連性があります。

とにかく、一変量回帰と段階的手法を使用して私が読んでいることは、予測変数の量を減らすために実行できる最悪のことです。LASSOテクニックは(私がそれを正しく理解していれば)非常に大丈夫だと思いますが、明らかに100の予測子でそれを使用することはできません。

だからここで私の選択肢は何ですか?私は本当に座って、すべての上司、職場の賢い人々と話をし、トップ5の最良の予測因子が何である/するべきか(私たちは間違っているかもしれません)、またはどのアプローチが必要かについて本当に考えなければなりませんか?代わりに検討しますか?

そして、はい、このトピックについてはオンラインと本でかなり議論されていることも知っていますが、このモデリング分野に少し慣れていないと、少し圧倒されるように見えることがあります。

編集:

まず第一に、私のサンプルサイズは+1000人の患者であり(これは私の分野ではたくさんあります)、そのうち70-170の肯定的な応答があります(つまり、はいの応答が170であるのに対し、ケースの1つではおよそ900の応答がありません)。 。 基本的には、考えは放射線治療後の毒性を予測することです。予想されるバイナリレスポンスデータがいくつかあり(つまり、毒性があるか(1)、ないか(0))、いくつかのタイプのメトリックがあります。一部のメトリックは患者固有のものです。たとえば、年齢、使用する薬物、臓器とターゲットのボリューム、糖尿病などです。次に、ターゲットのシミュレーションされた治療フィールドに基づいたいくつかの治療固有のメトリックがあります。ほとんどの毒性は、受けた放射線(iedose)の量と非常に相関しているので、そのことから、私の分野でよく関連するいくつかの予測因子を取得できます。たとえば、私が肺腫瘍を治療する場合、ある程度の線量で心臓を打つリスクがあります。次に、心臓容積のx量がx量の投与を受ける量を計算できます。t始めに1つを選択するだけです(これは、過去の実験がもちろん試みたものであり、私が望んでいることでもあります)。これは、心臓毒性の間で実際に大きな相関がある程度を「正確に」知る必要があるためです。と体積線量(ここでも、例として、同じ戦略が適用される他の同様のメトリックがあります)。ええ、そうです、私のデータセットはこのようになっています。いくつかの異なるメトリック、およびいくぶん類似したいくつかのメトリック。t始めに1つを選択するだけです(これは、過去の実験がもちろん試みたものであり、私が望んでいることでもあります)。これは、心臓毒性の間で実際に大きな相関がある程度を「正確に」知る必要があるためです。と体積線量(ここでも、例として、同じ戦略が適用される他の同様のメトリックがあります)。ええ、そうです、私のデータセットはこのようになっています。いくつかの異なるメトリック、およびいくぶん類似したいくつかのメトリック。s私のデータセットがどのように見えるかということです。いくつかの異なるメトリック、およびいくぶん類似したいくつかのメトリック。s私のデータセットがどのように見えるかということです。いくつかの異なるメトリック、およびいくぶん類似したいくつかのメトリック。

次に、予測モデルを作成して、どの患者が何らかの毒性を受けるリスクがあるかを予測できるようにしたいと思います。そして、応答データはバイナリであるため、私の主なアイデアはもちろんロジスティック回帰モデルを使用することでした。少なくともそれは、私の分野で他の人々が行ったことです。ただし、既に行われているこれらの論文の多くを読んでいると、いくつかの問題が正しくないように見えます(少なくともF.ハレルのような特定のタイプのモデリングに関する本を読んでいるとき)。多くの場合、単変量回帰分析を使用して予測子を選択し、多変量分析で使用します(私が誤解していない場合はお勧めしません)。また、予測子の量を減らすために段階的な手法を使用することもあります。もちろん、すべてが悪いわけではありません。LASSO、PCA、相互検証、ブートストラップなどを多く使用していますが、私が見てきたものは、

機能の選択に関しては、これがおそらく私が今いるところです。モデルで使用する適切な予測子を選択/検索するにはどうすればよいですか?私はこれらの単変量/段階的アプローチを試しましたが、毎回「それが間違っているのに、なぜそうするのか?」しかし、おそらくそれは、少なくとも最終的には、「良いモデル」がどのようにして正しい方法を行ったかが「悪いモデル」が間違った方法で行われたかを示す良い方法かもしれません。ですから、おそらくやや間違った方法でそれを行うことができるでしょう。私が助けを必要としているのは、正しい方法でそれを行う方向を取得することです。

編集してすみません、それはとても長いです。

編集2: 私のデータがどのように見えるかの簡単な例:

'data.frame':   1151 obs. of  100 variables:
 $ Toxicity              : Factor w/ 2 levels "0","1": 2 1 1 1 1 1 1 1 1 1 ...
 $ Age                   : num  71.9 64 52.1 65.1 63.2 ...
 $ Diabetes              : Factor w/ 2 levels "n","y": 1 1 1 1 1 1 1 1 1 1 ...
 $ Risk.Category         : Ord.factor w/ 3 levels "LOW"<"INTERMEDIATE"<..: 1 1 1 1 2 1 1 1 1 3 ...
 $ Organ.Volume.CC       : num  136.1 56.7 66 136.6 72.8 ...
 $ Target.Volume.CC      : num  102.7 44.2 58.8 39.1 56.3 ...
 $ D1perc                : num  7961 7718 7865 7986 7890 ...
 $ D1.5CC                : num  7948 7460 7795 7983 7800 ...
 $ D1CC                  : num  7996 7614 7833 7997 7862 ...
 $ D2perc                : num  7854 7570 7810 7944 7806 ...
 $ D2.5CC                : num  7873 7174 7729 7952 7604 ...
 $ D2CC                  : num  7915 7313 7757 7969 7715 ...
 $ D3perc                : num  7737 7379 7758 7884 7671 ...
 $ D3.5CC                : num  7787 6765 7613 7913 7325 ...
 $ D3CC                  : num  7827 6953 7675 7934 7480 ...
 $ D4perc                : num  7595 7218 7715 7798 7500 ...
 $ D5perc                : num  7428 7030 7638 7676 7257 ...
 $ DMEAN                 : num  1473 1372 1580 1383 1192 ...
 $ V2000CGY              : num  24.8 23.7 25.9 22.3 19.3 ...
 $ V2000CGY_CC           : num  33.7 13.4 17.1 30.4 14 ...
 $ V2500CGY              : num  22.5 21.5 24 20.6 17.5 ...
 $ V2500CGY_CC           : num  30.7 12.2 15.9 28.2 12.7 ...
 $ V3000CGY              : num  20.6 19.6 22.4 19.1 15.9 ...
 $ V3000CGY_CC           : num  28.1 11.1 14.8 26.2 11.6 ...
 $ V3500CGY              : num  18.9 17.8 20.8 17.8 14.6 ...
 $ V3500CGY_CC           : num  25.7 10.1 13.7 24.3 10.6 ...
 $ V3900CGY              : num  17.5 16.5 19.6 16.7 13.6 ...
 $ V3900CGY_CC           : num  23.76 9.36 12.96 22.85 9.91 ...
 $ V4500CGY              : num  15.5 14.4 17.8 15.2 12.2 ...
 $ V4500CGY_CC           : num  21.12 8.18 11.76 20.82 8.88 ...
 $ V5000CGY              : num  13.9 12.8 16.4 14 11 ...
 $ V5000CGY_CC           : num  18.91 7.25 10.79 19.09 8.03 ...
 $ V5500CGY              : num  12.23 11.14 14.84 12.69 9.85 ...
 $ V5500CGY_CC           : num  16.65 6.31 9.79 17.33 7.17 ...
 $ V6000CGY              : num  10.56 9.4 13.19 11.34 8.68 ...
 $ V6000CGY_CC           : num  14.37 5.33 8.7 15.49 6.32 ...
 $ V6500CGY              : num  8.79 7.32 11.35 9.89 7.44 ...
 $ V6500CGY_CC           : num  11.96 4.15 7.49 13.51 5.42 ...
 $ V7000CGY              : num  6.76 5.07 9.25 8.27 5.86 ...
 $ V7000CGY_CC           : num  9.21 2.87 6.1 11.3 4.26 ...
 $ V7500CGY              : num  4.61 2.37 6.22 6.13 4 ...
 $ V7500CGY_CC           : num  6.27 1.34 4.11 8.38 2.91 ...
 $ V8000CGY              : num  0.7114 0.1521 0.0348 0.6731 0.1527 ...
 $ V8000CGY_CC           : num  0.9682 0.0863 0.023 0.9194 0.1112 ...
 $ V8200CGY              : num  0.087 0 0 0 0 ...
 $ V8200CGY_CC           : num  0.118 0 0 0 0 ...
 $ V8500CGY              : num  0 0 0 0 0 0 0 0 0 0 ...
 $ V8500CGY_CC           : num  0 0 0 0 0 0 0 0 0 0 ...
 $ n_0.02                : num  7443 7240 7371 7467 7350 ...
 $ n_0.03                : num  7196 6976 7168 7253 7112 ...
 $ n_0.04                : num  6977 6747 6983 7055 6895 ...
 $ n_0.05                : num  6777 6542 6811 6871 6693 ...
 $ n_0.06                : num  6592 6354 6649 6696 6503 ...
 $ n_0.07                : num  6419 6180 6496 6531 6325 ...
 $ n_0.08                : num  6255 6016 6350 6374 6155 ...
 $ n_0.09                : num  6100 5863 6211 6224 5994 ...
 $ n_0.1                 : num  5953 5717 6078 6080 5840 ...
 $ n_0.11                : num  5813 5579 5950 5942 5692 ...
 $ n_0.12                : num  5679 5447 5828 5809 5551 ...
 $ n_0.13                : num  5551 5321 5709 5681 5416 ...
 $ n_0.14                : num  5428 5201 5595 5558 5285 ...
 $ n_0.15                : num  5310 5086 5485 5439 5160 ...
 $ n_0.16                : num  5197 4975 5378 5324 5039 ...
 $ n_0.17                : num  5088 4868 5275 5213 4923 ...
 $ n_0.18                : num  4982 4765 5176 5106 4811 ...
 $ n_0.19                : num  4881 4666 5079 5002 4702 ...
 $ n_0.2                 : num  4783 4571 4985 4901 4597 ...
 $ n_0.21                : num  4688 4478 4894 4803 4496 ...
 $ n_0.22                : num  4596 4389 4806 4708 4398 ...
 $ n_0.23                : num  4507 4302 4720 4616 4303 ...
 $ n_0.24                : num  4421 4219 4636 4527 4210 ...
 $ n_0.25                : num  4337 4138 4555 4440 4121 ...
 $ n_0.26                : num  4256 4059 4476 4355 4035 ...
 $ n_0.27                : num  4178 3983 4398 4273 3951 ...
 $ n_0.28                : num  4102 3909 4323 4193 3869 ...
 $ n_0.29                : num  4027 3837 4250 4115 3790 ...
 $ n_0.3                 : num  3955 3767 4179 4039 3713 ...
 $ n_0.31                : num  3885 3699 4109 3966 3639 ...
 $ n_0.32                : num  3817 3633 4041 3894 3566 ...
 $ n_0.33                : num  3751 3569 3975 3824 3496 ...
 $ n_0.34                : num  3686 3506 3911 3755 3427 ...
 $ n_0.35                : num  3623 3445 3847 3689 3361 ...
 $ n_0.36                : num  3562 3386 3786 3624 3296 ...
 $ n_0.37                : num  3502 3328 3725 3560 3233 ...
 $ n_0.38                : num  3444 3272 3666 3498 3171 ...
 $ n_0.39                : num  3387 3217 3609 3438 3111 ...
 $ n_0.4                 : num  3332 3163 3553 3379 3053 ...
 $ n_0.41                : num  3278 3111 3498 3321 2996 ...
 $ n_0.42                : num  3225 3060 3444 3265 2941 ...
 $ n_0.43                : num  3173 3010 3391 3210 2887 ...
 $ n_0.44                : num  3123 2961 3339 3156 2834 ...
 $ n_0.45                : num  3074 2914 3289 3103 2783 ...
 $ n_0.46                : num  3026 2867 3239 3052 2733 ...
 $ n_0.47                : num  2979 2822 3191 3002 2684 ...
 $ n_0.48                : num  2933 2778 3144 2953 2637 ...
 $ n_0.49                : num  2889 2734 3097 2905 2590 ...

そして、私がtable(data$Toxicity)出力を実行すると:

> table(data$Toxicity)
   0    1 
1088   63 

繰り返しになりますが、これは1種類の毒性です。他にも3人います。


1
何をするつもりですか?予測または推論、または他に何か?
ステファンコラサ

これを特徴選択と呼びます。回帰を使用する必要がある場合、カテゴリカル機能は一元化されていますが、ツリーメソッドの場合はそのまま使用できます。最も予測的なn方向の相互作用または関連の用語を把握して、それらを使用することもできます。
smci

「私は本当に座って、人と話をして、トップnの予測因子について本当に考えたり、理由を考えたりする必要があるだけなのでしょうか。」地獄いいえ、直感が出発点ですが、それが特徴選択方法がある理由です。多くの実験から得られた結果は直感を打ち破ります
smci

1
@smciが不明確で申し訳ありません。私の分野(放射線腫瘍学)では、治療計画を作成します。これは、基本的に放射線/線量がターゲットの周りにどのように分布しているかを3Dで表現したものです。残念ながら、これは少なくとも少量の健康な組織にぶつからない限り実行できません。つまり、この3Dマップから、いわば、たとえば、ボリュームがx線量/線量をどれだけ受けるかについての情報を得ることができます。しかし、ご想像のとおり、「この構造物の体積の1%が受ける放射線の量」、そして2%、3%のようなステップで「尋ねる」ことができます。原則として、値は多少似ています。
Denver Dang

1
@smci、予測がOPの目標である場合、相関は関係ありません。変数間の高い相関関係は、モデルに含まれる変数を解釈しようとする場合にのみ大きな問題になります。
StatsStudent

回答:


4

プッシュ機能の選択が根拠のないものであるという回答の一部。

投げ縄またはより良い弾性ネットは特徴選択を行うが、あなたはかなりの「選択」機能セットのボラティリティーに失望されます上記の尖ったアウトのようになります。私の本で強調しているように、あなたの状況での唯一の真の希望は、データの削減、つまり教師なし学習であると信じています。データ削減により、解釈性が向上し、特に安定性が向上します。まばらな主成分、またはクラスター上の通常の主成分が続く変数クラスタリングを強くお勧めします。

データセット内の情報の内容は、特徴選択アルゴリズムを信頼するには低すぎます。


まず初めに、コメントしていただきありがとうございます。第二に、私が間違っていない場合、教師なし学習は、応答変数の特定の応答(つまり1または0)を利用しない(または持たない)場合であり、コンピューターに「推測」させる"ディストリビューションの分割方法。しかし、ロジスティック回帰(および線形)は私の知る限り監視されていますか?だからあなたはその方法論を放棄することをお勧めですか?一方ではアイデアが好きですが、他方では、ロジスティック回帰とプロビット回帰は、私の分野のほぼすべてのモデリング論文(私のデータと同様)がこれまでに行ってきた方法です。
デンバーダン

それで、私はここで手足を出しているのではないでしょうか、それとも、他のすべての人が永遠にそれを「間違った」ことをしていると仮定しなければなりませんか?
Denver Dang

3
全員ではないが、ほとんどの人は間違いなく間違いを犯している。これは、回帰モデリング戦略を作成する主な動機でした。データ削減の目標は、ロジスティック回帰で求められる監視付き学習の量を減らすことです。たとえば、100個の候補特徴を効果的に5つのクラスタースコアに減らし、5つのパラメーター+切片のみを推定する必要がある場合があります。
フランクハレル

2
この場合の変動係数モデルについてどう思いますか(私の回答に追加したように)?
ベンボルカー

@FrankHarrellかなり面白いですね。しかし質問して申し訳ありませんが、あなたが示唆しているように見えるので、教師付き学習はなぜ悪い、または少なくともいくらか悪いのですか?
Denver Dang

8

「たまに少し圧倒されるように見える」の+1。本当にやりたいかどうか(ハレルが明確に述べているように、第4章の最後のセクションを参照)

  • クロス検証を使用してペナルティの度合いを選択する必要があります。これにより、最先端の高次元推論方法(例、Dezeure et al 2015 ; I これらのアプローチ試していませんが、賢明なようです...)

  • 探索的分析:楽しみ、透明性、正直性を持ち、p値を引用しないでください。

これまでに説明した特定のユースケース(一連の予測子は基本的に、心臓のさまざまな部分によって受け取られた線量の累積分布を表します)では、変動係数モデル(調査が少し難しい)を調べることをお勧めします。、これは基本的にCDFの効果のための滑らかな曲線に適合します(これらはRのmgcvパッケージで実装できます)。


私のサンプルサイズは+1000で、どの応答変数(4を持っている)に応じて、+ 1000の75〜170の正の(または見方によっては負の)応答があります。それが何かを容易にするかどうかはわかりません。つまり、サンプルセットはかなり大きいので(少なくとも私の分野では)、いくつかのステップを省略できます。
Denver Dang

相互検証は、推論を行う機能を破壊しますか?多分。相互検証の前にブートストラップして、予測の信頼区間を取得できると思います。これは、1000回の観測で実現可能です。
JTH

選択後の推論は本当に難しいです。データセット全体を使用してハイパーパラメータ(ペナルティの強さなど)を調整する場合、同じ状況になります。ブートストラップ+ CVアプローチの概要を説明する必要があります。うまくいくと私が信じる前に、私はそれを言えるでしょう...
Ben Bolker

0

多くの異なるアプローチがあります。私がお勧めするのは、次の順序でいくつかの単純なものを試すことです:


1
これら3つの方法はすべて不安定であることがわかります。
フランクハレル

それは、unstableの定義方法に依存します。実際には、通常、k-foldやleave-one-outなどのある種の相互検証を使用し、全体的なパフォーマンス+分散(別名1SEメソッド)に基づいて判断する機能を選択します。
resnet

ブートストラップと相互検証では、モデルを生成するプロセスの一部の予測インデックスのみが検証されます。これにより、そのプロセスを使用して選択されたモデルのそのインデックスの適切な推定が得られますが、一度開発されたモデル、つまりモデル全体の構造には快適さがありません。ボラティリティを確認するには、リサンプル全体で選択された構造(つまり、選択された機能)を見てください。
フランクハレル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.