آمار, داده کاوی 273 بازدید

تکنیک رگرسیون خطی یکی از روش‌های بهینه سازی خطی است که در آمار به منظور ایجاد یک مدل خطی بین متغیر وابسته و متغیرهای مستقل به کار می‌رود. در حقیقت رگرسیون، با استفاده از کمینه‌سازی عبارت خطا در مدل رگرسیونی، سعی در برآورد پارامترهای مدل می‌کند و محاسبات را به شکلی انجام می‌دهد که مجموع مربعات خطا کمینه شود. در این نوشتار از مجله فرادرس به بررسی و پیاده سازی رگرسیون چندگانه و کدهای مرتبط با آن در زبان برنامه‌نویسی R خواهیم پرداخت. البته ابتدا فرمول‌ها و شرایط اولیه را مورد بررسی قرار داده، سپس کد و مثالی برای اجرای مدل رگرسیونی خطی را اجرا خواهیم کرد.

برای آشنایی بیشتر با مدل رگرسیون خطی، بهتر است مطالب دیگر مجله فرادرس با عنوان‌های رگرسیون خطی — مفهوم و محاسبات به زبان ساده و رگرسیون خطی چندگانه (Multiple Linear Regression) — به زبان ساده را مطالعه کنید. همچنین خواندن مطالب هم خطی در مدل رگرسیونی — به زبان ساده و انواع روش های رگرسیونی — راهنمای جامع نیز خالی از لطف نیست.

پیاده سازی رگرسیون چندگانه

همانطور که گفته شد، محاسبات مربوط به رگرسیون خطی با چند متغیر مستقل، وابسته به جبر خطی و ماتریسی است. از آنجایی که این گونه محاسبات به صورت دستی، به سختی صورت می‌گیرد، از زبان برنامه‌نویسی R کمک گرفته و درست به همان شیوه‌ای که در محاسبات جبر خطی و به منظور بهینه‌سازی مربعات خطای مدل، برآوردها را انجام می‌دهیم، فرمول‌ها را به کار برده و نسبت به پیاده سازی رگرسیون چندگانه اقدام خواهیم کرد.

مقدمات و تعریف مدل رگرسیون چندگانه

فرض کنید $$X$$ یک ماتریس با $$n$$ سطر و $$k$$ ستون است. در این صورت آن را به شکل زیر در نظر می‌گیریم. این مقادیر همان مشاهدات برای هر یک از ابعاد یا متغیرها محسوب می‌شود. بنابراین ماتریس $$X$$ را ماتریس مشاهدات در نظر می‌گیریم.

$$ \large {\displaystyle X = \left(\begin{array}{c}X’_1\\X’_2\\ \vdots \\ X’_n \end{array}\right) } $$

واضح است که $$X_i$$ یک بردار ستونی به صورت $$k$$ سطر و یک ستون است. به همین منظور $$X_i’$$، ترانهاده آن محسوب می‌شود که رابطه بالا را به یک ماتریس تبدیل می‌کند. توجه داشته باشید که اندیس $$i$$‌ بیانگر مشاهده $$i$$ام است.

نکته: همانطور که گفته شد، $$X$$ یک ماتریس $$n \times k $$ است که $$n$$ تعداد مشاهدات و $$k$$ تعداد متغیرهای مستقل است.

متغیر وابسته یا $$Y$$ را هم به صورت یک بردار با $$n$$ سطر در نظر بگیرید. در اینصورت $$y = (y_1, \ldots, y_n)’$$ یک بردار ستونی خواهد بود.

طبق مدل OLS یا همان «کمترین مربعات عادی» (Ordinary Least Square)، برآورد حاصل کمینه‌سازی خطا به صورت زیر خواهد بود.

$$ \large {\displaystyle \widehat{\beta} = (X’X)^{-1}X’y }$$

از طرفی ماتریس کوواریانس-واریانس برآوردگرهای OLS نیز به شکل زیر خواهد بود.

$$ \large {\displaystyle \widehat{\sigma} (X’X)^{-1} }$$

