如何用Python对双数据序列函数计算值进行Bootstrap?修正错误代码
Bootstrap置信区间代码的问题及修复
存在的问题
- 计算逻辑偏离:ChatGPT提供的
calculate_ratio函数篡改了你原本的分母计算逻辑。你最初的分母是data1的平方均值减去均值的平方(即np.mean(data1**2) - (np.mean(data1))**2),但ChatGPT错误地替换为mean_squared_data1 - squared_mean_data2,误用了data2的均值平方,完全偏离你的原始计算逻辑。 - 抽样方式错误:原始数据中
data1和data2是配对观测(对应位置元素为一组样本),但ChatGPT的代码对两组数据独立抽样,破坏了数据的配对关系,导致Bootstrap结果失去统计意义。
修复后的代码
import numpy as np # 还原原始的ratio计算逻辑 def calculate_ratio(data1, data2): mean_product = np.mean(data1 * data2) mean_data1 = np.mean(data1) mean_data2 = np.mean(data2) mean_product_of_means = mean_data1 * mean_data2 numerator = mean_product - mean_product_of_means mean_squared_data1 = np.mean(data1 ** 2) squared_mean_data1 = mean_data1 ** 2 denominator = mean_squared_data1 - squared_mean_data1 # 增加除零保护,避免运行报错 if denominator == 0: return np.nan ratio = numerator / denominator return ratio # 修改为成对Bootstrap抽样,保留数据配对关系 def bootstrap_ratio(data1, data2, func, num_iterations): results = [] n = len(data1) # 先检查两组数据长度是否一致 if len(data2) != n: raise ValueError("data1和data2长度必须一致") for _ in range(num_iterations): # 使用同一组索引抽取配对样本 indices = np.random.choice(n, n, replace=True) data1_bootstrap = data1[indices] data2_bootstrap = data2[indices] result = func(data1_bootstrap, data2_bootstrap) # 跳过无效的nan结果 if not np.isnan(result): results.append(result) return results # 测试数据 data1 = np.array([1, 2, 3, 4, 5]) data2 = np.array([5, 4, 3, 2, 1]) num_iterations = 1000 bootstrap_results = bootstrap_ratio(data1, data2, calculate_ratio, num_iterations) # 计算95%置信区间 confidence_interval = np.percentile(bootstrap_results, [2.5, 97.5]) print("95%置信区间:", confidence_interval)
修复说明
- 还原了
calculate_ratio的原始计算逻辑,确保分母符合你的初始设计。 - 将Bootstrap抽样改为成对抽样:用同一组随机索引同时抽取两组数据的元素,保留原始样本的配对关系,保证统计推断的合理性。
- 增加了数据长度检查和除零保护,避免运行时出现异常。
内容的提问来源于stack exchange,提问作者Gianluigi
相关产品推荐
相关产品推荐

