پروڈکٹ کا تجربہ: ایم ایس پی آر ٹی کا استعمال کرتے ہوئے پی-ہیکنگ کے بغیر ابتدائی روکنا اور ازگر میں ترتیب وار جانچ

آپ کے AI پروڈکٹ کا تجربہ 30 دن کی منصوبہ بند دوڑ کے 14 دن کو شماریاتی اہمیت تک پہنچ کر کارآمد استنباطی سوالات کی پیمائش کرتا ہے۔ کیا LLM پر مبنی خصوصیات نے حقیقت میں نتائج کو بہتر بنایا؟ کمرے میں موجود ہر پروڈکٹ مینیجر ڈیلیور کرنا چاہتا ہے۔ شماریات کا کہنا ہے کہ 30 دن انتظار کریں۔ بصورت دیگر، p-value غلط ہے۔

براہ کرم انتظار کریں۔ اثر 30 دن کے بعد بھی وہی رہتا ہے۔ تاہم، 95% اعتماد کے ساتھ ایک معروف فنکشن کو انجام دینے میں 16 دن گزارنے سے اگلے تجربے میں تاخیر ہوئی اور ہمیں موقع ضائع ہوا۔

اگر آپ کلاسک فکسڈ سیمپل ٹیسٹ چلا رہے ہیں، تو شماریات دان تکنیکی طور پر درست ہے۔ معیاری t-ٹیسٹ کی p-value صرف اس صورت میں درست ہے جب آپ نمونے کے سائز کی پہلے سے وضاحت کریں اور نتائج کو ایک بار چیک کریں۔ اگر آپ پہلے دیکھتے ہیں اور p <0.05 پر رک جاتے ہیں، تو غلط مثبت شرح 30% تک جاتی ہے۔

p-value کو ایک ہی پہلے سے کمٹڈ شکل کے لیے ڈیزائن کیا گیا ہے۔ یعنی، یہ مقررہ اختتامی نقطوں کے ساتھ جامد تجربات کے لیے بنایا گیا ہے۔ اسے لائیو سٹریم میں لاگو کرنے کے لیے جسے کسی بھی وقت دیکھا جا سکتا ہے ریاضیاتی اشیاء کے بالکل مختلف سیٹ کی ضرورت ہوتی ہے۔

ترتیب وار جانچ بالکل ان حالات کے لیے ڈیزائن کی گئی ہے۔ مکسڈ سیکوینشل پروبیبلٹی ریشو ٹیسٹ (mSPRT) (Johari et al.) ایک ریاضیاتی ہستی کا استعمال کرتا ہے جسے e-value کہا جاتا ہے تاکہ ہمیشہ درست اندازہ لگایا جا سکے۔ نتائج کو روزانہ چیک کیا جا سکتا ہے اور ثبوت کافی مضبوط ہونے پر روکا جا سکتا ہے، جس میں غلط مثبت شرح 5% رہ جاتی ہے۔

Netflix نے ہمیشہ درست ترتیب وار جانچ کے فریم ورک (Lindon et al.) کے پیداواری استعمال کو دستاویزی شکل دی ہے، اور بنیادی خیال ترتیب وار تجزیہ پر والڈ کے 1945 کے کام اور ویل کی 1939 کی عدم مساوات پر واپس جاتا ہے۔

اس ٹیوٹوریل میں، آپ واضح طور پر کنکشن بناتے ہیں۔ فلائیٹڈ ایرر ریٹس کو براہ راست دیکھنے کے لیے، ہم جھانکنے کے مسئلے کی نقل کرتے ہیں، Python میں شروع سے ایک ورکنگ mSPRT کو لاگو کرتے ہیں، اسے مشترکہ مصنوعی LLM پروڈکٹ ڈیٹاسیٹ پر لاگو کرتے ہیں، اور جب ترتیب وار ٹیسٹ ناکام ہو جاتے ہیں تو بالکل سمجھیں۔

ساتھی لیپ ٹاپ: اس دستاویز کے تمام کوڈ بلاکس کو آخر سے آخر تک عمل میں لایا جاتا ہے۔ msprt_demo.ipynb یہ ساتھی ذخیرہ میں ہے۔

انڈیکس

منتخب رکنے سے موجودہ ٹیسٹ کیوں ٹوٹ جاتے ہیں۔

چلتی ہوئی p-value کو جھانکنے سے غلط مثبت شرح 30% تک بڑھ جاتی ہے۔ یہ وہ نمبر ہے جو آپ کو توقف دیتا ہے، اور آئیے اسے ذیل میں مرحلہ 1 میں دوبارہ پیش کرتے ہیں۔

کلاسک مفروضے کے ٹیسٹ کی p-value ایک مخصوص سوال کا جواب دیتی ہے۔ اگر null درست ہے تو، اگر آپ پہلے سے وعدہ کردہ نمونے کے سائز کو استعمال کرتے ہوئے تجربہ کو بالکل ٹھیک منصوبہ بندی کے مطابق چلاتے ہیں تو اس طرح کے انتہائی ڈیٹا کو دیکھنے کی کیا مشکلات ہیں؟

"بالکل جیسا کہ منصوبہ بندی کی گئی ہے” شق مشکل ہے۔ اگر آپ دن 5، 10 اور 14 کو نتائج چیک کرتے ہیں اور 14 دن کو روکتے ہیں کیونکہ p <0.05، تو آپ نے منصوبہ بندی کے مطابق تجربہ نہیں چلایا۔ ہم نے 14 مختلف تجربات کیے، ہر تجربے کے نتائج کو دیکھا، اور حد سے تجاوز کرنے والوں پر رک گئے۔ p-value فارمولہ یہ نہیں جانتا۔

یہاں انترجشتھان ہے. کالعدم مفروضے کے تحت (کوئی اثر نہیں)، p-ویلیو 0 اور 1 کے درمیان تصادفی طور پر اچھالتی ہے۔ یہ 0.5 پر نہیں رہتی ہے۔ 30 دن کی دوڑ کے دوران، null تجربہ کسی وقت زیادہ امکان کے ساتھ 0.05 سے نیچے آجائے گا۔ اگر آپ ہر روز دیکھتے ہیں اور اس لمحے کو روکنے کے لیے تیار ہیں جب آپ p <0.05 دیکھتے ہیں، تو آپ کو تقریباً ہمیشہ نیچے کا رجحان ملے گا۔ آپ کو فاتح قرار دیا جاتا ہے۔ لیکن اثر حقیقی نہیں ہے۔