که در آن $$\widehat{\sigma}$$ به وسیله رابطه زیر برآورد می‌شود.

$$ \large {\displaystyle \widehat{ \sigma} = \dfrac{ \sum_{i = 1}^n \widehat{u}_i}{n – k}}$$

برآورد خطا ($$\widehat{u}_i$$) نیز بر طبق رابطه زیر حاصل می‌شود.

$$ \large {\displaystyle \widehat{u}_i = y_i – X_i’ \widehat{\beta} }$$

نکته: مدل مطرح شده در قسمت بالا، با این شرط نوشته شده است که مدل رگرسیونی دارای عرض از مبدا (Intercept) نیست. اگر مدل به همراه عرض از مبدا (مقدار ثابت به عنوان میانگین) در مدل لحاظ شود، باید ماتریس $$X$$ را به صورت زیر در نظر بگیریم. به این ترتیب خواهیم داشت:

$$ \large {\displaystyle X = \left(\begin{array}{c}1 & X’_1\\ 1 &X’_2\\ \vdots \\1 & X’_n \end{array}\right) } $$

به یاد داشته باشید که هنگام پیاده سازی رگرسیون چندگانه با کدهای R، به این موضوع توجه خواهیم داشت.

برای مثال مدل رگرسیون زیر را با دو متغیر مستقل و عبارت عرض از مبدا در نظر بگیرید.

$$ \large {\displaystyle y_i = \beta_0 + \beta_1 x_{1,i} + \beta_2 x_{2,i} + u_{i}\;\;, \;\;\;\;\; i = 1 , 2 , \ldots ,n }$$

در این صورت مدل رگرسیونی را به صورت ماتریس و برداری به شکل زیر خواهیم نوشت:

$$ \large {\displaystyle y  = X \beta + u } $$

در رابطه بالا، بردارها و ماتریس‌ها به شکل زیر معرفی می‌شوند. ابتدا متغیرهای مستقل و وابسته را معرفی می‌کنیم.

$$ \large {\displaystyle X = \left(\begin{array}{c} 1 & x_{1,1} & x_{1,2} \\ 1 & x_{2,1}
& x_{2,2} \\ \vdots& \vdots & \vdots \\1 & x_{n,1} & x_{n,2} \end{array} \right) } $$

و

$$ \large {\displaystyle y = \left(\begin{array}{c} y_1 \\ y_2 \\ \vdots \\ y_n \end{array}\right) } $$

و پارامترها مدل رگرسیونی و عبارت خطا نیز به ترتیب به شکل زیر نوشته خواهند شد.

$$ \large {\displaystyle \beta = \left(\begin{array}{c}\beta_0 \\ \beta_1\\ \beta_2 \end{array}\right) } $$

و

$$ \large {\displaystyle u = \left( \begin{array}{c} u_1 \\ \vdots \\ u_n \end{array} \right) } $$

به این ترتیب با اجرای محاسباتی که برای برآورد پارامترها مدل رگرسیونی بیان شد، می‌توان مدل خطی را ساخت و خطای مدل را هم محاسبه کرد.

به منظور آشنایی با نحوه کار با نرم‌افزار R و ایجاد کلاس و لیست‌ها در گزارشات خروجی می‌توانید فیلم آموزش برنامه‌ نویسی R و نرم‌ افزار RStudio – تکمیلی را ببینید که توسط فرادرس ارائه و لینک آن در ادامه آورده شده است.

  • آموزش برنامه‌ نویسی R و نرم‌ افزار RStudio – تکمیلی + کلیک کنید.

کدهای پیاده‌سازی محاسبات رگرسیون چندگانه

پیاده‌سازی رگرسیون چندگانه (تک متغیره و چندگانه) در زبان برنامه‌نویسی R به استفاده از تابع lm و معرفی پارامترهای مربوطه قابل اجرا است. کافی است که متغیر وابسته و مستقل را از یک چارچوب داده مشخص کرده و به کمک عملگر  معرفی مدل (~)، نوع رابطه بین متغیر مستقل و وابسته را مشخص کنید. برای آشنایی بیشتر با این شیوه اجرای رگرسیون خطی، بهتر است به نوشتار دیگری از مجله فرادرس با عنوان روش‌های رگرسیون در R — کاربرد در یادگیری ماشین (قسمت اول) مراجعه فرمایید.

