如何在R中用for循环批量计算模拟相关系数并存储?
解决循环模拟并保存相关系数的问题
原代码的问题
- 每次循环都会重新创建
coeff_list,导致之前的模拟结果被覆盖,无法累积10000次的结果 cor_coef_est <- list(cor_coeff$estimate == i)中的==是比较运算符,逻辑错误,应该直接提取相关系数值,而非做相等判断- 未预先分配存储空间,循环运行效率较低
修正后的代码
首先确保加载MASS包(mvrnorm函数属于该包),然后预先初始化结果数据框,在循环中逐步填充数据:
# 加载所需包 library(MASS) # 预先初始化结果数据框,存储10000次模拟的结果 results_df <- data.frame( sim_num = 1:10000, cor_estimate = numeric(10000), p_value = numeric(10000) ) # 执行10000次模拟循环 for (i in 1:10000) { # 生成模拟样本 bnsamp <- data.frame(mvrnorm(n = 48, mu = mean_combined, Sigma = sigma)) colnames(bnsamp) <- c("Amyg_Avg", "Sys_Jus") # 计算皮尔逊相关系数及p值 cor_coeff <- cor.test(x = bnsamp$Amyg_Avg, y = bnsamp$Sys_Jus, method = "pearson", alternative = "two.sided") # 将结果存入数据框对应行 results_df$cor_estimate[i] <- cor_coeff$estimate results_df$p_value[i] <- cor_coeff$p.value # 打印当前模拟的结果(可选,若不需要实时打印可注释掉) cat(paste("模拟", i, ":相关系数 =", round(cor_coeff$estimate, 4), ",p值 =", round(cor_coeff$p.value, 4), "\n")) } # 查看最终结果数据框的前几行 head(results_df)
代码说明
- 预先初始化数据框:提前创建包含10000行的结果数据框,相比循环中动态添加行,效率更高
- 正确提取结果:直接将
cor.test返回的estimate(相关系数)和p.value(p值)赋值给数据框的对应位置,避免逻辑错误 - 实时打印结果:通过
cat函数每次循环输出当前模拟的结果,满足实时查看的需求 - 后续绘图:最终的
results_df可以直接用于绘制相关系数的分布,比如用hist(results_df$cor_estimate)绘制直方图
内容的提问来源于stack exchange,提问作者talqatari
相关产品推荐
相关产品推荐