انہیں کم کثرت سے دیکھنے سے صرف انہی مسائل میں تاخیر ہوگی۔ آپ کو اسے اکثر چیک کرنا چاہئے۔ آپ کا پروڈکٹ تیزی سے آگے بڑھتا ہے، اور ضرورت سے 16 دن طویل تجربہ چلانے میں حقیقی لاگت، تاخیر سے لانچ اور موقع کے اخراجات ہوتے ہیں۔ اس سے قطع نظر کہ آپ کب روکتے ہیں، آپ کو درست ٹیسٹ کے اعدادوشمار کی ضرورت ہوتی ہے۔

ترتیب وار ٹیسٹ دراصل کیا کرتے ہیں۔

ترتیب وار ٹیسٹوں کو انتخابی طور پر p-value کو متبادل اعدادوشمار سے تبدیل کرنے کے لیے ڈیزائن کیا گیا ہے جسے e-value کہتے ہیں۔

p-values ​​کے برعکس، e-values ​​غیر منفی ہیں، اور وقت کے ساتھ ساتھ e-values ​​کے ذریعے تشکیل پانے والا عمل null کے نیچے سپرمارٹنگیل پراپرٹی کو مطمئن کرتا ہے۔ تاریخ کی بنیاد پر، اگلی متوقع ای ویلیو موجودہ قدر سے بہترین ہے۔

اس راستے کی سطح پر سپر مارٹنگیل کی حالت وہی ہے جو منتخب رکنے کو محفوظ بناتی ہے۔ ہر قدم پر معمولی اوسط کو 1 سے نیچے رکھنا ضروری ہے، لیکن کافی نہیں ہے۔ سپرمارٹنگیل کی حالت سختی سے مضبوط ہے، تمام رکنے کے اوقات میں باؤنڈری کو یکساں رکھنا۔

اس کی وجہ یہ ہے: اگر ای-ویلیو کا عمل E کا استعمال کرتے ہوئے ایک غیر منفی سپر مارٹنگیل ہے۔[e_t] H0 میں ≤ 1 کلاسک نتیجہ دیتا ہے جسے ویل کی عدم مساوات کہتے ہیں۔ اس بات کا امکان کہ عمل کی زیادہ سے زیادہ عمل درآمد 1/α سے زیادہ ہو زیادہ سے زیادہ α ہے۔ α = 0.05 اور 1/α = 20 کی رکنے کی حد کے ساتھ، null e-value کے عمل کے 20 تک پہنچنے کا امکان زیادہ سے زیادہ 5% ہے۔

اس قسم کی غلطی کی حد برقرار رہتی ہے اس سے قطع نظر کہ آپ کب روکتے ہیں یا کتنی بار چیک کرتے ہیں۔ کوریج وقت کے ساتھ یکساں ہے۔ بیک وقت تمام ممکنہ ڈاون ٹائمز پر مشتمل ہے۔

کلاسک پی ویلیو کی ضمانتیں صرف پہلے سے کمٹڈ نمونے کے سائز پر لاگو ہوتی ہیں۔ بار بار تصدیق آپ کی حدود کو تحلیل کر دے گی۔ کوئی ٹائم یونیفارم اینالاگ نہیں ہے۔

mSPRT ای-ویلیو کو Bayes فیکٹر کے طور پر شمار کرتا ہے، null کے تحت مشاہدہ کیے گئے ڈیٹا کے متبادل کے تحت مشاہدہ کیے گئے ڈیٹا کے امکانات کا تناسب۔

"مخلوط” حصے کا مطلب ہے کہ ہم H1 کے تحت ایک اثر کا سائز متعین نہیں کرتے ہیں۔ اثر کے سائز کے لیے پیشگی تقسیم کے مقابلے امکانات کے تناسب کی اوسط تلاش کریں۔

برنولی کے نتائج کے لیے (چاہے کام مکمل ہو گیا ہو: ہاں یا نہیں)، آپ لاگ-بیٹا فنکشن کا استعمال کرتے ہوئے ہر قدم کے لیے مکمل فیصد کے سامنے Beta(1,1) رکھ کر Bayes فیکٹر کا علاج کر سکتے ہیں۔ ریاضی جتنا لگتا ہے اس سے کم خوفناک ہے۔ پورا حساب درج ذیل کالوں کو 4 تک کم کر دیتا ہے۔ betalnجیسا کہ آپ مرحلہ 2 میں دیکھ سکتے ہیں۔

عملی نتائج ٹھوس ہیں۔ یہ ڈیٹا جمع کرتا ہے، ہر روز چلنے والی ای-ویلیو کا حساب لگاتا ہے، اور جب یہ 20 سے تجاوز کر جاتا ہے تو رک جاتا ہے۔ اگر وہ زیادہ سے زیادہ نمونے کے سائز کے دوران 20 سے کم رہیں تو اسے مسترد نہیں کیا جا سکتا۔ اسے ہر روز، ہر گھنٹے، ہر منٹ چیک کریں۔ قسم I کی غلطی کی شرح 5% ہے۔

شناخت کے مفروضے

