بوت استرپ در پایتون — راهنمای کاربردی

یکی از روشهای قدرتمند رایانهای در حوزه استنباط آماری، «بوت استرپ» (Bootstrap) است. این روش بدون در نظر گرفتن شرایط پیچیده، سعی در تخمین خطای برآوردگرها دارد. برای مثال برای ایجاد «فاصلههای اطمینان» (Confidence Interval)، «مدلهای رگرسیونی» (Regression Models) و همچنین در حوزه «یادگیری ماشین» (Machine Learning) برای تخمین خطای مدل، میتوان از روش بوتاسترپ استفاده کرد. در این نوشتار به منظور پیادهسازی الگوریتم بوت استرپ از زبان برنامهنویسی پایتون استفاده خواهیم کرد. بوت استرپ در لغت به معنی تسمهای است که بر روی چکمه قرار داشته و پوشیدن آن را سادهتر میکند. در مباحث آماری نیز به منظور برآورد راحتتر و سادهتر پارامترهای جامعه آماری، از تکنیک بوتاسترپ استفاده میشود.
در این نوشتار به بررسی شیوه عملکرد بوت استرپ پرداخته و بوسیله کدهایی از پایتون آن را پیادهسازی خواهیم کرد. در دیگر نوشتارهای فرادرس با عنوان جک نایف و بوت استرپ (Jackknife and Bootstrap) روش های بازنمونه گیری — به زبان ساده با مفهوم این شیوه تخمین آشنا شدهاید. از طرفی مطالعه متن نمونه گیری و بازنمونه گیری آماری (Sampling and Resampling) — به زبان ساده نیز خالی از لطف نیست.
بوت استرپ در پایتون
هر چند روش بوتاسترپ شامل مبانی عمیق آماری است ولی در این نوشتار به بررسی سادهای از این مفهوم خواهیم پرداخت. البته برای پیاده سازی محاسبات مربوط به این تکنیک، از زبان برنامهنویسی «پایتون» (Python) کمک خواهیم گرفت.
به هر حال برای درک روش بوت استرپ باید با مفاهیمی آماری که در فهرست زیر قابل مشاهده است، آشنا باشید.
- مفاهیم اولیه ریاضیات و توابع
- میانگین و واریانس
- توابع توزیع آماری و تابع احتمال
- توزیع نمونهای
- قضیه حد مرکزی، قانون اعداد بزرگ و همگرایی در احتمال
- تابع توزیع تجربی و تابعکهای آماری
همانطور که گفته شد، هدف از روش به کارگیری بوت استرپ، استنباطی در مورد برآوردگر پارامتر جامعه آماری است. روش بوت استرپ به کمک تکنیک نمونهگیری با جایگذاری (بازنمونهگیری) سعی میکند که بهترین برآورد را برای خطای برآوردگرها با توجه به حجم نمونه محدود، بدست آورد. البته نمونههای حاصل از بازنمونهگیری، مستقل از یکدیگر هستند. مراحل مربوط به تکنیک بوتاسترپ را میتوان به صورت نمادین در زیر مشاهده کرد.
این گامها به صورت زیر هستند.
- گام ۱: استخراج یک نمونه از جامعه آماری با حجم $$n$$.
- گام ۲: تهیه یک زیرنمونه از نمونه حاصل از گام ۱ با جایگذاری با حجم $$n$$ و تکرار این عمل به تعداد $$B$$ بار. به این زیرنمونهها به اصطلاح نمونههای بوتاسترپ (Bootstrap Sample) گفته میشود. به این ترتیب به تعداد $$B$$ نمونه بوتاسترپی خواهیم داشت.
- گام ۳: برآوردگر پارامتر جامعه آماری ($$\theta$$) را براساس هر یک از نمونههای حاصل از نمونههای بوتاسترپ، محاسبه و در مجموع به تعداد $$B$$ برآوردگر مختلف برای پارامتر $$\theta$$ بدست خواهد آمد.
- گام ۴: به کمک این برآوردگرها، و تعیین توزیع نمونهای آنها، خطای برآورد یا فاصله اطمینان برای برآوردگر پارامتر $$\theta$$ قابل محاسبه است.
در این نوشتار میخواهیم نحوه کار روش بوتاسترپ را بررسی کنیم. به منظور این کار بهتر است برای سه سوال زیر به دنبال پاسخ بگردیم.
- علت معرفی روش بوتاسترپ توسط دانشمند آمار «بردلی افرون» (Bradley Efron) چیست؟ انگیزه او از این کار چه بوده است؟
- چرا روشهای شبیهسازی در بوت استرپ به کار میرود؟ چگونه بوسیله بازنمونهگیری برآورد واریانس برای یک آماره محاسبه میشود؟
- ایده بازنمونهگیری با جایگذاری به چه علت در بوتاسترپ استفاده میشود؟
۱. انگیزه اصلی برای معرفی روش بوتاسترپ: برآورد خطای برآوردگر
ریشه و انگیزه اصلی استفاده از تکنیک بوتاسترپ، استفاده از سرعت رایانههای مدرن به منظور انجام استنباط آماری است. «افرن» این روش را برای تعیین میزان دقت برآوردگرها در مسائل تحلیل آماری ابداع کرد. به عنوان یک اصل، بعد از تخمین پارامتر توسط برآوردگر باید میزان خطای تخمین نیز که همان دقت برآوردگر است، تعیین شود. برای روش شدن این موضوع به بررسی یک مثال میپردازیم.
مثال
فرض کنید قرار است مشخص کنید در یک روز، هر دانشآموز چند بار از تلفن هوشمند استفاده میکند. مدرسه مورد نظر، شامل ۱۰۰ دانشآموز است. از آنجایی که بررسی همه دانشآموزان و محاسبه این متغیر به سختی میسر است، براساس پرسشنامه آنلاین از دانشآموزان میخواهید در این تحقیق مشارکت کنند. در پایان دوره تحقیق، ۳۰ دانشآموز پرسشنامه را تکمیل کردهاند و براساس این دادهها، میانگین تعداد دفعاتی که از تلفن هوشمند استفاده میکنند برابر با 228.06 بار است. این مسئله را به کمک کدهای پایتون شبیهسازی کردهایم. ابتدا کتابخانهها را بارگذاری میکنیم.
import numpy as np import matplotlib.pyplot as plt
سپس نمونه تصادفی با حجم ۱۰۰ تولید و آن را در متغیر pickups قرار میدهیم.
# construct a population pickups for our lab np.random.seed(42) pickups = np.random.randint(0,500 , size=100) pickups
نتیجه خروجی میتواند به صورت زیر در آید. این اعداد تعداد دفعات استفاده از گوشی همراه را نشان میدهد.
array([102, 435, 348, 270, 106, 71, 188, 20, 102, 121, 466, 214, 330, 458, 87, 372, 99, 359, 151, 130, 149, 308, 257, 343, 491, 413, 293, 385, 191, 443, 276, 160, 459, 313, 21, 252, 235, 344, 48, 474, 58, 169, 475, 187, 463, 270, 189, 445, 174, 445, 50, 363, 54, 243, 319, 130, 484, 306, 134, 20, 328, 166, 273, 387, 88, 315, 13, 241, 264, 345, 52, 385, 339, 91, 366, 443, 454, 427, 263, 430, 34, 205, 80, 419, 49, 359, 387, 1, 389, 53, 105, 259, 309, 476, 190, 401, 217, 43, 161, 201])
همانطور که مشاهده میشود، ۱۰۰ مقدار شبیهسازی شده است. میانگین این مقدارها نیز برابر با 252.7 است که میتوان آن را میانگین جامعه آماری در نظر گرفت.
# population mean pickups.mean() 252.7
از طرفی انحراف استاندارد برای این مقدارها را نیز محاسبه میکنیم تا نشان دهیم چه میزان پراکندگی در بین دادهها وجود دارد.
# population standard deviation pickups.std() 144.25342283634035
نتیجه اجرای این دستور، انحراف استاندارد را 144.25342 نشان میدهد. در ادامه یک نمونه ۳۰ تایی از این جامعه تهیه میکنیم و محاسبات مربوط به میانگین و انحراف استاندارد را برای این نمونه بدست میآوریم.
# draw a sample from population sample = np.random.choice(pickups, size=30) sample array([166, 201, 458, 190, 445, 87, 385, 427, 387, 166, 474, 49, 430, 205, 54, 343, 413, 389, 20, 58, 191, 87, 463, 88, 389, 52,
براساس نمونهای که تهیه شده، میانگین برابر با 228.0666 و انحراف استاندارد نیز 166.96890 محاسبه میشود.
# our first sample mean sample_mean = sample.mean() sample_mean 228.06666666666666 # standard deiveation for this sample sample_std = np.std(sample, ddof=1) sample_std 166.96890756052164
خطا یا انحراف استاندارد برای میانگین محاسبه شده توسط رابطه زیر بدست میآید.
$$\large S_{\overline{X}}=\dfrac{S_{X}}{\sqrt{n}}$$
بنابراین انحراف استاندار یا خطای برآورد میانگین با استفاده از کد زیر محاسبه میشود.
# estimated standard error for the sapmle mann sample_std/(30 ** 0.5) 30.48421235763086
در مباحث آمار استنباطی، محاسبات و کارهایی که برای این مثال صورت گرفت، «برآورد نقطهای» (Point Estimation) نامیده میشود. در برآورد نقطهای، به کمک مشاهدات حاصل از نمونه، سعی میکنیم پارامتر جامعه را تخمین بزنیم. به این ترتیب دو واژه در درک این مسئله دخیل هستند.
- برآوردگر/ آماره: تابعی از نمونه تصادفی که به منظور برآورد پارامتر جامعه به کار میرود، مانند میانگین نمونهای ($$\overline{X}$$).
- پارامتر جامعه: مقداری عددی که به عنوان یک شاخص به منظور شناسایی بهتر جامعه آماری به کار میرود، مانند میانگین جامعه ($$\mu$$).
با توجه به این مفاهیم، سوالی که بوسیله روش بوتاسترپ پاسخ خواهیم داد، میزان دقت یا خطای برآوردگرها است.
از آنجایی که تفاوت در مقدار نمونهها وجود دارد، نمیتوان همیشه مقدار پارامتر را با مقدار برآورد آن یکسان در نظر گرفت. میانگین نمونهای از نمونهای به نمونه دیگر متفاوت خواهد بود در حالیکه پارامتر جامعه (میانگین جامعه آماری) همیشه ثابت و یکسان است. بنابراین با توجه به مقدارهای مختلف برآوردگر برای نمونههای متفاوت میتوان این سوال را مطرح کرد که دقت برآوردگر چقدر است؟
خطای استاندارد
خطای استاندارد برای یک برآوردگر، همان انحراف استاندارد آن است. این شاخص نشان میدهد که مقدار برآورد چه میزان از مقدار واقعی دور است. مطابق با آنچه در تئوری آمار برای محاسبه خطای استاندارد میانگین داریم، لازم است که انحراف استاندارد جامعه معلوم باشد تا بتوان خطای استاندارد را محاسبه کرد.
در اینجا خطای استاندارد میانگین را با $$\sigma_{\overline{X}}$$ و انحراف استاندارد جامعه آماری را با $$\sigma$$ نشان دادهایم. مشخص است که منظور از $$n$$ نیز اندازه نمونه است.
$$\large \sigma_{\overline{X}}=\dfrac{\sigma}{\sqrt{x}}$$
متاسفانه در اکثر مواقع، انحراف استاندارد جامعه آماری نامشخص است. بنابراین ابتدا باید برای آن یک برآورد مشخص کنیم. به نظر میرسد که انحراف استاندارد نمونهای $$s$$ میتواند برآورد خوبی برای انحراف استاندارد جامعه آماری باشد. بنابراین رابطه بالا را به صورت زیر بازنویسی میکنیم.
$$\large \sigma_{\overline{X}}=\dfrac{s}{\sqrt{n}}$$
نکته: برآوردگر نااریب برای انحراف استاندارد جامعه آماری مطابق با رابطه زیر بدست میآید.
$$\large s^2=\sum_{i=1}^n \dfrac{(x_i-\overline{x})^2}{n-1}$$
به همین علت در محاسباتی که در پایتون دیده میشود، برآورد برای انحراف استاندارد (خطای برآورد) برآوردگر برابر با 30.48 شده است.
$$\large \sigma_{\overline{X}}=\dfrac{166.97}{\sqrt{30}}=30.48$$
تفسیر خطای برآورد
حال که میزان خطای برآوردگر محاسبه شد، باید از آن در استنباط آماری مربوط به میانگین استفاده کنیم. بهتر است این موضوع را بیشتر مورد بررسی قرار دهیم.
از آنجایی که برآوردگر، تابعی از نمونه تصادفی است، دارای مقدارهای تصادفی نیز خواهد بود و از نمونهای به نمونه دیگر، تغییر خواهد کرد. فرض کنید یک برآوردگر دارای توزیع نرمال یا تقریبا نرمال است. با توجه به توزیع احتمالی نرمال، برای برآوردگر مورد نظر، انتظار داریم که در فاصله یک انحراف استاندارد از میانگین، ۶۸٪ مقدارهای برآوردگر را ببینیم. همچنین به نظر میرسد که با توجه به توزیع نرمال، در فاصله دو انحراف استاندارد از میانگین، تقریبا ۹۵٪ از مقدارهای برآوردگر قرار داشته باشد.
به یاد دارید که اندازه نمونه برای مثال ما برابر با ۳۰ است. با توجه به «قضیه حد مرکزی» (Central Limit Theorem) میتوانیم توزیع میانگین نمونهای را نرمال فرض کنیم و برای برآوردگر، یک فاصله اطمینان ۹۵٪ تشکیل دهیم.
$$(228.06 -2\times 30.48, 228+2\times 30.48)=(167.1,289.02)$$
نکته: ضریب ۲ در محاسبه این فاصله اطمینان براساس دو انحراف استاندارد نوشته شده است. البته میدانیم که مقدار دقیق برای این ضریب 1.96 است که همان صدک $$1-2.5\%=\%97.5$$ توزیع نرمال استاندارد است زیرا باید $$\frac{0.5}{2}=0.25$$ بالایی و 2.5٪ پایین این توزیع حذف شود تا ناحیه میانی شامل ۹۵٪ دادهها باشد.
به منظور استفاده از قوانین و قواعد استنباط آماری باید شرایط زیر برقرار باشد.
- خطای استاندارد میانگین نمونه، براساس انحراف استاندارد جامعه (یا برآورد آن) قابل محاسبه باشد.
- توزیع برآوردگر نرمال یا تقریبا نرمال باشد.
متاسفانه در اکثر مواقع، از توزیع واقعی جامعه آماری مطلع نیستیم و نمیتوانیم وجود شرایط بالا را بررسی کنیم. از طرفی امکان تشخیص توزیع برآوردگر و یا محاسبه انحراف استاندارد آن به راحتی میسر نیست. برای مثال تشخیص توزیع میانه (Median) در بسیاری از مواقع امکان پذیر نیست و نمیتوانیم انحراف استاندارد آن را مشخص کنیم.
یکی از روشهای تعیین خطای برآورد در چنین حالتهایی استفاده از تکنیک بوتاسترپ است. بنابراین هرگاه یک یا هر دو شرط بالا محقق نشده باشد، بوتاسترپ میتواند برآورد نسبتا دقیقی از خطای برآوردگر در اختیار ما قرار دهد.
۲. چرا روشهای شبیهسازی در بوت استرپ به کار میروند؟
برای آنکه بتوانیم نحوه عملکرد روش بوتاسترپ را درک کنیم، ابتدا چند مفهوم مهم آماری را مرور میکنیم. فرض کنید قرار است که انحراف استاندارد یک آماره را برآورد کنیم تا بتوانیم در مورد این آماره به یک استنباط آماری (مانند آزمون فرض یا فاصله اطمینان) برسیم. شرایطی که با آن روبرو هستیم در زیر فهرست شدهاند.
- هیچ اطلاعی از توزیع احتمالی جامعه آماری نداریم.
- روش مشخص و تحلیلی برای تعیین توزیع یا انحراف استاندارد برآوردگر در اختیار ما نیست.
متغیرهای تصادفی $$X_1, X_2, \cdots, X_n$$ را یک نمونه آماری از جامعه $$P$$ با تابع توزیع $$F$$ در نظر بگیرید. فرض کنید که $$M=g(X_1,X_2,\cdots,X_n)$$ آماره برای پارامتر مورد نظر ما باشد. قرار است واریانس $$M$$ را محاسبه کنیم. از آنجایی که هیچ اطلاعی از توزیع جامعه آماری نداریم، مقدار واریانس برآوردگر یعنی (Var(M را نمیتوانیم مشخص کنیم. بنابراین لازم است که واریانس را برآورد کنیم. این برآورد را با $$EST\_Var(M)$$ مشخص میکنیم.
از آنجایی که در دنیای واقعی هستیم، به سادگی و با روش تحلیلی محاسبه این واریانس کار دشوار و سختی است. بنابراین باید به صورت تقریبی این واریانس را برآورد کنیم. به روش شبیهسازی (Simulation) میتوان با تقریب مناسب، واریانس برآوردگر را بدست آورد. در این قسمت از شبیهسازی فرض بر این است که جامعه آماری ($$P$$) را میشناسیم.
شبیهسازی (Simulation) با پایتون
شبیهسازی، تکنیکی مفید برای بدست آوردن توزیع آماری نمونه به کمک رایانه است. البته شبیهسازی دارای یک شرط مهم و قوی است که آن هم آگاه بودن از مشخصات و ویژگیهای جامعه آماری است. به منظور شبیهسازی و محاسبه واریانس برآوردگر، مراحل زیر را طی میکنیم.
- یک نمونه تصادفی با اندازه $$n$$ از جامعه $$P$$ تهیه (شبیهسازی) میکنیم.
- آماره مورد نظر ($$M_j$$) را براساس این نمونه محاسبه میکنیم.
- مراحل ۱ و ۲ را به تعداد مشخصی (مثلا $$B$$) بار تکرار میکنیم تا $$M_j$$ (مقدار برآوردگر مورد نظر) حاصل شود.
- میانگین (Mean) و واریانس (Variance) را برای $$M$$ها (مقدارهایی که از مرحله ۳ حاصل شده) را بدست میآوریم.
با توجه به قانون اعداد بزرگ (Law of Large Numbers) میدانیم که میانگین حاصل از این فرآیند به میانگین جامعه آماری نزدیک خواهد شد. به این ترتیب تقریبا مطمئن هستیم که با بزرگ شدن مقدار $$B$$، میانگین برآوردگرهای $$M$$ به سمت پارامتر واقعی جامعه میل میکند. همچنین با افزایش مقدار $$B$$ میانگین حاصل از واریانسها نیز به واریانس واقعی برآوردگر نزدیک و نزدیکتر خواهد شد.
به این ترتیب با استفاده از رایانهها، میتوانیم این محاسبات تکراری را بارها و بارها انجام دهیم تا به برآوردی به دقت بالا (واریانس کوچک) برسیم.
در ادامه با استفاده از کد پایتون به بررسی مثال مربوط به گوشیهای هوشمند پرداختهایم. در این جا تعداد تکرارها $$B=100000$$ بار است و خواهیم دید که میانگین و انحراف استاندارد برآوردگر حاصل از نمونهها به مقدار واقعی بسیار نزدیک خواهد شد.
ورودی ۱:
import numpy as np import matplotlib.pyplot as plt
ورودی ۲:
# construct a population pickups for our lab np.random.seed(42) pickups = np.random.randint(0,500 , size=100) pickups
خروجی 2:
array([102, 435, 348, 270, 106, 71, 188, 20, 102, 121, 466, 214, 330, 458, 87, 372, 99, 359, 151, 130, 149, 308, 257, 343, 491, 413, 293, 385, 191, 443, 276, 160, 459, 313, 21, 252, 235, 344, 48, 474, 58, 169, 475, 187, 463, 270, 189, 445, 174, 445, 50, 363, 54, 243, 319, 130, 484, 306, 134, 20, 328, 166, 273, 387, 88, 315, 13, 241, 264, 345, 52, 385, 339, 91, 366, 443, 454, 427, 263, 430, 34, 205, 80, 419, 49, 359, 387, 1, 389, 53, 105, 259, 309, 476, 190, 401, 217, 43, 161, 201])
ورودی 3:
# population mean pickups.mean()
خروجی 3:
252.7
ورودی 4:
# population standard deviation pickups.std()
خروجی ۴؛
144.25342283634035
ورودی ۵:
# draw a sample from population sample = np.random.choice(pickups, size=30) sample
خروجی ۵:
array([166, 201, 458, 190, 445, 87, 385, 427, 387, 166, 474, 49, 430, 205, 54, 343, 413, 389, 20, 58, 191, 87, 463, 88, 389, 52, 102, 1, 102, 20])
ورودی ۶:
# our first sample mean sample_mean = sample.mean() sample_mean
خروجی ۶:
228.06666666666666
ورودی ۷:
# standard deviation for this sample sample_std = np.std(sample, ddof=1) sample_std
خروجی ۷:
166.96890756052164
ورودی ۸:
# estimated standard error for sample mean sample_std/(30 ** 0.5)
خروجی ۸:
30.48421235763086
ورودی ۹:
# theoretical standard error for sample mean pickups.std()/(30 ** 0.5)
خروجی ۹:
26.336951228264823
ورودی ۱۰:
# construct the simulated sampling distribution sample_props = [] for _ in range(100000): sample = np.random.choice(pickups, size=30) sample_props.append(sample.mean())
ورودی ۱۱:
# the simulated mean of the sampling distribution simulated_mean = np.mean(sample_props)
ورودی ۱۲:
# the simulated standard deviation of the sampling distribution simulated_std = np.std(sample_props)
ورودی ۱۳:
# plot the simulated sampling distribution, # under the Central Limit Theorem, # it is expected normal plt.hist(sample_props)
خروجی ۱۳:
(array([1.7000e+01, 2.9400e+02, 3.0210e+03, 1.2917e+04, 2.8275e+04, 3.1747e+04, 1.7958e+04, 5.0680e+03, 6.6100e+02, 4.2000e+01]), array([136.76666667, 159.24666667, 181.72666667, 204.20666667, 226.68666667, 249.16666667, 271.64666667, 294.12666667, 316.60666667, 339.08666667, 361.56666667]), <a list of 10 Patch objects>)
ورودی ۱۴:
# the theoretical mean and simulated mean (pickups.mean(), simulated_mean)
خروجی ۱۴:
(252.7, 252.74267033333336)
ورودی ۱۵:
# the theoretical standard error and simulated standard error (pickups.std()/(30 ** 0.5), simulated_std)
خروجی ۱۵: مقایسه انحراف استاندارد برآوردگر با انحراف استاندار حاصل از شبیهسازی
(26.336951228264823, 26.327169537452452)
تابع توزیع تجربی (Empirical Distribution Function)
در قسمت قبل، ایده مربوط به استفاده از شبیهسازی را در تکنیک بوتاسترپ مورد بررسی قرار دادیم. حال باید تقریبی برای واریانس برآوردگر یعنی $$EST\_Var(M)$$ ایجاد کنیم. متاسفانه برای انجام شبیهسازی احتیاج به اطلاعاتی در مورد توزیع جامعه آماری داشتیم در حالیکه، این اطلاعات همیشه در دسترس نیست. خوشبختانه یکی از بخشهای مهم در بوت استرپ تشخیص یا تعیین توزیع جامعه به کمک تابع توزیع تجربی است.
«تابع توزیع تجربی» (Empirical Distribution Function) یا با اختصار EDF به عنوان تقریبی برای تابع توزیع تجمعی (Cumulative Distribution Function- CDF) به کار میرود. این تقریب برای اندازه نمونههای بزرگ به خوبی عمل میکند. تابع توزیع تجربی، یک توزیع گسسته است که وزنهای یکسانی به هر مشاهده میدهد. برای مثال اگر تعداد نقاط مشاهده شده در نمونه برابر با $$n$$ باشد (یک نمونه $$n$$تای موجود باشد) مقدار احتمال براساس تابع توزیع تجربی برای مشاهده هر یک از نقاط برابر با $$\frac{1}{n}$$ خواهد بود.
به این ترتیب تابع توزیع تجربی را میتوان به صورت یک «تابع پلهای» (Step Function) در نظر گرفت.
تابعکهای آماری (Statistical Functional)
در مباحث آماری، به توابعی که برحسب تابع توزیع تجمعی (CDF) نوشته میشوند، «تابعک آماری» (Statistical Functional) گفته میشود. بنابراین با توجه به روابط زیر میتوان امید ریاضی (Mathematical Expectation) و واریانس (Variance) را به عنوان تابعکهای آماری در نظر گرفت.
$$\large \operatorname{E}(x)=\begin{cases}\int xdF(x) & X\;is\; \;discrete \\\sum xP(x) & X \; is \; Continuous \end{cases}$$
$$\large \sigma^2=\operatorname{Var}(x)=\operatorname{E}(X^2)-\operatorname{E}^2(X)=\int x^2dF(x)-(\int xdF(x))^2$$
همینطور، بسیاری از شاخصهای جامعه آماری، مانند «میانه» (Median) و «چندکها» (Quantiles)، تابعک آماری محسوب میشوند. به این ترتیب اگر $$F$$ را تابع توزیع تجمعی متغیر تصادفی $$X$$ در نظر بگیریم، آماره $$M$$ را میتوان به صورت تابعی مثل $$g$$ از $$F$$ در نظر گرفت. بنابراین خواهیم داشت:
$$\large M = g(F)$$
حال به بحث مربوط به بوتاسترپ باز میگردیم. همانطور که به یاد دارید باید به کمک نمونهگیری و یا بازنمونهگیری برای برآوردگر، خطا یا میزان دقت را اندازهگیری کنیم. از آنجایی که دقت یا خطا را با واریانس مرتبط میدانیم، مشخص است که باید از تابعکهای آماری و تابع توزیع تجربی استفاده کنیم. فرض کنید که $$\theta$$ پارامتر مورد نظر باشد، یعنی برحسب تابع توزیع $$F$$ و تابع $$g$$ داریم $$\theta=g(F)$$. به این ترتیب اگر برآورد پارامتر مورد نظر را با $$\widehat{\theta}$$ و تابع توزیع تجربی را با $$\widehat{F}$$ نشان دهیم، خواهیم داشت:
$$\large \widehat{\theta} =g(\widehat{F})$$
نکته: از آنجایی که $$\widehat{\theta}$$ «برآوردگر حداکثر درستنمایی» (Maximum Likelihood Estmator- MLE) برای $$\theta$$ است، برای برآورد $$g(\theta)$$ هم میتوان از $$g(\widehat{\theta})$$ استفاده کرد. به این ترتیب در چنین مواردی، رابطه زیر برقرار است.
$$\large \widehat{g}(\theta)=g(\widehat{\theta})$$
برای مثال اگر پارامتر مورد نظر، میانگین جامعه آماری ($$\mu$$) باشد میتوان براساس تصویر زیر نحوه برآورد آن را به کمک تابعکها و تابع توزیع تجمعی تجربی مشخص کرد. از طرفی با توجه به خاصیت برآوردگرهای نااریب، میدانیم با افزایش حجم نمونه، متوسط برآوردگرها به مقدار واقعی پارامتر میل خواهد کرد.
به این ترتیب از آنجایی که به کمک روش بوتاسترپ، تابع توزیع تجربی (EDF) را به عنوان برآوردی برای تابع توزیع تجمعی (CDF) در نظر میگیریم، میتوانیم تابعی مثل $$g$$ از تابع توزیع تجمعی را به کمک همان تابع از تابع توزیع تجربی، برآورد کنیم. فرض کنید $$M=g(X_1,X_2,\cdots,X_n)=g(F)$$ برآوردگر ما باشد. مراحل انجام این کار به صورت زیر خواهد بود.
- براساس نمونه تصادفی، برآوردگر تابع توزیع تجربی (EDF) را محاسبه میکنیم.
- به کمک تابع $$g$$ برآوردگر $$M$$ را بدست میآوریم. یعنی $$\widehat{M}=g(\widehat{F})$$
فرض کنید منظور برآورد میانگین جامعه ($$\mu$$) باشد. از آنجایی که تابع توزیع تجربی، تابعی گسسته است، مراحل بالا، به کمک رابطههای زیر پیادهسازی میشود.
$$\large \widehat{F}(x)=\dfrac{1}{n}\sum_{i=1}^nI_{x_i\leq x}\;\;\;$$برآورد تابع توزیع تجربی -EDF
$$\large \widehat{\mu}=g(\widehat{F})=\int xd\widehat{F}= \dfrac{1}{n} \sum_{i=1}^n x_i= \overline{X}$$
برآورد واریانس به روش بوت استرپ
همانطور که به یاد دارید، هدف از اجرای روش بوتاسترپ، برآورد واریانس یک برآوردگر بود. بر این مبنا، موارد زیر را باید در این روش در نظر بگیریم.
- توزیع واقعی جامعه آماری مشخص نیست، بنابراین در روش بوتاسترپ باید از تابع توزیع تجربی (EDF) استفاده کرد.
- برای محاسبه تابع توزیع تجربی از نمونه تصادفی که از جامعه آماری تهیه شده است، کمک میگیریم.
- برای بدست آوردن برآورد $$M=g(F)$$ از تابع توزیع تجربی و $$\widehat{M}=g(\widehat{F})$$ بهره خواهیم برد.
- از شبیهسازی برای تعیین واریانس برآوردگر $$Var (\widehat{M})$$ استفاده خواهیم کرد.
همانطور که به یاد دارید، در شبیهسازی باید توزیع جامعه آماری مشخص باشد. ولی از آنجایی که در روش بوتاسترپ، چنین اطلاعاتی در دسترس نیست، لازم است که از برآورد تابع توزیع تجمعی، یعنی تابع توزیع تجربی استفاده کنیم. به این ترتیب برآورد $$M=g(F)$$ را به کمک $$B$$بار تکرار عمل نمونهگیری و محاسبه برآوردگر، بدست میآوریم. واریانس مقدارهای حاصل از تکرارها نیز واریانس برآوردگر را مشخص میکند. به این ترتیب براساس چهار گام، محاسبات را انجام میدهیم.
- یک نمونه از تابع توزیع تجربی (EDF) استخراج میکنیم.
- برآوردگر $$\widehat{M}=g(\widehat{F})$$ را بدست میآوریم.
- مراحل ۱ و ۲ را به تعداد $$B$$ بار تکرار میکنیم.
- برای بدست آوردن دقت (واریانس) برآوردگر $$\widehat{M}$$، واریانس مقدارهای حاصل از مرحله ۳ را محاسبه میکنیم.
ایده باز نمونهگیری با جایگذاری به چه علت در بوت استرپ استفاده میشود؟
از آنجایی که تابع توزیع تجربی، برای هر مشاهده وزن ثابت و یکسانی در احتمال در نظر میگیرد، میتوان آن را یک نمونهگیری با جایگذاری در نظر گرفت. به این ترتیب داریم:
$$\large P(X=x)=\dfrac{1}{n}$$
به همین علت بازنمونهگیری را در روش بوتاسترپ به صورت با جایگذاری در نظر میگیرند پس هنگام شبیهسازی نیز باید این نکته رعایت شود. به این ترتیب یک نمونه تصادفی از مشاهدات با جایگذاری انتخاب میشود. فرض کنید نمونه اولیه به صورت $$X_1,X_2,\cdots,X_n$$ و نتیجه بازنمونهگیری به شکل $$X^*_1,X^*_2,\cdots,X^*_n$$ باشند.
همانطور که در بخش شبیهسازی گفته شد، با توجه به مشخص بودن توزیع $$P$$ در جامعه آماری میتوانیم شبیهسازی را مبنای محاسبه واریانس برآوردگر $$M$$ در نظر بگیریم. به تصویر زیر که برآورد پارامتر و واریانس آن را به کمک شبیهسازی نشان میدهد، توجه کنید.
نمونههای گرفته شده در این شبیهسازی از جامعهای با توزیع مشخص و ثابت $$P$$ تهیه شدهاند. از آنجایی که در روش بوتاسترپ، مشخصات و ویژگیهای جامعه آماری مشخص نیست، از برآورد تابع توزیع تجمعی استفاده خواهیم کرد. به تصویر زیر در این زمینه توجه کنید.
پیاده سازی الگوریتم بوت استرپ با پایتون
در ادامه کد پایتون، به منظور پیادهسازی الگوریتم بوتاسترپ دیده میشود. در هر مرحله، ورودی و خروجی مشخص شدهاند. در این کد فرض بر این است که میانگین و واریانس آن باید براساس یک نمونه تصادفی برآورد شود.
Bootstrap Simulation
Statistic: Mean
ورودی ۱۷:
# draw a sample from population sample = np.random.choice(pickups, size=30) sample
خروجی ۱۷:
array([435, 205, 348, 264, 91, 319, 270, 484, 445, 102, 319, 330, 385, 58, 419, 475, 343, 1, 34, 102, 443, 372, 445, 445, 80, 366, 419, 149, 264, 330])
ورودی ۱۸:
# bootstrap for mean boot_means = [] for _ in range(10000): bootsample = np.random.choice(sample,size=30, replace=True) boot_means.append(bootsample.mean())
ورودی ۱۹:
# simulated mean of mean bootmean = np.mean(boot_means)
ورودی ۲۰:
# simulated standard deviation of mean
bootmean_std = np.std(boot_means)
ورودی ۲۱:
# simulated mean VS true mean (pickups.mean(), bootmean)
خروجی 21:
(252.7, 291.44874000000004)
ورودی ۲۲:
# the theoretical standard error and simulated standard error (pickups.std()/(30 ** 0.5), bootmean_std)
خروجی ۲۲:
(26.336951228264823, 26.85003412725247)
همانطور که میبینید مقدار پیشبینی شده انحراف استاندارد (جذر واریانس) براساس روش بوتاسترپ (26.850034) به مقدار انحراف استاندارد میانگین نمونهای براساس دادهها ۱۰۰ تایی (26.580034) بسیار نزدیک است.
نتیجهگیری
همانطور که مشخص شد، تفاوتهای مهمی بین روش شیبهسازی و بوتاسترپ وجود دارد. تصویر زیر این دو روش را به خوبی مقایسه کرده است.
در این نوشتار، سعی کردیم که برای درک عملکرد روش بوت استرپ به اصطلاحات آماری پیچیده نپردازیم و براساس مثالهای عددی و تصویرهای مختلف، با این تکنیک آماری آشنا شویم. امروزه با توجه به قدرت پردازش زیاد رایانهها و امکانات شبیهسازی میتوانیم برآوردهای با دقت مناسب را به کمک روش بوت استرپ ایجاد کنیم.
اگر به فراگیری مباحث مشابه مطلب بالا علاقهمند هستید، آموزشهایی که در ادامه آمدهاند نیز به شما پیشنهاد میشوند:
- مجموعه آموزش های SPSS
- مجموعه آموزش های Minitab
- مجموعه آموزشهای آمار، احتمالات و دادهکاوی
- آموزش روش های نمونه برداری و بازرسی در کنترل کیفیت
- نمونهگیری و بازنمونهگیری آماری (Sampling and Re-sampling) — به زبان ساده
- جامعه آماری — انواع داده و مقیاسهای آنها
- جک نایف و بوت استرپ (Jackknife and Bootstrap) روش های باز نمونهگیری — به زبان ساده
^^