ولی در ادامه این متن نحوه پیاده سازی رگرسیون چندگانه را بدون استفاده از توابع از پیش تعریف شده در زبان برنامه‌نویسی R، معرفی خواهیم کرد. قطعه کدی که در زیر مشاهده می‌کنید، همان محاسبات گفته شده را گام به گام طی کرده و نتیجه برآورد را در خروجی تابعی که به نام linear_regression معرفی شده، نشان می‌دهد.

تابع linear_regression یک شی رگرسیون خطی از نوع کلاس رگرسیون خطی (linear_regression) ایجاد می‌کند. در ابتدای پیاده سازی رگرسیون چندگانه در کد بالا، این تابع به همراه ورودی‌هایش مشخص شده است. توجه داشته باشید که هدف در این کد برای پیاده سازی رگرسیون چندگانه، ایجاد دو کلاس برای چاپ و رسم خروجی‌های حاصل از تابع linear_regression است.

پارامتر اول (data)، یک چارچوب داده (Dataframe) است که ستون‌های مربوط به متغیر وابسته (dep) و مستقل (indep) نیز با ذکر اسامی آن‌ها در چارچوب data مشخص می‌شود. برای آشنایی با نحوه ورود پارامترها به مثالی که در ادامه مشاهده خواهید کرد، توجه کنید. در انتها نیز پارامتر منطقی intercept، با مقدار پیش‌فرض TRUE، نوع مدل رگرسیونی را با توجه به حضور یا عدم عرض از مبداء، تعیین می‌کند.

در خطوط بعدی، با استفاده از تابع as.matrix متغیرهای مستقل به یک ماتریس، مطابق با فرمول‌های بالا تبدیل می‌شوند. همچنین به منظور امکان اجرای محاسبات ماتریسی و برداری، متغیر وابسته نیز به شکل یک ماتریس در می‌آید. توجه داشته باشید که با حضور عرض از مبدا، به ماتریس متغیرهای مستقل، یک ستون با مقادیر ۱ اضافه می‌شود.

در قسمت بعدی نیز با توجه به فرمول گفته شده، برآورد پارامترها در متغیر beta قرار داده می‌شود. این متغیر، از نوع بردار است که هر یک از مقادیر $$\beta_0$$ تا $$\beta_2$$ را در خود جای خواهد داد.