mSPRT کی ہمیشہ درست گارنٹی چار شرائط پر منحصر ہوتی ہے: ہر ایک کو ختم کیا جا سکتا ہے، اور ذیل میں فیلور موڈز سیکشن ہر ناکامی کے موڈ کو ان حالات کے مطابق نقشہ بناتا ہے جن کی وجہ سے اس کی خلاف ورزی ہوتی ہے۔

  1. H0 کے مطابق نونیگ سپرمارٹنگیل پراپرٹیز۔ ای-ویلیو کے عمل کو E کو پورا کرنا چاہیے۔[e_{t+1} | e_1, …, e_t] e_t ≤ H0 کے تحت۔ یہاں استعمال ہونے والے بیٹا بائنومیئل بیز فیکٹر کے لیے، یہ اس وقت تک برقرار رہتا ہے جب تک پرائیر مناسب ہو (بیٹا(1،1) کوالیفائیڈ) اور مشاہدات ہر شعبے میں آئی آئی ڈی ہیں۔

  2. جیونگ جی سیونگ۔ ڈیٹا جنریشن کا عمل تجربہ ونڈو کے دوران طے ہونا چاہیے۔ اگر بیس لائن کی تکمیل کی شرح غیر متعلقہ تبدیلیوں (ماڈل اپ ڈیٹس، مارکیٹنگ مہم میں ہم آہنگی کی تبدیلیوں، یا ہفتے کے دن کے اثرات) کی وجہ سے درمیانی تجربے کو منتقل کرتی ہے، تو ای-ویلیو شور کو پکڑ لیتی ہے جسے تجربہ علاج کے اثرات سے الگ نہیں کر سکتا۔

  3. ہر بازو کے اندر آزاد مشاہدات۔ ہر صارف کے نتائج دوسرے صارفین کے نتائج سے آزاد ہونے چاہئیں۔ نیٹ ورک کے اثرات، مشترکہ کام کی جگہیں، یا سفارشی نظام کے اثرات اس کی خلاف ورزی کر سکتے ہیں۔

  4. پری قیاس۔ بیٹا (1،1) پہلے ایک ماڈلنگ مفروضہ ہے۔ ایم ایس پی آر ٹی کی طاقت اس بات پر منحصر ہے کہ آیا پچھلے طریقے صحیح اثر کے سائز پر معقول ماس رکھتے ہیں۔ ناقص طور پر متعین کردہ پیش بندی قسم I کی غلطی کی ضمانتوں کو نہیں توڑتی ہے، لیکن یہ حد کو عبور کیے بغیر نمونے کے بجٹ کو ختم کرتے ہوئے، ای قدروں کو بہت آہستہ آہستہ بڑھنے کا سبب بن سکتی ہے۔

شرائط

  • Python 3.11+

  • پانڈاس 2.x (pip install pandas)

  • NumPy 1.26+ (pip install numpy)

  • سائفی 1.12+ (pip install scipy)

  • matplotlib 3.8+ (pip install matplotlib)

مصنوعی ڈیٹاسیٹ حاصل کرنے کے لیے، ساتھی ریپوزٹری کو کلون کریں۔

git clone https://github.com/RudrenduPaul/product-experimentation-causal-inference-genai-llm.git
cd product-experimentation-causal-inference-genai-llm
python data/generate_data.py --seed 42 --n-users 50000 --out data/synthetic_llm_logs.csv

موجودہ صورتحال کچھ یوں ہے: یہ اس سیریز کے لیے تمام 13 ساتھی نوٹ بکس پر مشتمل ریپوزٹری کو کلون کرتا ہے اور ایک مشترکہ 50,000 صارف مصنوعی ڈیٹاسیٹ بناتا ہے، جس میں ذخیرہ کیا جاتا ہے: data/synthetic_llm_logs.csv. سیریز کے تمام مضامین ایک ہی CSV کے خلاف چلتے ہیں، آپ کو طریقوں کا براہ راست موازنہ کرنے کی اجازت دیتے ہیں۔ ڈیٹا جنریٹر لہر 1 کے صارفین کے لیے کاموں کی تکمیل پر +5% پوائنٹ کازل اثر کا اطلاق کرتا ہے۔

ورکنگ مثال سیٹ اپ

مصنوعی ڈیٹاسیٹ 50,000 صارفین کے ساتھ SaaS AI امدادی پروڈکٹ کی نقل کرتا ہے۔ کہ task_completed کالم ریکارڈ کرتا ہے کہ آیا AI نے صارف کا کام کامیابی سے مکمل کیا (1) یا نہیں (0)۔ کہ wave کالم صارفین کو گروپس کو تفویض کرتے ہیں۔ Wave 1 نئی AI خصوصیات حاصل کرتا ہے اور Wave 2 ہولڈ آؤٹ کنٹرول ہے۔

شکل 1: تصوراتی ای قدر کی رفتار۔ نیلا راستہ (حقیقی اثر) اٹھتا ہے اور سبز نقطوں والی لکیر پر رکنے کی دہلیز کو عبور کرتا ہے۔ جامنی رنگ کا راستہ (کمزور اثر) بڑھتا ہے لیکن 30 دنوں کے اندر نہیں کاٹتا ہے۔ سرمئی راستہ (نال) ہوا مجموعی طور پر 1 کے قریب ہے۔ سرخ ڈیشڈ لائن 1/α = 20 پر سٹیشنری باؤنڈری ہے۔ اس کا ذیل میں شکل 2 سے موازنہ کریں، جو ایک حقیقی ڈیٹاسیٹ کے لیے اصل ای-ویلیو کی رفتار کو ظاہر کرتا ہے۔

import pandas as pd
import numpy as np

df = pd.read_csv("data/synthetic_llm_logs.csv")

treated = df[df["wave"] == 1]["task_completed"].values
control = df[df["wave"] == 2]["task_completed"].values

print(f"Treated: n={len(treated):,}, mean={treated.mean():.4f}")
print(f"Control: n={len(control):,}, mean={control.mean():.4f}")
print(f"Observed lift: {treated.mean() - control.mean():.4f}")

متوقع پیداوار:

Treated: n=24,937, mean=0.6202
Control: n=25,063, mean=0.5718
Observed lift: 0.0485

موجودہ صورتحال کچھ یوں ہے: 50,000 قطاروں کا ڈیٹاسیٹ لوڈ کریں اور اسے لہروں کے ذریعے تقسیم کریں۔ Wave 1 کے پاس 24,937 پروسیس شدہ صارفین تھے، جس کی ٹاسک مکمل کرنے کی شرح 62.0% تھی۔ ویو 2 میں 25,063 کنٹرول صارفین ہیں۔ کام کی تکمیل کی شرح 57.2%. مشاہدہ کیا گیا 4.85 فیصد پوائنٹ اضافہ ڈیٹا جنریٹر میں 5 پی پی گراؤنڈ سچائی کے قریب ہے، نمونے لینے کے شور کی وجہ سے چھوٹے فرق کے ساتھ۔ یہ انتظام ایک وقت میں ایک مشاہدے کی ترتیب وار جانچ فراہم کرتا ہے، جیسا کہ ذیل کے مراحل میں بیان کیا گیا ہے۔

