رگرسیون غیر خطی در R — به زبان ساده
در آمار، «رگرسیون غیرخطی» (Nonlinear Regression)، یکی از روشهای «تحلیل چند متغیره» (Multivariate Analysis) است که در آن، دادهها توسط یک تابع غیرخطی از پارامترها، مدلسازی میشوند. برای آشنایی با مفاهیم اولیه در مورد رگرسیون و برآورد پارامترهای آن بهتر است مطلب رگرسیون خطی — مفهوم و محاسبات به زبان ساده را مطالعه کنید.
رگرسیون غیرخطی
اگر رابطه بین متغیرهای مستقل و وابسته به شکل یک تابع غیرخطی نسبت به پارامترها باشد، میتوان برآورد پارامترهای مدل را به کمک رگرسیون غیرخطی بدست آورد.
معمولا در این حالت مدل را به صورت زیر نمایش میدهند.
این شیوه نمایش بیان میکند که بین بردار y به عنوان متغیر وابسته و بردارهای متغیرهای مستقل رابطهای مانند f با توجه به پارامترهای وجود دارد. برای مثال اگر تابع f را به صورت زیر در نظر بگیریم، نشان دهنده یک رابطه غیرخطی برحسب پارامترها خواهد بود:
این تابع نسبت به پارامترها غیرخطی است زیرا نمیتواند به صورت یک ترکیب خطی از ضرایب نوشته شود. پس هدف در این روش بدست آوردن تابعی است که با توجه به دادهها بهترین برازش را داشته یا حداقل تقریبی برای تابع مورد نظر باشد.
برعکس روشهای رگرسیون خطی، برای پیدا کردن پارامترهای تابع غیرخطی f فرم بستهای وجود ندارد و معمولا به کمک تکنیکها و «الگوریتمهای بهینهسازی» (Optimization Algorithm) سعی میشود پارامترهای مدل برآورد شود. در اینجا به چند روش ساده ولی کارا میپردازیم.
تخمین تابع به کمک بسط تیلور
در این روش فرض بر این است که میتوان یک تابع خطی را برای تخمین تابع f به کار برد. همچنین میدانیم که تابع f نسبت به پارامترهایش مشتق پذیر است. در این حالت میتوان رابطه تقریبی زیر را برای تابع f و به کمک بسط تیلور نوشت:
در این رابطه منظور از مشتق تابع f در نقطه نسبت به پارامتر است. حال اگر روش کمترین مربعات خطا را به کار ببریم، برآورد پارامترها به صورت زیر درخواهد آمد:
نکته: در این رابطهها منظور از ، «ترانهاده» (Transpose) ماتریس J است به این معنی که جای سطرها با ستونها در ماتریس J عوض خواهد شد تا ماتریس حاصل شود.
از آنجایی که این مشتقات ممکن است خود وابسته به پارامترهای مدل باشند، باید به کمک روشهای عددی طوری عمل کرد که کمترین مربعات خطا حاصل شود. برای انجام این کار ابتدا یک حدس اولیه در نظر میگیریم و سعی میکنیم با تغییر دادن این مقدارها، کمترین مربعات خطا را بدست آوریم. در ادامه به بررسی یک مثال و اجرای یک کد به منظور برآورد پارامترهای مدل شبیهسازی شده میپردازیم.
مثال 1
فرض کنید براساس دادههای شبیهسازی شده میخواهیم پارامترهای مدل رگرسیون غیرخطی به شکل زیر را برآورد کنیم.
از کد زیر که با زبان برنامهنویسی R نوشته شده کمک گرفته و محاسبات را انجام میدهیم.
1#simulate some data
2set.seed(12345)
3x<-seq(1,50,1)
4y<-((20*x)/(10+x))+rnorm(50,0,1)
5#for simple models nls find good starting values for the parameters even if it throw a warning
6m<-nls(y~a*x/(b+x))
7m
8#get some estimation of goodness of fit
9cor(y,predict(m))
10plot(x,y)
11lines(x,predict(m),lty=2,col="red",lwd=3)
ابتدا یک دنباله از اعداد ۱ تا ۵۰ به عنوان متغیر مستقل تولید کردهایم. برای شبیهسازی دادههای مربوط به متغیر وابسته (y) همانطور که دیده میشود، پارامتر اول یعنی ضریب متغیر X برابر با a=۲۰ و پارامتر دوم نیز b=۱۰ در نظر گرفته شده است. برای اینکه دادههای شبیهسازی، تصادفی باشند، یک «نوفه» (Noise)، از اعداد تصادفی با توزیع نرمال به مقدارها اضافه شده است.
به کمک دستور nls که مخفف Nonlinear Least Square است، میتوانید رگرسیون غیرخطی را با روش کمترین مربعات خطا اجرا کنید. پارامترهای این دستور، معرفی مدل مورد نظر براساس متغیرهای تعریف شده است. خروجی با اجرای کدهای نوشته شده به صورت زیر خواهد بود:
همانطور که دیده میشود مقدار برآورد شده برای پارامتر اول برابر با 20.41 و برای پارامتر دوم نیز 10.24 خواهد بود. البته در خروجی، نمودار مربوط به رابطه بین متغیر X و Y به همراه منحنی برازش شده دیده میشود.
استفاده از تبدیلات
بعضی از مسائل مربوط به رگرسیون غیرخطی ممکن است با استفاده از یک تبدیل به تحلیل مدل رگرسیون خطی تغییر یابند.
برای مثال فرض کنید رابطه بین متغیر مستقل X با متغیر وابسته y با توجه به متغیر خطای U به صورت زیر باشد:
در این حالت، a و b پارامترهای مدل خواهند بود. با استفاده از لگاریتمگیری از هر دو طرف رابطه بالا به فرم خطی و به شکل زیر درخواهد آمد:
این مدل نسبت به پارامترهای جدید یعنی و b، خطی است. پس میتوان پارامترهای مدل را برآورد کرده و به مدل اولیه تعمیم دهیم.
مثال ۲
جدول زیر اطلاعات مربوط به دادههای X و Y هستند. میخواهیم با توجه به تابع ، پارامترهای مدل را برآورد کنیم.
ردیف | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
4 | 3 | 2 | 1 | 0.5 | 1 | 3 | 5 | 3 | |
574.20 | 117.04 | 7.84 | 0.75 | 1.34 | 3.30 | 149.06 | 448.12 | 101.99 | |
6.35 | 4.76 | 2.06 | -0.29 | 0.29 | 1.19 | 5.00 | 6.11 | 4.62 |
با توجه به اطلاعات موجود در جدول و رابطه بهتر است رگرسیون خطی ساده را اجرا کرده و پارامترها را برآورد کنیم. برای انجام این کار از کد زیر کمک میگیریم
1x=c(4,3,2,1,0.5,1,3,5,3)
2y=c(574.20,117.04,7.84,0.75,1.34,3.30,149.06,448.12,101.99)
3lny=log(y)
4dataset=as.data.frame(cbind(x,y))
5
6linearmodel <- lm(lny ~ x, data=dataset) # build linear regression model on full data
7print(linearmodel)
8plot(x,lny)
9lines(x,predict(linearmodel),lty=2,col="red",lwd=3)
10print (paste('a=',exp(linearmodel$coefficients[1]), 'and b=',linearmodel$coefficients[1]))
خروجی دستور مربوط به رگرسیون که در متغیر linearmodel قرار گرفته، حاصل برآورد پارامترهای و b را نشان میدهد.
همانطور که در خروجی مشاهده میشود برآورد پارامترهای a و b در انتها قرار دارند. همچنین نموداری برای نمایش برازش منحنی دادهها با ترسیم شده است.
اگر علاقهمند به یادگیری مباحث مشابه مطلب بالا هستید، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزش های SPSS
- آموزش همبستگی و رگرسیون خطی در SPSS
- مهمترین الگوریتمهای یادگیری ماشین (به همراه کدهای پایتون و R) — بخش دوم: رگرسیون خطی
- آموزش یادگیری ماشین
- مجموعه آموزشهای نرمافزارهای آماری
- رگرسیون خطی — مفهوم و محاسبات به زبان ساده
^^