井出草平の研究ノート

kーfoldクロスバリデーションを用いたLassoにおける変数選択の安定性[R]

kーfold CVのやり方はこちら。

ides.hatenablog.com

また、結果にどのくらいの安定性があるか、計算のたびに異なる乱数を与え、kーfold CVのLassoの計算を100回反復した。1) 独立変数側で選ばれた変数の回数、2)選ばれた時の推定値の平均とその標準偏差を計算した。

kーfolds cvを行った場合

# 乱数シードの設定
set.seed(1234)
seeds <- sample(1:10000, 50)

# 結果を保存するリストを初期化
coefficients_list <- list()

# 50回の推定を実行
for (i in 1:50) {
  set.seed(seeds[i])
  
  cv_fit <- cv.glmnet(X, price, alpha=1, nfolds=5)
  best_lambda <- cv_fit$lambda.min
  fit <- glmnet(X, price, alpha=1, lambda=best_lambda)
  
  coefficients_list[[i]] <- coef(fit)[-1, 1]  # インターセプトを除く
}

# 結果1: 各変数が選ばれた回数の集計
selected_counts <- sapply(variables, function(var) {
  sum(sapply(coefficients_list, function(coefs) !is.na(coefs[var]) && coefs[var] != 0))
})

# 結果2: 各変数の推定値の平均と標準偏差の計算
coef_stats <- sapply(variables, function(var) {
  coefs <- unlist(lapply(coefficients_list, function(coefs) if (!is.na(coefs[var]) && coefs[var] != 0) coefs[var] else NA))
  coefs <- coefs[!is.na(coefs)]  # NAを除外
  c(mean = mean(coefs), sd = sd(coefs))
})

# データフレームにまとめる
selected_counts_df_cv <- data.frame(Variable = variables, SelectedCount = selected_counts)
coef_stats_df_cv <- data.frame(Variable = variables, Mean = coef_stats["mean",], SD = coef_stats["sd",])

変数が選ばれた回数

selected_counts_df_cv <- subset(selected_counts_df_cv, select = SelectedCount)
print(selected_counts_df_cv)

結果。

             SelectedCount
mpg                      8
rep78                   50
headroom                50
trunk                    9
weight                  50
length                  15
turn                    34
displacement            50
gear_ratio              23
foreign                 50

各変数の推定値の平均と標準偏

coef_stats_df_cv <- subset(coef_stats_df_cv, select = c(Mean, SD))
print(coef_stats_df_cv)

結果。

                    Mean          SD
mpg           -10.703146   7.1989294
rep78         129.865926  20.5338937
headroom     -448.957671  76.0808075
trunk          34.298050  23.0755634
weight          2.270108   0.7651653
length        -33.860179  22.7094090
turn          -61.142838  31.0153931
displacement   13.167243   0.5506631
gear_ratio   -167.367485  92.1415186
foreign      2953.574876 184.7143869