R语言模拟数据集进行模型选择的问题求助
排查R向后选择模拟代码的错误
我帮你仔细看了这段模拟代码,问题主要出在数据集生成逻辑和缺少循环遍历这两个核心点上,导致你只处理了第一个数据集,而且统计逻辑完全没跑起来。下面一步步给你拆解错误和修正方案:
一、代码里的核心错误
- 变量未定义:你代码里的
beta0、beta1、beta2、beta3没有赋值,运行时会直接报错,这是基础疏漏。 - 数据集结构错误:
replicate(100, rnorm(n=100))生成的是100×100的矩阵(每行是样本,每列是一个数据集),但你直接把Y赋值成矩阵后,data.full$y和data.full$x都是矩阵,后面调用data.full$y.1和data.full$x.1只取了第一列(第一个数据集),完全没用到剩下的99个数据集。 - 缺少循环遍历逻辑:你没有写循环来逐个处理100个数据集,相当于只跑了一次单数据集测试,自然得不到100次模拟的统计结果。
二、修正后的完整代码
# 1. 定义真实模型的参数(3次多项式) beta0 <- 1 beta1 <- 2 beta2 <- -1 beta3 <- 0.5 n_samples <- 100 # 每个数据集的样本量 n_sim <- 100 # 模拟总次数 # 2. 生成100个数据集的x和误差项(每行=样本,每列=一个数据集) x_matrix <- replicate(n_sim, rnorm(n_samples)) epsilon_matrix <- replicate(n_sim, rnorm(n_samples)) # 3. 计算每个数据集的y(严格遵循3次多项式真实模型) y_matrix <- beta0 + beta1 * x_matrix + beta2 * x_matrix^2 + beta3 * x_matrix^3 + epsilon_matrix # 4. 初始化结果存储向量,记录每个指标选中的模型阶数 cp_selected <- integer(n_sim) bic_selected <- integer(n_sim) adjr2_selected <- integer(n_sim) # 5. 循环遍历每个数据集,执行向后选择 for (i in 1:n_sim) { # 提取第i个数据集的x和y current_x <- x_matrix[, i] current_y <- y_matrix[, i] # 构建当前数据集的数据框 data_i <- data.frame(y = current_y, x = current_x) # 向后选择:最多考虑10次多项式 mod_bwd <- regsubsets(y ~ poly(x, 10, raw = TRUE), data = data_i, nvmax = 10, method = "backward") bwd_summary <- summary(mod_bwd) # 记录每个指标选中的阶数 cp_selected[i] <- which.min(bwd_summary$cp) bic_selected[i] <- which.min(bwd_summary$bic) adjr2_selected[i] <- which.max(bwd_summary$adjr2) } # 6. 统计选中正确模型(3次多项式)的次数 cat("Cp选中3次多项式的次数:", sum(cp_selected == 3), "\n") cat("BIC选中3次多项式的次数:", sum(bic_selected == 3), "\n") cat("调整R²选中3次多项式的次数:", sum(adjr2_selected == 3), "\n")
三、代码改动说明
- 参数补全:补上了真实模型的beta参数,确保生成的y严格符合3次多项式的设定。
- 数据集结构优化:用矩阵统一存储所有模拟数据集,每列对应一个数据集,方便循环提取。
- 循环逻辑添加:用
for循环遍历100个数据集,逐个执行向后选择并记录结果。 - 结果统计完善:最后统计三个指标选中真实阶数(3)的次数,这才是你需要的模拟结论。
四、之前结果不符合预期的原因
你之前的代码只处理了第一个数据集(y.1和x.1),得到的是单次测试的结果,而非100次模拟的统计值。再加上未定义beta参数,当时的Y计算本身就是错误的,所以得到的Cp选7次、BIC选4次等结果完全不具备参考性。
内容的提问来源于stack exchange,提问作者Shafa Haider
相关产品推荐
相关产品推荐

