kーfold CVのやり方はこちら。
また、結果にどのくらいの安定性があるか、計算のたびに異なる乱数を与え、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