مرحلہ 1: جھانکنے کے مسئلے کی تقلید کریں۔

جھانکنے کا مسئلہ حقیقی اور قابل پیمائش ہے۔ 30 دنوں کے لیے روزانہ کی نگرانی غلط مثبت شرح کو 4.2% سے 30.2% تک بڑھا دیتی ہے۔ اس کی تصدیق نیچے دیے گئے تخروپن میں ہوتی ہے۔

یہ تخروپن 1,000 کالعدم تجربات چلاتا ہے (جہاں علاج کا کوئی اثر نہیں ہوتا ہے) اور ہر روز یہ دیکھنے کے لیے چیک کرتا ہے کہ چل رہی p-value 0.05 سے کم ہے یا نہیں۔ یہ منظر 30 دن کے تجربے کے لیے 60 صارفین فی بازو فی دن استعمال کرتا ہے۔ فی بازو مشاہدات کی کل تعداد 1,800 ہے، جو درمیانے سائز کے SaaS پروڈکٹ کے لیے حقیقت پسندانہ سائز ہے۔

from scipy import stats
import numpy as np

np.random.seed(42)

N_SIMS = 1000
N_DAYS = 30
USERS_PER_ARM_PER_DAY = 60
NULL_RATE = 0.60

false_positives_peeking = 0
false_positives_single_look = 0

for _ in range(N_SIMS):
    control_outcomes = []
    treated_outcomes = []
    stopped_early = False

    for day in range(N_DAYS):
        control_outcomes.extend(np.random.binomial(1, NULL_RATE, USERS_PER_ARM_PER_DAY))
        treated_outcomes.extend(np.random.binomial(1, NULL_RATE, USERS_PER_ARM_PER_DAY))

        # The peeking problem: checking the test every single day
        if len(control_outcomes) >= 10:
            _, p = stats.ttest_ind(treated_outcomes, control_outcomes)
            if p < 0.05 and not stopped_early:
                false_positives_peeking += 1
                stopped_early = True

    # The fixed-sample approach: checking only once at the very end
    _, p_final = stats.ttest_ind(treated_outcomes, control_outcomes)
    if p_final < 0.05:
        false_positives_single_look += 1

print(f"False positive rate (peeking daily):  {false_positives_peeking / N_SIMS:.1%}")
print(f"False positive rate (single look):    {false_positives_single_look / N_SIMS:.1%}")

متوقع پیداوار:

False positive rate (peeking daily):  30.2%
False positive rate (single look):    4.2%

موجودہ صورتحال کچھ یوں ہے: ہر تخروپن ایک ہی 60% تکمیل کی شرح پر تیار کردہ دونوں بازوؤں کے ساتھ کالعدم ڈیٹا تیار کرتا ہے، لہذا پتہ چلا اثر خالص شور ہے۔ اندرونی لوپ ہر روز 60 مشاہدات فی بازو کا اضافہ کرتا ہے اور اس دن کے لیے جمع کردہ ڈیٹا پر ٹی ٹیسٹ چلاتا ہے۔

جب p-value پہلے 0.05 سے نیچے آجاتی ہے، سمولیشن جھوٹے مثبت کو جھنڈا لگاتا ہے اور رک جاتا ہے (ایسی ٹیم کی نقل کرتا ہے جو اہمیت کا پتہ لگانے پر ریلیز کرتی ہے)۔

دن 30 پر ایک ہی چیک ایک ایماندار مقررہ نمونہ ٹیسٹ ہے۔ ایک فوری نظر 4.2% کی غلط مثبت شرح کو ظاہر کرتی ہے، جو کہ برائے نام کے قریب ہے۔ روزانہ جھانکنے کی شرح 30.2% ہے۔ اس کا مطلب ہے کہ 4 میں سے 1 سے زیادہ "اہم" تجربات شور کا پتہ لگا رہے ہیں۔

مرحلہ 2: mSPRT ای-ویلیو نافذ کریں۔

mSPRT ہر بار قدم پر Bayes فیکٹر کا حساب لگاتا ہے۔ یعنی، null کے مقابلے میں متبادل مرکب کے تحت کتنا زیادہ ڈیٹا دیکھا جاتا ہے؟ ہر شعبے کے لیے تکمیل کی شرح سے پہلے beta(1,1) کے ساتھ بائنری نتائج کے لیے، چل رہا Bayes فیکٹر لاگ-بیٹا فنکشن کا استعمال کرتے ہوئے ایک بند شکل رکھتا ہے۔

from scipy.special import betaln

def compute_evalue_running(outcomes_treated, outcomes_control,
                           alpha_prior=1.0, beta_prior=1.0):
    """
    Compute the running mSPRT e-value for two Bernoulli arms.

    Parameters
    ----------
    outcomes_treated : array-like of 0/1
    outcomes_control : array-like of 0/1
    alpha_prior, beta_prior : Beta prior hyperparameters (default: uniform)

    Returns
    -------
    e_values : np.ndarray of shape (n,), one e-value per observation
    """
    outcomes_treated = np.asarray(outcomes_treated, dtype=float)
    outcomes_control = np.asarray(outcomes_control, dtype=float)
    n = min(len(outcomes_treated), len(outcomes_control))

    cum_t = np.cumsum(outcomes_treated[:n])
    cum_c = np.cumsum(outcomes_control[:n])
    t_arr = np.arange(1, n + 1, dtype=float)

    # Alternative hypothesis: each arm has its own independent Beta prior on completion rate
    log_ml_t = (betaln(alpha_prior + cum_t, beta_prior + t_arr - cum_t)
                - betaln(alpha_prior, beta_prior))
    log_ml_c = (betaln(alpha_prior + cum_c, beta_prior + t_arr - cum_c)
                - betaln(alpha_prior, beta_prior))

    # Null hypothesis: both arms share a single pooled Beta prior on the common rate
    pooled_successes = cum_t + cum_c
    pooled_n = 2 * t_arr
    log_ml_h0 = (betaln(alpha_prior + pooled_successes,
                        beta_prior + pooled_n - pooled_successes)
                 - betaln(alpha_prior, beta_prior))

    # Log Bayes factor is the difference in log marginal likelihoods
    log_bf = log_ml_t + log_ml_c - log_ml_h0

    return np.exp(log_bf)

