Как оценить надежное среднее значение, используя бутстрэппинг со взвешенными данными и неопределенностями измерений?Python

Программы на Python
Ответить
Anonymous
 Как оценить надежное среднее значение, используя бутстрэппинг со взвешенными данными и неопределенностями измерений?

Сообщение Anonymous »

У меня есть небольшой набор данных, в котором каждая точка данных (y_i) имеет свою собственную неопределенность измерения (e_i). Я хочу оценить надежное среднее значение для (y), правильно рассматривая неопределенности (e_i) как веса. Моя цель — учесть оба фактора:
  • Статистические вариации в наборе данных (посредством начальной загрузки).
  • Измерение неопределенность каждой точки данных (через веса на основе (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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»