R语言参数函数迭代异常:无法生成50组MSE值求助
迭代失效问题排查与修正
你的代码能运行但无法生成50组MSE值,核心问题是未在循环中收集每次迭代的结果,仅保留了最后一次循环的MSE,同时还有几处细节错误,以下是问题分析和修正方案:
核心问题与细节错误
- 迭代结果未收集:循环内每次计算的
MSE都会被下一次循环覆盖,最终仅返回最后一次的结果 - 噪声参数错误:
rnorm的sd参数需要传入标准差,你写的sig^2是方差,会导致噪声强度异常 - 真实系数匹配错误:生成数据的模型是
yi=1+3*x1i-1.5*x2i*x3i+ei,但你回归的是yi~x1i+x2i+x3i,真实的x2i、x3i单独项系数应为0,而非你设置的-1.5和2 - 变量作用域问题:函数外的
write.table无法访问函数内部的MSE变量
修正后的代码
arguments <- function(r, n, sig) { # 初始化空数据框,用于存储所有迭代的MSE结果 all_mse <- data.frame(MSE0 = numeric(), MSE1 = numeric(), MSE2 = numeric(), MSE3 = numeric()) for (i in 1:r) { # 生成自变量与噪声 x1i <- runif(n) x2i <- runif(n) x3i <- runif(n) # 修正:sd传入标准差sig,而非方差sig^2 ei <- rnorm(n, mean = 0, sd = sig) # 按给定模型生成因变量 yi <- 1 + 3*x1i - 1.5*x2i*x3i + ei data <- data.frame(x1i, x2i, x3i, yi) # 执行回归并提取系数 regression <- lm(yi ~ x1i + x2i + x3i, data = data) my_estimates <- regression$coefficients # 匹配回归模型的真实系数:无单独x2i、x3i项,对应系数为0 coefficients <- c(1, 3, 0, 0) names(coefficients) <- names(my_estimates) # 计算当前迭代的MSE MSE <- (my_estimates - coefficients)^2 names(MSE) <- c('MSE0', 'MSE1', 'MSE2', 'MSE3') # 将当前MSE添加到结果集 all_mse <- rbind(all_mse, as.data.frame(t(MSE))) } return(all_mse) } # 运行函数生成50组MSE mse_results <- arguments(50, 50, 4) # 保存结果到文件(保留列名方便查看) write.table(mse_results, file="MSE.txt", sep=" ", row.names = FALSE, col.names = TRUE, quote=FALSE)
修正说明
- 结果收集:通过初始化
all_mse数据框,每次循环将当前MSE转置为行并添加到结果集中,最终返回所有迭代的MSE - 噪声参数修正:将
rnorm的sd参数改为sig,符合标准差的参数要求 - 真实系数修正:根据生成数据的模型,匹配回归模型的真实系数,确保MSE计算准确
- 作用域修正:将函数返回的结果赋值给
mse_results,再执行保存操作,避免变量访问问题
内容的提问来源于stack exchange,提问作者Nina
相关产品推荐
相关产品推荐