موجودہ صورتحال کچھ یوں ہے: یہ فنکشن 0/1 نتائج کی دو صفیں لیتا ہے جو تاریخ کی ترتیب میں آتے ہیں۔ ہر بار قدم t کے لیے، ہم ہر ورژن کے لیے کامیابیوں اور کوششوں کی مجموعی تعداد کا حساب لگاتے ہیں۔

betaln بیٹا فنکشن کا لوگارتھم فراہم کرتا ہے، جو کہ بیٹا بائنومیل معمولی امکان کے لیے نارملائزیشن مستقل ہے۔ H1 ہر بازو کے تناسب کے لیے آزاد بیٹا پریرز کو شامل کرتا ہے۔ H0 پہلے کے ایک حصہ کے تناسب پر ضم ہوتا ہے۔

لاگ Bayes عنصر فرق ہے. اس کی وضاحت کرنا ای ویلیو دیتا ہے۔ اگر علاج کا حقیقی اثر ہو تو وقت کے ساتھ ساتھ ای ویلیو بڑھ جاتی ہے۔ یہ ایک سپر مارٹنگیل ہے جو بغیر کسی اثر کے 1 کے ارد گرد اچھالتا ہے اور H0 سے نیچے غیر منفی ہے۔

null ڈیٹا پر فوری سنجیدگی کی جانچ متوقع رویے کی تصدیق کرتی ہے۔

np.random.seed(0)
null_t = np.random.binomial(1, 0.60, 500)
null_c = np.random.binomial(1, 0.60, 500)
ev_null = compute_evalue_running(null_t, null_c)
print(f"E-value at end under null (should be near 1): {ev_null[-1]:.3f}")
print(f"Max e-value under null: {ev_null.max():.3f}")

متوقع پیداوار:

E-value at end under null (should be near 1): 0.078
Max e-value under null: 2.188

موجودہ صورتحال کچھ یوں ہے: null کے تحت، حتمی e-value 1 کے قریب ختم ہو جاتی ہے (یہاں نمونے لینے کے تغیر کی وجہ سے 0.078 ہے)، اور 500 سے زیادہ مشاہدات کی سب سے بڑی تعداد 20 کے رکنے کی حد سے بالکل نیچے رہتی ہے۔ Ville کی عدم مساوات کے مطابق، اس بات کا امکان ہے کہ ایک درست null e-value سب سے زیادہ 20 فیصد تک پہنچ جائے گا، جس کے عمل کے ساتھ 5 فیصد تک پہنچ جائے گی۔ 5% قسم I غلطی کی شرح۔ اس واحد 500 مشاہدے کی دوڑ میں، زیادہ سے زیادہ 2.188 ہے، جو متوقع رویہ ہے۔

مرحلہ 3: اصلی ڈیٹا سیٹ پر mSPRT لگائیں۔

اب ٹیسٹ کو مصنوعی ڈیٹا پر لگائیں جہاں علاج کے حقیقی اثرات موجود ہوں۔ ہر دن کے لیے چلنے والی ای ویلیو کا حساب لگائیں اور پہلا دن تلاش کریں جب یہ رکنے کی حد سے تجاوز کر جائے۔

import matplotlib.pyplot as plt

np.random.seed(42)
treated_shuffled = treated.copy()
control_shuffled = control.copy()
np.random.shuffle(treated_shuffled)
np.random.shuffle(control_shuffled)

USERS_PER_ARM_PER_DAY = 60
N_DAYS_RUN = 30
n_per_arm = USERS_PER_ARM_PER_DAY * N_DAYS_RUN  # 1,800

treated_seq = treated_shuffled[:n_per_arm]
control_seq = control_shuffled[:n_per_arm]

e_values = compute_evalue_running(treated_seq, control_seq)

ALPHA = 0.05
THRESHOLD = 1 / ALPHA  # = 20

days = np.arange(1, len(e_values) + 1) / USERS_PER_ARM_PER_DAY
cross_indices = np.where(e_values >= THRESHOLD)[0]
if len(cross_indices) > 0:
    stopping_day = days[cross_indices[0]]
    print(f"mSPRT stopping day: {stopping_day:.1f}")
    print(f"E-value at stopping: {e_values[cross_indices[0]]:.1f}")
else:
    stopping_day = None
    print("mSPRT did not cross threshold in this window")

print(f"Final e-value on day {N_DAYS_RUN}: {e_values[-1]:.2f}")

متوقع پیداوار:

mSPRT stopping day: 25.9
E-value at stopping: 20.9
Final e-value on day 30: 75.64

موجودہ صورتحال کچھ یوں ہے: ہم علاج اور کنٹرول کے انتظامات میں ردوبدل کرتے ہیں تاکہ صارفین کی روزانہ کی بے ترتیب آمد کا اندازہ لگایا جا سکے (حقیقی تجربات میں، ہم صارفین کو کسی خاص ترتیب میں فراہم نہیں کرتے ہیں) اور پھر پہلے 1,800 افراد کو فی بازو منتخب کریں۔ compute_evalue_running ایک وقت میں ایک مشاہدہ۔ ای قدر 25.9 دنوں میں 20 کی حد سے تجاوز کر جاتی ہے۔ اس کا مطلب یہ ہے کہ تجربے کو 4 دن پہلے بلایا جا سکتا ہے، مکمل طور پر درست اندازہ کو یقینی بنا کر۔ 30 ویں دن، ای-ویلیو 75.64 تک پہنچ گئی، حد سے بہت اوپر۔

