基于Monster 组和GPT的调写:
用Python实现的序贯概率比检验的示例,针对几何分布的情况。代码中使用蒙特卡罗方法估计错误类型 I 和 II 的概率,以及条件预期样本大小。
import numpy as np
def sequential_probability_ratio_test(sample, threshold, alpha, beta):
t = 0
n = len(sample)
log_l = 0
log_f = 0
decision = 0
p0 = 1 / (1 + threshold)
p1 = threshold / (1 + threshold)
while decision == 0 and t < n:
x = sample[t]
log_l += np.log(p1 * (1 - p0)**x)
log_f += np.log(p0 * (1 - p1)**x)
t += 1
if log_l - log_f >= np.log(beta / alpha):
decision = 1
elif log_f - log_l >= np.log(beta / alpha):
decision = -1
return decision, t
n_simulations = 10000
alpha = 0.05
beta = 0.1
theta = 0.2
threshold = 2
n_false = 0
n_miss = 0
false_count = 0
miss_count = 0
for i in range(n_simulations):
sample_size = sequential_probability_ratio_test(np.random.geometric(theta, 100), threshold, alpha, beta)[1]
if sample_size < 100:
n_false += 1
false_count += 100 - sample_size
else:
n_miss += 1
miss_count += sample_size - 100
false_rate = n_false / n_simulations
miss_rate = n_miss / n_simulations
avg_false_count = false_count / n_false if n_false > 0 else 0
avg_miss_count = miss_count / n_miss if n_miss > 0 else 0
print("错误类型 I 的概率:", false_rate)
print("错误类型 II 的概率:", miss_rate)
print("条件预期样本大小(平均失踪观测值数量):", avg_miss_count)
print("错误警报的数量:", avg_false_count)
p0 = 1 / (1 + threshold)
p1 = threshold / (1 + threshold)
a = (np.log(beta / alpha) + np.log((1 - p1) / p1)) / np.log((1 - p0) / p0)
b = (np.log(alpha / beta) + np.log((1 - p0) / p0)) / np.log((1 - p1) / p1)
print("阈值为2时的 alpha 和 beta:", alpha**a, beta**b)
首先定义了一个名为 sequential_probability_ratio_test 的函数,该函数接受样本、阈值、α和β等参数,然后进行SPRT测试并返回决策和观测样本数等统计信息。
然后进行蒙特卡罗模拟,使用 np.random.geometric 生成一个参数为 theta 的几何分布样本,并调用 sequential_probability_ratio_test 函数进行SPRT测试。如果测试结果表明样本数小于100,则认为是错误类型 I,统计错误数和错误警报的数量;否则认为是错误类型 II,统计错失数和条件预期样本大小等信息。
最后,计算错误类型 I 和 II 的概率,以及条件预期样本大小和错误警报的数量等统计信息,并打印输出。
此外,该代码还计算了阈值为2时的α和β,并将其打印输出。