在R中统计特征选择方法正确选中真实模型的数量
在R中统计变量选择方法的正确选中次数
核心需求回顾
我们需要从BM1_models数据框中,针对每个合成数据集(命名格式n1-n2-n3-n4),判断变量选择方法选中的变量是否恰好等于真实底层模型的变量集合(即当数据集的n2=k时,必须恰好是X1到Xk),最终统计正确选中的次数。
解决方案步骤
以下提供两种实现方式,分别基于Base R和Tidyverse生态,你可以根据习惯选择:
方式1:Base R实现
# 1. 解析数据集名称,提取n2(真实变量数k) BM1_models$n2 <- sapply(strsplit(BM1_models$dataset_name, "-"), function(x) as.integer(x[2])) # 2. 定义函数:判断选中变量是否完全匹配真实集合 is_correct <- function(selected_vars_str, k) { # 将选中变量字符串拆分为向量(假设选中变量用逗号/空格分隔,根据实际格式调整分隔符) selected_vars <- unlist(strsplit(selected_vars_str, ",\\s*|\\s+")) # 生成真实变量集合 true_vars <- paste0("X", 1:k) # 比较:长度相同 + 元素完全匹配(排序后比较,忽略顺序差异) length(selected_vars) == length(true_vars) && all(sort(selected_vars) == sort(true_vars)) } # 3. 标记每条记录是否正确 BM1_models$is_correct <- mapply(is_correct, BM1_models$selected_vars, BM1_models$n2) # 4. 统计总正确次数 total_correct <- sum(BM1_models$is_correct) cat("总正确选中次数:", total_correct, "\n") # (可选)按参数分组统计(比如按n1共线性程度、n3误差方差) correct_by_n1 <- tapply(BM1_models$is_correct, BM1_models$n1, sum) correct_by_n3 <- tapply(BM1_models$is_correct, BM1_models$n3, sum)
方式2:Tidyverse实现(更简洁的管道式操作)
library(tidyverse) BM1_models_processed <- BM1_models %>% # 拆分数据集名称,提取各参数 separate(dataset_name, into = c("n1", "n2", "n3", "n4"), sep = "-", convert = TRUE) %>% # 定义判断逻辑 mutate( # 生成真实变量集合 true_vars = map(n2, ~paste0("X", 1:.x)), # 将选中变量拆分为向量 selected_vars_list = str_split(selected_vars, ",\\s*|\\s+"), # 判断是否正确:长度一致 + 元素完全匹配(排序后) is_correct = map2_lgl(selected_vars_list, true_vars, function(s, t) { length(s) == length(t) && all(sort(s) == sort(t)) }) ) # 统计总正确次数 total_correct <- BM1_models_processed %>% pull(is_correct) %>% sum() cat("总正确选中次数:", total_correct, "\n") # (可选)按参数分组统计 correct_summary <- BM1_models_processed %>% group_by(n1, n3) %>% summarise(correct_count = sum(is_correct), .groups = "drop")
关键注意事项
- 分隔符调整:如果你的
selected_vars列的变量分隔符不是逗号/空格,请修改strsplit或str_split中的分隔符(比如如果是分号,就改成";\\s*")。 - 变量名格式:确保真实变量的命名确实是
X1、X2...Xk,如果格式不同(比如Var1),请修改paste0("X", 1:k)为对应格式。 - 多种方法的统计:如果
BM1_models包含多种变量选择方法的结果(即存在method列),只需在分组统计时加入method即可,比如group_by(method, n1, n3)。
内容的提问来源于stack exchange,提问作者Marlen
相关产品推荐
相关产品推荐

