如何用Bootstrap方法计算随机数据集斜率及优化自定义Bootstrap函数
自定义Bootstrap函数的修改方案
修改后的Bootstrap斜率估计函数
针对你的需求,直接修改原函数,新增重采样方式选择、窗口长度自定义功能,同时内置斜率计算与置信区间输出逻辑:
import numpy as np def bootstrap_slope(data, n_boot, window_size=None, replace=True): """ 带斜率计算的Bootstrap重采样函数 参数: data: 输入数据集(一维数组) n_boot: 重采样次数 window_size: 重采样窗口长度,默认等于原数据长度 replace: 是否有放回重采样,默认True(有放回) 返回: slopes: 所有重采样的斜率数组 ci: 斜率的95%置信区间(下限, 上限) """ data = np.array(data) original_len = len(data) # 设置默认窗口长度为原数据长度 if window_size is None: window_size = original_len # 无放回重采样时,窗口长度不能超过原数据长度 if not replace and window_size > original_len: raise ValueError("无放回重采样时,窗口长度不能超过原数据长度") slopes = [] for _ in range(n_boot): # 执行重采样 if replace: resampled = np.random.choice(data, size=window_size, replace=True) else: resampled = np.random.choice(data, size=window_size, replace=False) # 构造x轴数组(1到窗口长度) x_vals = np.arange(1, window_size + 1) # 计算一阶拟合斜率 slope = np.polyfit(x_vals, resampled, deg=1)[0] slopes.append(slope) slopes = np.array(slopes) # 计算95%置信区间(分位数法) ci = np.percentile(slopes, [2.5, 97.5]) return slopes, ci
需求实现说明
有放回/无放回重采样
通过replace布尔参数控制,借助np.random.choice的对应参数实现;无放回时自动校验窗口长度,避免超出原数据范围导致报错。自定义重采样窗口长度
新增window_size参数,默认值为原数据长度,可手动指定每次重采样抽取的样本数量。斜率计算与置信区间
每次重采样后,构造x轴为1~window_size的连续数组,用一阶多项式拟合得到斜率;最后通过分位数法计算95%置信区间,若需调整置信水平,修改np.percentile的分位数参数即可(比如90%置信区间用[5, 95])。
使用示例
# 你的数据集 data = (0.045494, 0.065669, 0.073061, 0.104542, 0.296978, 0.498353, 0.503342, 0.515458, 0.660300, 0.663664, 0.677255, 0.724817, 0.805800, 0.899355, 0.987775, 2.121619, 2.165055, 2.196833, 3.265653, 3.479858, 8.702472, 10.070092, 10.720080, 12.896169, 12.912647, 14.244361, 14.287428, 17.337397, 18.903783, 20.940314, 21.404639, 22.234169) # 示例1:有放回重采样,窗口长度10,1000次迭代 slopes1, ci1 = bootstrap_slope(data, n_boot=1000, window_size=10, replace=True) print("有放回重采样斜率95%置信区间:", ci1) # 示例2:无放回重采样,窗口长度20,1000次迭代 slopes2, ci2 = bootstrap_slope(data, n_boot=1000, window_size=20, replace=False) print("无放回重采样斜率95%置信区间:", ci2)
补充说明
斜率计算也可手动实现最小二乘法,结果与np.polyfit一致:
# 手动计算斜率的替代代码 cov = np.cov(x_vals, resampled)[0, 1] x_var = np.var(x_vals) slope = cov / x_var
内容的提问来源于stack exchange,提问作者Adnan
相关产品推荐
相关产品推荐

