井出草平の研究ノート

ランダム化された安定性選択(Randomized Stability Selection)[R]

安定性選択の方法の一つ。

ides.hatenablog.com

ランダム化された安定性選択は、変数選択プロセスにランダム性を導入する方法であり、変数選択の安定性を向上させることを目的としている。この方法では、データを繰り返しサブサンプリングし、Lasso回帰を適用する。特徴として、各予測子に適用されるペナルティをランダムに変動させることがある。 予測子間の相関とは、ある変数が他の変数とどれだけ関係しているかを示す。例えば、体重と身長は一般的に相関がある。予測モデルを作成する際、複数の変数が互いに相関している場合、それらの変数の影響を正確に測定するのが難しくなる。ランダム化しない安定性選択では、相関のある予測子が一緒に選ばれないことがある。これは、相関のある予測子同士が互いに競合し、一方が他方を押しのけて選ばれないためである。 一方、ランダム化された安定性選択では、変数選択にさらなるランダム性を導入することで、これらの相関の影響を緩和する。具体的には、モデルが複数回繰り返し実行される際に、各予測子にかかるペナルティがランダムに変動する。このプロセスにより、相関のある予測子が除外されずに一緒に選ばれる可能性が高まり、予測子の相関関係をよりよく管理できる。これにより、重要な予測子が見逃されるリスクを減らすことができる。

パッケージのインストール

monaLisaパッケージをインストールする。CRANにはないので、下記のBiocManagerのコードを走らせてインストールする。

if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager")
BiocManager::install("monaLisa")

データの準備

library(haven)
library(tidyr)
auto_data <- haven::read_dta("http://www.stata-press.com/data/r9/auto.dta")
auto_data <- auto_data %>% drop_na()  # 全カラムに対してNAがない行を抽出
auto_data$foreign <- as.integer(auto_data$foreign)

price_data <- auto_data$price
X_data <- auto_data[, c("mpg", "rep78", "headroom", "trunk", "weight", "length",
                        "turn", "displacement", "gear_ratio", "foreign")]
X_data <- as.matrix(X_data)  

ランダム化された安定性選択の実行

ランダム化されていない安定性選択と同じ条件で計算するために、ブートストラップの回数サンプリングタイプの指定、選択確率の分布の仮定、カットオフ値を同じにしている。

# 必要なライブラリの読み込み
library(monaLisa)
library(stabs)

# 乱数シードの設定
set.seed(123)

# Randomized Lasso Stability Selectionの実行
result <- randLassoStabSel(
  x = X_data,
  y = price_data,
  weakness = 0.8,  # デフォルト値
  cutoff = 0.75,    # デフォルト値
  PFER = 1,        # デフォルト値
  mc.cores = 1,    # シングルコアで実行
  B = 100,                      # サブサンプル数
  sampling.type = "SS",         # サンプリングタイプ
  assumption = "r-concave"      # r-concave
)

# 結果の表示
print(result)

# 選択された変数とその選択確率の表示
selected_vars <- colnames(result)[result$selected]
selection_probabilities <- result$selProb[result$selected]

selected_df <- data.frame(
  Variable = selected_vars,
  SelectionProbability = selection_probabilities
)

print(selected_df)

選ばれた変数とその選択確率は以下のもの。

      Variable SelectionProbability
1       weight                0.750
2 displacement                0.765
3      foreign                0.920

ランダム化しない、通常の安定性安定性選択とほぼ同じ結果が得られた。

plotSelectionProb(result)

plotStabilityPaths(result)