- Статистические вариации в наборе данных (посредством начальной загрузки).
- Измерение неопределенность каждой точки данных (через веса на основе (e_i)).
- Повторная выборка индексов данных с заменой (непараметрическая bootstrap).
- Для каждой точки данных, подвергнутой повторной выборке ((y_i, e_i)), создайте синтетический рисунок из нормального распределения (\mathcal{N}(y_i, e_i^2)).
- Вычислите средневзвешенное значение для каждой бутстреп-выборки, используя (w_i = 1 / e_i) в качестве весов.
Код (MRE):
< pre class="lang-py Prettyprint-override">import numpy as np
import pandas as pd
from joblib import Parallel, delayed
def two_stage_bootstrap_weighted_mean(
data,
slope_col = 'plaw', # Column with slope estimates y_i
err_col = 'err', # Column with 1-sigma measurement errors e_i
n_bootstrap = 1000,
n_jobs = 1, # Set >1 for parallel
random_state=None
):
"""
Performs a two-stage bootstrap:
1) Resample indices with replacement (nonparametric).
2) For each resampled data point, draw from Normal(y_i, e_i) (parametric).
Then computes the weighted mean with weights = 1/e_i for each resample.
Returns
-------
mean_est : float
The average of all bootstrap weighted means.
std_boot : float
The standard deviation of the bootstrap means.
boot_means: np.ndarray
The array of all bootstrap mean estimates.
"""
rng = np.random.default_rng(random_state)
y_vals = data[slope_col].values
e_vals = data[err_col].values
# Weights = 1/e_i
N = len(data)
def bootstrap_iteration(_):
# Nonparametric resample
indices = rng.integers(0, N, size=N)
y_draw = y_vals[indices]
e_draw = e_vals[indices]
# Parametric resample from each point
y_synth = rng.normal(loc=y_draw, scale=e_draw)
# Weighted mean: sum(y_synth * w) / sum(w)
w_draw = 1.0 / e_draw
w_sum = np.sum(w_draw)
if w_sum == 0:
return np.nan
return np.sum(y_synth * w_draw) / w_sum
# Run bootstrap (parallel or single core)
boot_means = Parallel(n_jobs=n_jobs)(
delayed(bootstrap_iteration)(_) for _ in range(n_bootstrap)
)
boot_means = np.array(boot_means)
mean_est = np.nanmean(boot_means)
std_boot = np.nanstd(boot_means, ddof=1)
return mean_est, std_boot, boot_means
if __name__ == "__main__":
# Generate synthetic data
np.random.seed(42)
N = 20
true_slope = -2.0
measurement_err = np.random.uniform(0.05, 0.4, N)
# Observed slopes are true_slope + random noise of scale measurement_err
observed_slopes = np.random.normal(loc=true_slope, scale=measurement_err)
# Put into a DataFrame
df = pd.DataFrame({
"plaw": observed_slopes,
"err": measurement_err
})
# Run the two-stage bootstrap
mean_est, std_boot, boot_means = two_stage_bootstrap_weighted_mean(
df, slope_col="plaw", err_col="err", n_bootstrap=1000, n_jobs=1, random_state=123
)
print(f"True slope: {true_slope}")
print(f"Bootstrap mean slope: {mean_est:.3f}")
print(f"Bootstrap std: {std_boot:.3f}")
< /code>
Вопросы: < /strong> < /p>
[*] Это два- Подход начальной загрузки имеет смысл для объединения статистической изменчивости и неопределенности индивидуальных измерений в надежную среднюю оценку? /e_i^2)?
[*] Есть ли более стандартный или эффективный метод (например, взвешенные наименьшие квадраты или распространение ошибок) для оценки среднего значения и его неопределенности в этом сценарии?
< /ol>
Спасибо за любое руководство или рекомендации по улучшению этого метода или с использованием альтернативных подходов! < /p>
Подробнее здесь: https://stackoverflow.com/questions/793 ... ata-and-me
Мобильная версия