رگرسیون چیست و چه کاربردی در زبان برنامه نویسی R دارد؟
رگرسیون چیست
رگرسیون چیست: رگرسیون یک روش آماری بوده و در اقتصاد، برنامه نویسی و فعالیت های دیگر استفاده می شود. هدف رگرسیون شناسایی قدرت و خواص یک متغیر وابسته نسبت به متغیرهای دیگر (که به متغیر های مستقل معروفند) میباشد.
رگرسیون به سرمایهگذاران و مدیران مالی شرکتها کمک میکند تا ارزش داراییهای خود را ارزیابی کرده و رابطه بین متغیرهایی مثل قیمت اجناس و سهام شرکتهای فعال در زمینه مرتبط با آن را، بهتر درک کنند.
انواع رگرسیون چیست
رگرسیون را میتوان در سه دسته تقسیمبندی کرد که عبارتند از رگرسیون خطی، غیرخطی و رگرسیون خطی چندگانه (چند متغیره). در روش خطی برای توصیف یا پیشبینی خروجی ناشی از چند متغیر مستقل، تنها بر اساس یک متغیر وابسته انجام میگیرد. در رگرسیون چند متغیره برای همین منظور از دو یا چند متغیر وابسته استفاده میشود.
رگرسیون غیر خطی برای مواردی استفاده می شود که به دنبال یافتن رابطهای غیر خطی بین متغیرها هستیم. از این روش در محاسبات بسیار پیچیده استفاده میشود.
این روش آماری کمک زیادی به سرمایهگذاران و اقتصاد دانان حرفه ای کرده و حتی میتواند برای متخصصان شغل های دیگر نیز مفید باشد. با استفاده از رگرسیون می توان بر اساس قیمتهای قبلی، وضعیت آب و هوا، افزایش تولید ناخالص و عوامل دیگر، قیمت جدیدی برای محصولات تعیین کرد.
مدل CAPM
مدل CAPM (قیمت گذاری دارایی های سرمایه ای) یک مدل پرکاربرد در رگرسیون بوده که ارتباط بین ریسک و نرخ بازده مورد انتظار بر اساس داراییها را نشان میدهد.
فرمول کلی رگرسیونهای خطی به صورت زیر است:
خطی= Y = a + bX + u
غیر خطی= Y = a + b1X1 + b2X2 + b3X3 + ... + btXt + u
شرح فرمول های فوق به شکل زیر است:
- Y= متغیری که می خواهید آن را پیش بینی کنید.
- X= متغیری که از آن برای پیش بینی Y استفاده کرده ایم.
- A=نقطه دلخواه
- B= شیب
- U=باقیمانده رگرسیون
رگرسیون گروهی از متغیرهای تصادفی (که امکان پیش بینی Y با کمک آنها وجود دارد) را انتخاب کرده و سعی میکند رابطه ریاضی بین آنها را پیدا کند. معمولا این رابطه به شکل یک خط راست بوده (به همین دلیل این روش را خطی می نامند) که به بهترین نحو ممکن به تمامی نقاط نزدیک است.
رگرسیون غیر خطی
در روش غیرخطی یک مدل از دادهها ایجاد میشود و سپس به صورت یک تابع ریاضی مطرح میگردد. همانطور که اشاره شد، در روش خطی با استفاده از یک متغیر سعی میکنیم مقدار متغیر دیگر را پیشبینی کنیم که در نهایت به یک خط راست دست پیدا خواهیم کرد. اما در رگرسیون غیرخطی، خروجی به شکل منحنی است، گویی هر مقداری که برای Y به دست آمده کاملا تصادفی بوده است.
هدف رگرسیون غیر خطی این است که تا جای ممکن مجموع مربعات را کاهش دهد. مجموع مربعات معیاری است که نشان میدهد مشاهدات با میانگین مجموع دادهها تا چه حد تفاوت دارد. محاسبات با یافتن تفاضل بین میانگین کل داده ها با هر نقطه آغاز میشود.
سپس مربع هر کدام از این تفاضلها محاسبه میشود. در نهایت تمامی این مربعات با هم جمع میشوند. هرچه مقدار مجموع مربعات کمتر باشد، تابع به نقاط داده نزدیکتر خواهد بود. در روش غیر خطی از توابع لگاریتمی، مثلثاتی، نمایی، توان، منحنی لورنز، توابع گاوسی و روشهای مناسب دیگر استفاده میشود.
رگرسیون خطی و غیر خطی از این منظر مشترکند که هر دو سعی دارند بر اساس یک سری متغیر، رابطه ای گراف مانند ایجاد کنند. از آنجایی که در روش غیر خطی توابع از طریق نمونه سازی و آزمون و خطا بدست میآید، بسیار پیچیده تر است. به همین علت، ریاضیدانان از روشهای تست شدهای مثل، روش گاوس نیوتن و الگوریتم لونبرگ مارکوارت، استفاده میکنند.
مدل های رگرسیون چیست
اغلب مدل های رگرسیون در نگاه اول به نظر غیرخطی میآیند، اما در واقع خطی هستند. میتوان برای تشخیص ماهیت رابطه بین دادههای موجود از روش تخمین منحنی استفاده کرد.
با توجه به الگوریتمی که در رگرسیون مورد استفاده قرار گرفته، ممکن است خط ایجاد شده در روش خطی، حالتی منحنی شکل داشته و در روش غیر خطی، یک خط تقریبا مستقیم ایجاد شود. این قبیل معادلات غیر خطی را ذاتا خطی مینامند.
رگرسیون لجستیک
رگرسیون لجستیک برای اولین بار در اوایل قرن بیستم و در علم زیست شناسی مورد استفاده قرار گرفت. از این روش زمانی استفاده می شود که متغیر وابسته تنها دو حالت می تواند داشته باشد، مثبت یا منفی. برای مثال در پزشکی بیمار می تواند دو حالت داشته باشد یا می میرد یا شفا پیدا می کند.
حالتی را در نظر بگیرید که در آن بیماری دچار سرطان است. اگر بخواهیم برای تشخیص وخامت و بدخیم بودن بیماری او، از روش خطی استفاده کنیم، باید برای بیماری حد وخامت تعیین کنیم.
حال فرض کنید حد وخامت را 0.5 در نظر گرفته باشیم و پاسخ به دست آمده در مدل 0.4 باشد. در این صورت سرطان بیمار فوق وخیم تشخیص داده نخواهد شد، در حالی که وضعیت او بسیار نامناسب است. این حالت در شرایط واقعی، میتواند عواقب جبرانناپذیری به همراه داشته باشد. از این رو روش خطی برای حالاتی که فقط دارای دو موقعیت هستند و حد وسط ندارند، کارایی ندارد.
رگرسیون غیر خطی در زبان برنامه نویسی R
رگرسیون در زبان برنامه نویسی R هم قابل اجرا است اما در برخی موارد رابطه بین خروجی و تخمین زن، خطی نیست. برای حل این مشکل و توسعه مدل خطی روشهای مختلفی وجود دارد. این روشها عبارتند از:
رگرسیون چند جمله ای
این روش، رویکردی ساده در مدل غیرخطی است. در این روش به جای استفاده از مربع یا مکعب (Square یا Cubes و …) از کلمه کلیدی Polynominal استفاده می کنیم.
رگرسیون اسپلین
در این روش یک منحنی ملایم با استفاده از چند جملهایها ایجاد می شود. مقادیری که قسمتهای مختلف اسپلین را محدود میکنند به گره یا knots معروفند.
مدل عمومی افزایشی
مدل اسپلین را با تعیین گرههای خودکار قابل قبولتر می کند.
بسته های لازم برای یادگیری مثال:
Tidyverse برای دستکاری و قابل مشاهده کردن ساده تر داده ها.
Caret برای استفاده در یادگیری ماشین.
library(tidyverse)
library(caret)
theme_set(theme_classic())
آماده سازی داده ها
در این مثال از دیتا ست Boston، برای محاسبه متوسط قیمت خانهها (mdev) بر اساس متغیر تخمینزن 1stat، استفاده خواهیم کرد. دیتا ست به صورت تصادفی به دو بخش تقسیم خواهد شد که 80% آن برای ایجاد مدل تخمینزن و 20% آن برای اعتبار سنجی مدل ایجاد شده مورد استفاده قرار خواهد گرفت.
# Load the data
data("Boston", package = "MASS")
# Split the data into training and test set
set.seed(123)
training.samples <- Boston$medv %>%
createDataPartition(p = 0.8, list = FALSE)
train.data <- Boston[training.samples, ]
test.data <- Boston[-training.samples, ]
ابتدا نقشه پراکندگی mdev بر اساس 1stat را با استفاده از کدهای زیر مشاهده کنید:
ggplot(train.data, aes(lstat, medv) ) +
geom_point() +
stat_smooth()
پیاده سازی رگرسیون خطی در زبان برنامه نویسی R
برای پیادهسازی یک مدل رگرسیون استاندارد میتوان از کدهای زیر استفاده کرد:
# Build the model
model <- lm(medv ~ lstat, data = train.data)
# Make predictions
predictions <- model %>% predict(test.data)
# Model performance
data.frame(
RMSE = RMSE(predictions, test.data$medv),
R2 = R2(predictions, test.data$medv)
)
خروجی:
## RMSE R2
## 1 6.07 0.535
برای مشاهده نتیجه حاصل از کدهای زیر استفاده کنید:
ggplot(train.data, aes(lstat, medv) ) +
geom_point() +
stat_smooth(method = lm, formula = y ~ x)
رگرسیون غیر خطی چند جمله ای
همانطور که قبلا نیز اشاره شد، در این روش به جای استفاده از Cubes، Square و … از کلمه کلیدی polynominal استفاده میکنیم.
در محیط R برای اینکه بتوانید عددی را به توان برسانید باید از دستور I() استفاده کنید. برای مثال I(X^2). با این کار X را به توان دو میرسانیم. برای محاسبه این مدل در R از کد های زیر استفاده میکنیم:
lm(medv ~ lstat + I(lstat^2), data = train.data)
روش دیگری که برای اجرای این مدل وجود دارد عبارت است از:
lm(medv ~ poly(lstat, 2, raw = TRUE), data = train.data)
برنامه اصلی به این صورت خواهد بود:
##
## Call:
## lm(formula = medv ~ poly(lstat, 2, raw = TRUE), data = train.data)
##
## Coefficients:
## (Intercept) poly(lstat, 2, raw = TRUE)1
## 43.351 -2.340
## poly(lstat, 2, raw = TRUE)2
## 0.043
همانطور که مشاهده میکنید در برنامه بالا دو ضریب وجود دارد. یک ضریب برای حالت خطی(lstat^1) و دیگری برای حالت درجه دوم (lstat^2).
# پیاده سازی مدل
model <- lm(medv ~ poly(lstat, 5, raw = TRUE), data = train.data)
# تخمین زنی
predictions <- model %>% predict(test.data)
# عملکرد مدل
data.frame(
RMSE = RMSE(predictions, test.data$medv),
R2 = R2(predictions, test.data$medv)
)
خروجی:
## RMSE R2
## 1 4.96 0.689
برای مشاهده پراکندگی نقاط از دستور زیر استفاده کنید:
ggplot(train.data, aes(lstat, medv) ) +
geom_point() +
stat_smooth(method = lm, formula = y ~ poly(x, 5, raw = TRUE))
امیدواریم تا به اینجا با مفهوم رگرسیون چیست آشنا شده باشید.