82ae7b10-c598-4597-80e6-375fa76b209d

شکل 2: حقیقی 50,000 صارف مصنوعی ڈیٹاسیٹ کے لیے حقیقی mSPRT ای-ویلیو کی رفتار (ویو 1 ٹریٹمنٹ بمقابلہ ویو 2 کنٹرول)۔ نیلی لکیر ای ویلیو ہے جو لوگاریتھمک پیمانے پر چلائی جاتی ہے۔ سرخ ڈیشڈ لائن 1/α = 20 کی رکنے کی حد ہے۔

سبز نقطے والی عمودی لائن 25.9 دن کو نشان زد کرتی ہے جب ای ویلیو پہلے حد سے تجاوز کر جاتی ہے۔ نیچے والا پینل فی بازو پر مجموعی کام کی تکمیل کا فیصد دکھاتا ہے، جو ڈیٹا کے جمع ہونے کے ساتھ ساتھ بدل جاتا ہے۔ شکل 1 میں اسکیمیٹک کے برعکس، یہ مشترکہ ڈیٹا سیٹ سے حقیقی ڈیٹا ہے، اور اس میں حقیقی 4.85 پی پی اضافہ ہے۔

مرحلہ 4: فکسڈ نمونہ ٹیسٹ کے ساتھ طاقت کا موازنہ کریں۔

mSPRT کے حقیقی اخراجات ہیں۔ اثر چالو ہونے کے بعد، آپ اسے اس کے مقررہ اختتامی وقت سے پہلے روک سکتے ہیں۔ طاقت کا جرمانہ اہم ہے اگر اثر پہلے کی توقع سے کم ہے یا اگر آپ نمونے کے معمولی سائز کے ساتھ کام کر رہے ہیں۔ یہ نقلی ایمانداری کے ساتھ تجارت کی مقدار کو درست کرتا ہے۔

from scipy.stats import ttest_ind

np.random.seed(42)

N_SIMS = 1000
TRUE_EFFECT = 0.05
BASE_RATE = 0.60
N_PER_ARM = 1800          # 30 days x 60 users/arm/day
DAILY_BATCH = 60
THRESHOLD = 20

msprt_stopping_days = []
msprt_detected = 0
ttest_detected = 0

for sim in range(N_SIMS):
    t_obs = np.random.binomial(1, BASE_RATE + TRUE_EFFECT, N_PER_ARM)
    c_obs = np.random.binomial(1, BASE_RATE, N_PER_ARM)

    e_vals = compute_evalue_running(t_obs, c_obs)
    days = np.arange(1, N_PER_ARM + 1) / DAILY_BATCH
    crosses = np.where(e_vals >= THRESHOLD)[0]
    if len(crosses) > 0:
        msprt_detected += 1
        msprt_stopping_days.append(days[crosses[0]])
    else:
        msprt_stopping_days.append(30.0)

    _, p = ttest_ind(t_obs, c_obs)
    if p < 0.05:
        ttest_detected += 1

msprt_power = msprt_detected / N_SIMS
ttest_power = ttest_detected / N_SIMS
median_stop = np.median(msprt_stopping_days)
pct_stopped_early = np.mean(np.array(msprt_stopping_days) < 30.0)

print(f"mSPRT power:               {msprt_power:.1%}")
print(f"Fixed-sample t-test power: {ttest_power:.1%}")
print(f"Median mSPRT stop day:     {median_stop:.1f} / 30")
print(f"Fraction stopping early:   {pct_stopped_early:.1%}")

متوقع پیداوار:

mSPRT power:               49.3%
Fixed-sample t-test power: 88.7%
Median mSPRT stop day:     30.0 / 30
Fraction stopping early:   49.3%

موجودہ صورتحال کچھ یوں ہے: ہم ایک حقیقی 5pp لفٹ کے ساتھ 1,000 نقلیں چلاتے ہیں۔ mSPRT کے لیے، مجموعی ای ویلیو کا حساب لگایا جاتا ہے اور 20 کا پہلا انٹرسیکشن ریکارڈ کیا جاتا ہے۔

مقررہ نمونے کی جانچ کے لیے، ہم 30 دن کے آخر میں ایک پر ایک نظر ڈالتے ہیں۔ نتائج ایک بامعنی طاقت کے فرق کو ظاہر کرتے ہیں۔ ایم ایس پی آر ٹی نے 49.3 فیصد ٹرائلز میں اثر کا پتہ لگایا، جب کہ فکسڈ سیمپل ٹیسٹ نے 88.7 فیصد میں اثر پایا۔ 5 پی پی لفٹ اور 1,800 مشاہدات فی بازو کے ساتھ، mSPRT کو ایک مقررہ نمونہ ٹیسٹ کی طاقت سے ملنے کے لیے تقریباً دو گنا زیادہ مشاہدات کی ضرورت ہوتی ہے۔

یہ ایک وارنٹی کی قیمت ہے جو ہمیشہ لاگو ہوتی ہے۔ جب آپ روزانہ چیک کرتے ہیں تو آپ کو جو ملتا ہے وہ ہے ٹائپ I ایرر کنٹرول۔ روزانہ جھانکنے کے ایک مقررہ نمونے کی جانچ کرنے سے شرح 30.2% تک بڑھ جاتی ہے۔ mSPRT 5% پر رہتا ہے قطع نظر اس کے کہ یہ کب رک جائے۔

صحیح انتخاب کا انحصار اس بات پر ہے کہ آپ کی ٹیم کو کیا زیادہ خرچ آتا ہے۔ یا تو تجربہ زیادہ چلتا ہے یا یہ غلط مثبت پیش کرتا ہے۔ زیادہ تر ٹیمیں اپنی طاقت کے اخراجات کو کم نہیں سمجھتی ہیں جب تک کہ وہ خود ان نقالی کو نہیں چلاتے۔

زمینی سچائی کی تصدیق

مصنوعی ڈیٹاسیٹ میں ایک معروف 5pp اضافہ شامل ہے، جو ہمیں اس بات کی تصدیق کرنے کی اجازت دیتا ہے کہ 30 دن کی مدت کے بعد مزید ڈیٹا دستیاب ہونے پر mSPRT اثر کی صحیح شناخت کرتا ہے۔