نکته: تابع crossprod همان محاسبه ضرب ترانهاده یک ماتریس در ماتریس دیگر را نشان می‌دهد. بنابراین (crossprod(x,y همان محاسبه $$X’y$$ است. در صورتی که پارامتر دوم در این تابع مشخص نشده باشد، حاصل ضرب ترانهاده یک ماتریس در خودش حاصل می‌شود، در نتیجه (crossprod(x نیز مربوط به بدست آوردن $$X’X$$‌ است. برای بدست آوردن معکوس این ماتریس نیز از تابع solve استفاده شده است.

متغیر fit، شامل مقادیر برازش شده بوده که نتایج را به صورت یک بردار ذخیره می‌کند. عملگر %*%، همان ضرب ماتریسی معمولی است. باقی‌مانده‌های مدل رگرسیونی نیز در resids و براساس تفاضل مقدار واقعی و برازش شده توسط مدل، حاصل شده است.

در بخش بعدی از کد نیز برآورد واریانس (sigma2) و خطای برآورد (se) طبق فرمول‌های بخش قبلی، مورد محاسبه قرار گرفته و مشخص شده است.

در انتهای کد نیز خروجی به کمک دستور return طبق یک لیست (list) به صورت مقادیر پارامترها (beta)،  خطای استاندارد (se)، بردار سطری باقی‌مانده‌ها (residuals) بردار سطری مقادیر برازش شده (fitted)، انحراف معیار متغیر وابسته (sigma) که توسط جذر گیری از واریانس بدست آمده و همچنین نام متغیرهای مستقل (indp) و وابسته (dep) به همراه وضعیت حضور عرض از مبدا (intercept) و مقادیر بردار سطری متغیر وابسته (y)، مشخص شده است.

تا اینجا انجام محاسبات مربوط به پیاده سازی رگرسیون خطی چندگانه به پایان رسیده است. ولی می‌خواهیم با ایجاد دو کلاس برای چاپ خروجی کار را به پایان ببریم.

نوشتن دو روش برای کلاس رگرسیون خطی به گونه‌ای است که اگر obj کلاس باشد رگرسیون خطی خروجی‌ها را به صورتی که در ادامه می‌خوانید ارائه دهد.

  1. چاپ (obj) چاپ جدول بر روی کنسول یک جدول با ردیف 1) نام از متغیرها، 2) ضرایب برآورد شده و 3) خطای استاندارد برآوردگرها.
  2. رسم نمودار (obj) به صورت یک نمودار پراکندگی از مشاهدات مرتب شده که در محور افقی شماره یا اندیس مشاهده و در محور عمودی نیز مقدار واقعی و برآورد شده برای متغیر وابسته نمایش داده شود. این کار را به کمک کتابخانه ggplot2 اجرا خواهیم کرد.

ابتدا با یک مثال برای تابع linear_regression پرداخته، سپس کلاس‌های print و plot را تعریف می‌کنیم. به این ترتیب پیاده سازی رگرسیون چندگانه را به شکل دلخواه انجام داده‌ایم.

در کتابخانه ggplot2، یک چارچوب داده به نام economics وجود دارد که از آن برای اجرای مدل رگرسیون خطی استفاده می‌کنیم. بهتر است از دستور زیر به منظور نمایش محتویات چند سطر اول این فایل اطلاعاتی کمک بگیرم.

مشخص است که این مجموعه، شامل ۶ متغیر بوده که میزان رشد اقتصادی را در سال‌های مختلف بر حسب پارامترهای pce، pop، psavert  uempmed و unemploy مشخص می‌کند. می‌خواهیم مقدار pce را به کمک بقیه متغیرها، طبق یک مدل خطی، برآورد و پیش‌بینی کنیم.

دستورات زیر به این منظور نوشته شده‌اند. به وضعیت معرفی متغیرهای مستقل (indep) و وابسته (dep) در تابع linear_regression توجه کنید.

کلاسی که برای  obj معرفی شده، همان linear_regression است که توسط فرمان (class(obj مشخص شده است.

برای نمایش خروجی به شکلی که فقط مقادیر مورد نظر از نتایج پیاده سازی رگرسیون چندگانه ظاهر شود، کلاس  print را تغییر داده و معرفی کرده‌ایم. همانطور که مشخص است، با بهره‌گیری از تابع cat، نتایج به به دلخواه توسط فرمان print ظاهر کرده‌ایم.

در قسمت انتهایی به کمک کلاسی که از تابع plot ایجاد کرده‌ایم، نمودار را به کمک کتابخانه ggplot2‌ و با دستور ggplot و ملحقات آن (مانند معرفی محورها، نحوه ترسیم نقاط و برچسب‌ها) انجام داده‌ایم. به این ترتیب خروجی دستور plot برای obj به گونه‌ای متفاوت از دستور plot عادی عمل خواهد کرد و عملیات پیاده سازی رگرسیون چندگانه در زبان R به پایان می‌رسد.

کافی است ابتدا تابع را اجرا کرده، سپس، کلاس‌های تعریف شده را با کلید‌های میانبر ctrl+R در حافظه قرار دهید. به این ترتیب با فراخوانی قسمت کد مربوط به مثال، نتایج زیر حاصل خواهد شد.

نکته: با اجرای هر یک از دستورات print و plot، مطابق با کد مورد نظر، خروجی‌ها به صورت زیر ساخته می‌شوند. واضح است که این خروجی‌ها، مطابق با درخواست شما در کد برنامه، تعیین شده‌‌اند.

همانطور که در ادامه مشاهده می‌کنید، شکل خروجی توسط فرمان print تغییر یافته و فقط «پارامترها برآورد شده» (Coefficient) و «خطای برآورد» (SE) نمایش داده شده است.

print output
معرفی کلاس و دریافت خروجی جدید از دستور print

به این ترتیب خروجی حاصل از اجرای دستور (plot(obj دیگر به شیوه عادی در R اجرا نشده و مطابق با کلاسی که معرفی کرده‌اید، نمودار ترسیم و به کمک کتابخانه ggplot2 رسم می‌شود.

plot output
معرفی کلاس و دریافت خروجی جدید از دستور plot

معرفی فیلم آموزش برنامه‌ نویسی R و نرم‌ افزار RStudio – تکمیلی

خوشبختانه فرادرس در زمینه آموزش پایه‌ای نرم‌افزار برنامه‌نویسی و محاسباتی R دو آموزش ارائه کرده است که در این بخش به معرفی آموزش تکمیلی نرم افزار R خواهیم پرداخت. در بخش مقدماتی بسیاری از مباحث مربوط به مفاهیم برنامه‌نویسی در R معرفی شده ولی در بخش تکمیلی، بعضی از توابع پرکاربرد و با اهمیت این زبان برنامه‌نویسی به همراه ابزارهای همراه آن معرفی شده است.

آموزش برنامه نویسی R تکمیلی advanced r programming

این دروه آموزشی حدود ۵ ساعت و ۱۶ دقیقه محتوای ویدیویی دارد که به مباحث خاصی از زبان برنامه‌نویسی R اختصاص یافته‌اند؛ این مباحث در ادامه به صورت فهرست‌وار مورد اشاره قرار گرفته‌اند.

  • نحوه ورود اطلاعات به نرم‌افزار R
  • بررسی توابع خانواده Apply
  • ردیابی ایرادات و خطاهای برنامه نویسی
  • بررسی بسته نرم افزاری Shiny
  • بررسی بسته نرم افزاری R Markdown

اشاره به بسته‌های اختصاصی R با نام‌های Shiny و R Markdown از مزیت‌های اصلی این آموزش محسوب می‌شود که در کمتر جایی به آموزشی در این زمینه برخورد خواهید کرد. بسته Shiny اجازه انجام محاسبات آماری را در بستر وب در اختیارتان قرار می‌دهد. همچنین با استفاده از کتابخانه R Markdown، می‌توانید نمایش گزارشات و نتایج تحقیقات آماری خود را به صورت متنی و در لابلای محتویات قرار دهید.

  • برای مشاهده فیلم آموزش برنامه‌ نویسی R و نرم‌ افزار RStudio – تکمیلی + کلیک کنید.

خلاصه و نتیجه‌گیری

در این نوشتار با ذکر یک مثال، به بررسی و نحوه پیاده سازی رگرسیون چندگانه پرداخته و همچنین مدل حاصل و پارامترهای آن را در زبان برنامه‌نویسی R، مرور کردیم. همانطور که در انتهای این متن مشاهده کردید، ایجاد کلاس برای بعضی از توابع معمول در زبان R ساده است و می‌توان خروجی هر یک از توابع را به دلخواه در آورده و به عنوان خروجی نمایش دهیم. هر چند در دیگر نوشتارهای مجله فرادرس به رگرسیون چندگانه پرداخته شده است، ولی در این مطلب نحوه محاسبه را بدون بهره‌گیری از تابع lm درون R، انجام داده فرمول‌ها را مطابق با شیوه رگرسیون خطی، به صورت ماتریسی بدست آوردیم.

اگر این مطلب برای شما مفید بوده است، آموزش‌ها و مطالب زیر نیز به شما پیشنهاد می‌شوند:

آرمان ری بد (+)

«آرمان ری‌بد» دکتری آمار در شاخه آمار ریاضی دارد. از علاقمندی‌های او، یادگیری ماشین، خوشه‌بندی و داده‌کاوی است و در حال حاضر نوشتارهای مربوط به آمار و یادگیری ماشین را در مجله فرادرس تهیه می‌کند.

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *