如何在字典遍历循环中嵌套for i in range()实现多次Bootstrapping?
多ROI Bootstrap抽样仅执行一次的问题修复
原始正常的单ROI代码
针对单个ROI执行599次Bootstrap抽样并计算均值的代码,运行正常:
boot_i = [] for i in range(599): boot = np.random.choice(data_rois["interoception"], size=N) boot = np.mean(boot) boot_i.append(boot)
有问题的多ROI嵌套循环代码
意图对多个ROI批量执行Bootstrap抽样,但内层循环的599次抽样未生效,仅执行了一次:
rois = ["interoception", "extero", ...] # 包含多个ROI的长列表 boot_rois = {} for roi in rois: for i in range(599): boot = np.random.choice(data_rois[roi], size=N) boot = np.mean(boot) boot_rois[roi] = roi
问题原因&修复方案
这段代码的核心错误是:内层循环中没有收集每次抽样的结果,反而每次都把ROI名称赋值给boot_rois[roi],不仅没有保存抽样均值,还会反复覆盖。
要实现599次抽样,需要给每个ROI初始化一个空列表,把每次计算的均值添加到列表中,最后将整个列表存入字典:
修复后的代码:
rois = ["interoception", "extero", ...] # 包含多个ROI的长列表 boot_rois = {} for roi in rois: # 初始化当前ROI的抽样结果列表 roi_boot_means = [] for i in range(599): boot_sample = np.random.choice(data_rois[roi], size=N) sample_mean = np.mean(boot_sample) roi_boot_means.append(sample_mean) # 存储当前ROI的所有抽样均值 boot_rois[roi] = roi_boot_means
更新需求:计算599次Bootstrap抽样的标准差
后续需求调整为:基于599次Bootstrap抽样,计算每个ROI的最终标准差。用户提供的修改后代码运行正常,但可以优化逻辑,让代码更清晰易读:
用户原更新代码
boot_rois = {} for roi in rois: last_boot = None for i in range(599): boot = np.random.choice(data_rois[roi], size=N) boot = np.std(boot) if(last_boot is not None): boot = np.std([boot,last_boot]) boot_rois[roi] = boot last_boot = boot_rois[roi]
优化后的代码
先收集599次抽样的标准差,再统一计算整体标准差,逻辑更直观:
boot_rois = {} for roi in rois: roi_std_samples = [] for i in range(599): # 抽取Bootstrap样本并计算该样本的标准差 boot_sample = np.random.choice(data_rois[roi], size=N) sample_std = np.std(boot_sample) roi_std_samples.append(sample_std) # 计算599次抽样标准差的整体标准差 boot_rois[roi] = np.std(roi_std_samples)
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