np.random.seed(0)
t_full = treated_shuffled
c_full = control_shuffled[:len(t_full)]

e_full = compute_evalue_running(t_full, c_full)
days_full = np.arange(1, len(e_full) + 1) / USERS_PER_ARM_PER_DAY

cross_full = np.where(e_full >= THRESHOLD)[0]
if len(cross_full) > 0:
    print(f"mSPRT correctly detected the effect.")
    print(f"Could have stopped on day {days_full[cross_full[0]]:.1f}")
    print(f"True effect in data: {treated.mean() - control.mean():.4f}")
    print(f"E-value at stopping point: {e_full[cross_full[0]]:.1f}")
else:
    print("mSPRT did not cross threshold with this data slice.")

متوقع پیداوار:

mSPRT correctly detected the effect.
Could have stopped on day 27.1
True effect in data: 0.0485
E-value at stopping point: 22.2

موجودہ صورتحال کچھ یوں ہے: جب ایم ایس پی آر ٹی کو پوری شفلڈ اری (24,937 ٹریٹمنٹس، 25,063 کنٹرولز) پر چلاتے ہیں تو ای ویلیو 27.1 دنوں میں حد سے تجاوز کر جاتی ہے۔ اعداد و شمار میں اصل وجہ اثر، 4.85pp، جنریٹر کی 5pp کی حقیقی قدر کے قریب ہے اور اس کا صحیح طور پر پتہ چلا ہے۔

30 دنوں کے لیے ڈیزائن کیے گئے فکسڈ نمونے کے ٹیسٹ 30 دن تک برقرار رکھے جاتے ہیں، یہاں تک کہ جب ثبوت پہلے ہی جمع ہو چکے ہوں۔ 60 یوزر فی بازو فی دن کے ساتھ، mSPRT ہمیں 27.1 دنوں میں ریلیز کرنے کی اجازت دیتا ہے، اس خصوصیت پر ہمیں تقریباً 3 دن کی بچت ہوتی ہے جو ہمیشہ ریلیز کے لیے مقرر تھی۔

مرحلہ 5: بوٹسٹریپ اعتماد کا وقفہ

اسٹاپ ڈیٹ آپ کو بتاتی ہے کہ تجربہ کب کال کرنا ہے، لیکن یہ آپ کو یہ نہیں بتاتی کہ اثر کتنا بڑا ہوگا یا اس کا اندازہ کتنا درست ہوگا۔ بوٹسٹریپ اعتماد کے وقفے دونوں فراہم کرتے ہیں۔

rng = np.random.default_rng(7)
point_est = treated.mean() - control.mean()

boot_diffs = np.array([
    rng.choice(treated, size=len(treated), replace=True).mean() -
    rng.choice(control, size=len(control), replace=True).mean()
    for _ in range(500)
])

lower = float(np.percentile(boot_diffs, 2.5))
upper = float(np.percentile(boot_diffs, 97.5))

print(f"Point estimate (treated - control): {point_est:.4f} ({point_est*100:.2f}pp)")
print(f"95% bootstrap CI: [{lower:.4f}, {upper:.4f}]  "
      f"([{lower*100:.2f}pp, {upper*100:.2f}pp])")
print(f"Ground-truth 5pp is {'inside' if lower <= 0.05 <= upper else 'outside'} the CI.")

متوقع پیداوار:

Point estimate (treated - control): 0.0485 (4.85pp)
95% bootstrap CI: [0.0407, 0.0581]  ([4.07pp, 5.81pp])
Ground-truth 5pp is inside the CI.

موجودہ صورتحال کچھ یوں ہے: ہم علاج شدہ اور کنٹرول صفوں کو 500 بار آزادانہ طور پر تبدیل کرکے دوبارہ نمونہ بناتے ہیں اور ہر بار ذرائع میں فرق کا حساب لگاتے ہیں۔ 500 فرقوں کا 2.5 واں اور 97.5 فیصد اعتماد کے وقفے بناتے ہیں۔ CI 4.07pp سے 5.81pp تک چلتا ہے، بشمول حقیقی 5pp اور 0 کو چھوڑ کر یہ یقینی بنانے کے لیے کہ اثر حقیقی ہے۔ اس بات پر غور کرتے ہوئے کہ فی سیگمنٹ میں 25,000 صارفین ہیں، وقفہ کاری کافی تنگ ہے، ایک ہی قدم میں "کیا اس نے کام کیا" (ہاں) اور "کتنا" (4.07 اور 5.81 فیصد پوائنٹس کے درمیان) کا جواب دونوں فراہم کرتا ہے۔

جب mSPRT ناکام ہوجاتا ہے۔

ترتیب وار جانچ کے لیے اب بھی تجرباتی سختی کی ضرورت ہے۔ چار حالات ضمانت کو توڑ دیتے ہیں یا طریقہ کار کو عملی طور پر بیکار کر دیتے ہیں۔

پہلے غلط طریقے سے بیان کیا گیا تھا۔

ایم ایس پی آر ٹی ہر قدم کی تکمیل کی شرح کے لیے ایک پیشگی بیٹا (1,1) فرض کرتا ہے، یعنی ماڈلنگ کے انتخاب جن کے نتیجے میں حقیقی نتائج برآمد ہوتے ہیں۔ یہ پیشگی تصریح کے مفروضے کی خلاف ورزی کرتا ہے اگر اصل اثر پہلے کی طرف سے متوقع حد سے بہت باہر آتا ہے۔

یکساں بیٹا (1,1) پہلے 3-10pp کی حد میں درمیانے اثرات کے لیے تقریباً 60% کی بنیادی شرح پر معقول حد تک اچھی کارکردگی کا مظاہرہ کرتا ہے۔ اگر اصل اثر 0.3pp اضافہ ہے (ایک معمولی AI خصوصیت میں تبدیلی کے لیے ایک حقیقت پسندانہ نتیجہ)، تو ای ویلیو بہت آہستہ آہستہ بڑھتا ہے۔ نمونہ بجٹ حد سے بڑھنے سے پہلے ہی ختم ہو جاتا ہے۔

اپنی لغت کو اپنے پروڈکٹ کے تاریخی A/B ٹیسٹنگ ڈیٹا کے خلاف کیلیبریٹ کریں۔ ہم بی ٹا ہائپر پیرامیٹر کو تاریخی اثر کے سائز کی تقسیم کے لیے فٹ کرنے کے لیے زیادہ سے زیادہ امکانات کا استعمال کرتے ہیں اور اس بات کو یقینی بناتے ہیں کہ نتیجہ میں پیشگی کم از کم قابل شناخت اثر کے قریب بامعنی ماس رکھتا ہے۔

غیر معمولی نتائج

گارنٹی کا تقاضہ ہے کہ ای-ویلیو کا عمل کالعدم کے تحت ایک غیر منفی سپر مارٹنگیل ہو، جس کے لیے ضروری ہے کہ ڈیٹا جنریشن کا عمل طے کیا جائے۔ اگر AI ماڈل کو تجربے کے وسط میں اپ ڈیٹ کیا جاتا ہے، اگر صارف کی آبادی حرکت کرتی ہے (جیسے مارکیٹنگ کی مہم جس کے نتیجے میں 12 تاریخ کو مختلف گروہ ہوتے ہیں)، یا اگر کام کی دشواری پر ہفتے کے دن کا اثر ہوتا ہے، تو ای-ویلیو ماحولیاتی شور کو جذب کرے گی جسے تجربہ پروسیسنگ اثرات سے الگ نہیں کر سکتا۔

ہولڈ آؤٹ A/A تجربہ میں ای-ویلیو کے نفاذ کو چلا کر بے ضابطگیوں کی تشخیص کریں۔ اگر null e-value کا عمل اوپر کی طرف بڑھ رہا ہے جب اسے 1 کے قریب ہونا چاہیے، تو ماحول اتنا مستحکم نہیں ہے کہ طریقہ قابل اعتماد ہو۔

ضرب کی اصلاح کے بغیر متعدد میٹرکس

mSPRT ایک ہی موازنہ کے لیے قسم I کی غلطی کو کنٹرول کرتا ہے۔ 20 میٹرکس کی جانچ خود طریقہ کار کو ناکام نہیں کرتی ہے، لہذا ہر انفرادی ای ویلیو درست رہتی ہے۔ جو چیز ناکام ہوتی ہے وہ خاندان کے لحاظ سے غلطی کی شرح ہے۔ اگر آپ بیک وقت 20 اشاریوں پر ایم ایس پی آر ٹی چلاتے ہیں اور جب کوئی بھی 20 سے تجاوز کر جاتا ہے تو رک جاتے ہیں، کم از کم ایک غلط مثبت ہونے کا امکان 5% سے بہت زیادہ ہوگا۔

α=0.05 پر m=20 میٹرکس کے لیے، حد کو 1/(α/m) = 400 تک بڑھا کر بونفرونی تصحیح کا اطلاق کریں یا تجربے کے اختتام پر حتمی ای-ویلیو پر بینجمینی-ہچبرگ طریقہ کار استعمال کریں۔

ضرب کا مسئلہ وہی ہے جو فکسڈ سیمپل ٹیسٹنگ میں پیش آیا تھا۔ mSPRT نہ تو صورتحال کو خراب کرتا ہے اور نہ ہی اسے حل کرتا ہے۔ یہ ایک عام غلط فہمی ہے جس کا واضح طور پر ذکر کرنا ضروری ہے۔

کم از کم رن ٹائم اب بھی حقیقت پسندانہ ہے۔

فوری طور پر مانیٹرنگ شروع کرنا پرکشش ہے، کیونکہ آپ کو ہمیشہ درست کوریج ملے گی چاہے آپ جب بھی چیک کریں۔ ایسا نہ کریں اگرچہ جب بھی تصدیق ہو جائے یقین دہانی کو برقرار رکھا جاتا ہے، کم طاقت کا مطلب یہ ہے کہ ٹیسٹ شاذ و نادر ہی مسترد کیے جاتے ہیں چاہے اثر حقیقی ہو۔

چار قدمی تخروپن اس کو براہ راست ظاہر کرتا ہے۔ 1,800 مشاہدات فی بازو اور 5pp لفٹ کے ساتھ، mSPRT کی طاقت صرف 49.3% ہے۔ ایم ایس پی آر ٹی مانیٹرنگ کا تجربہ شروع کرنے سے پہلے، ایک معیاری پاور کیلکولیٹر کا استعمال کریں تاکہ کم از کم سیمپل سائز کا تخمینہ لگائیں متوقع اثر سائز پر 80% پاور اور مانیٹرنگ شروع کرنے سے پہلے اسے کم از کم کے طور پر سیٹ کریں۔ اس منزل تک پہنچنے تک ای-ویلیو کو چیک نہ کریں۔

آگے کیا کرنا ہے۔

ایم ایس پی آر ٹی کو پرائمری میٹرک پر کم از کم رن ٹائم پرت کے ساتھ لاگو کریں جس کے نمونے کے سائز پر 80% پاور کے لیے مطلوبہ اثر سائز پر سیٹ ہو۔

سب سے پہلے، اپنے تاریخی ہولڈ آؤٹ ڈیٹا پر A/A ٹیسٹ چلائیں۔ انشانکن کی جانچ کی کوئی قیمت نہیں ہے اور اس سے پہلے کہ وہ حقیقی تجربے سے سمجھوتہ کریں غیر منجمد ماحول کو حاصل کریں۔ A/A ٹیسٹنگ کو چھوڑنے والی ٹیمیں حقیقی دنیا کے تجربات کے دوران انشانکن کی ناکامیوں کو دریافت کرتی ہیں۔ غیر معمولی ڈیٹا سے سیکھنے کا یہ ایک مہنگا طریقہ ہے۔

مکمل نفاذ کے لیے، بشمول بوٹسٹریپ اعتماد کے وقفے، دیکھیں: 07_sequential_msprt/ یہ ساتھی ذخیرہ میں ہے۔

اوپر تک سکرول کریں۔