基于N个合成数据集的LASSO回归:区分结构与非结构回归候选变量
解决方法
1. 提取真实结构变量列表
原始CSV的首行包含二进制标识(1代表该X变量是真实结构变量,0则不是),我们需要从每个数据集中提取这些信息,生成真实结构变量的名称列表:
# 遍历所有原始数据集,提取首行的结构变量标识 true_vars_list <- lapply(datasets, function(dataset_i) { # 首行第2到31列对应X1-X30的标识,转成数值型 true_flags <- as.numeric(dataset_i[1, 2:31]) # 筛选出标识为1的变量名称 names(true_flags)[true_flags == 1] })
2. 平行列表的匹配验证
现在true_vars_list和你已有的Variables.glmnet.LASSO.Selected就是完全平行的列表——两个列表的第N个元素,对应同一个数据集的真实结构变量和LASSO选中变量。
你可以直接通过索引对比,比如查看第一个数据集的结果:
# 第一个数据集的真实结构变量 true_vars_list[[1]] # 第一个数据集LASSO选中的变量 Variables.glmnet.LASSO.Selected[[1]]
3. 批量计算变量选择性能指标(可选)
如果需要量化验证效果,可以用以下代码计算每个数据集的TP/FP/FN/TN,以及精度、召回率、F1值:
# 定义指标计算函数 get_selection_stats <- function(selected_vars, true_vars) { all_candidates <- paste0("X", 1:30) tp <- length(intersect(selected_vars, true_vars)) fp <- length(setdiff(selected_vars, true_vars)) fn <- length(setdiff(true_vars, selected_vars)) tn <- length(setdiff(all_candidates, union(selected_vars, true_vars))) precision <- ifelse(tp + fp == 0, 0, tp / (tp + fp)) recall <- ifelse(tp + fn == 0, 0, tp / (tp + fn)) f1_score <- ifelse(precision + recall == 0, 0, 2 * precision * recall / (precision + recall)) list( tp = tp, fp = fp, fn = fn, tn = tn, precision = round(precision, 3), recall = round(recall, 3), f1 = round(f1_score, 3) ) } # 批量计算所有数据集的指标 performance_metrics <- mapply(get_selection_stats, selected_vars = Variables.glmnet.LASSO.Selected, true_vars = true_vars_list, SIMPLIFY = FALSE) # 查看前3个数据集的性能 head(performance_metrics, 3)
注意事项
- 不要删除原始的
datasets列表:之前的代码中dfs <- lapply(datasets, function(i) {i[-1:-3, ]})是为建模剔除了前3行,但提取真实变量需要用到原始数据集的首行,所以要保留datasets对象。 - 顺序一致性:因为之前已经对
paths_list做了排序,所以true_vars_list和Variables.glmnet.LASSO.Selected的顺序完全对应,无需额外调整。
内容的提问来源于stack exchange,提问作者Marlen
相关产品推荐
相关产品推荐

