رگرسیون غیر خطی در R — به زبان ساده

۲۲۶۴ بازدید
آخرین به‌روزرسانی: ۲ خرداد ۱۴۰۲
زمان مطالعه: ۴ دقیقه
رگرسیون غیر خطی در R — به زبان ساده

در آمار، «رگرسیون غیرخطی» (Nonlinear Regression)، یکی از روش‌های «تحلیل چند متغیره» (Multivariate Analysis) است که در آن، داده‌ها توسط یک تابع غیرخطی از پارامترها، مدل‌سازی می‌شوند. برای آشنایی با مفاهیم اولیه در مورد رگرسیون و برآورد پارامترهای آن بهتر است مطلب رگرسیون خطی — مفهوم و محاسبات به زبان ساده را مطالعه کنید.

997696

رگرسیون غیرخطی

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

معمولا در این حالت مدل را به صورت زیر نمایش می‌دهند.

yf(X,β)y\sim f(X,\beta)

این شیوه نمایش بیان می‌کند که بین بردار y به عنوان متغیر وابسته و بردارهای متغیرهای مستقل رابطه‌ای مانند f با توجه به پارامترهای β\beta وجود دارد. برای مثال اگر تابع f را به صورت زیر در نظر بگیریم، نشان دهنده یک رابطه غیرخطی برحسب پارامترها خواهد بود:

f(x,β)=β1xβ2+xf(x,\beta)=\dfrac{\beta_1x}{\beta_2+x}

این تابع نسبت به پارامترها غیرخطی است زیرا نمی‌تواند به صورت یک ترکیب خطی از ضرایب β\beta نوشته شود. پس هدف در این روش بدست آوردن تابعی است که با توجه به داده‌ها بهترین برازش را داشته یا حداقل تقریبی برای تابع مورد نظر باشد.

برعکس روش‌های رگرسیون خطی،‌ برای پیدا کردن پارامترهای تابع غیرخطی f فرم بسته‌ای وجود ندارد و معمولا به کمک تکنیک‌ها و «الگوریتم‌های بهینه‌سازی» (Optimization Algorithm) سعی می‌شود پارامترهای مدل برآورد شود. در اینجا به چند روش ساده ولی کارا می‌پردازیم.

تخمین تابع به کمک بسط تیلور

در این روش فرض بر این است که می‌توان یک تابع خطی را برای تخمین تابع f‌ به کار برد. همچنین می‌دانیم که تابع f نسبت به پارامترهایش مشتق پذیر است. در این حالت می‌توان رابطه تقریبی زیر را برای تابع f و به کمک بسط تیلور نوشت:

f(xi,β)f(xi,0)+jJijβjf(x_i,\beta)\approx f(x_i,0)+\sum_j J_{ij}\beta_j

در این رابطه منظور از JijJ_{ij} مشتق تابع f در نقطه xix_i‌ نسبت به پارامتر βj\beta_j است. حال اگر روش کمترین مربعات خطا را به کار ببریم، برآورد پارامترها به صورت زیر درخواهد آمد:

β(JJ)1Jy\beta\approx (J\prime J)^{-1}J\prime y

نکته: در این رابطه‌ها منظور از jj\prime، «ترانهاده» (Transpose) ماتریس J است به این معنی که جای سطرها با ستون‌ها در ماتریس J عوض خواهد شد تا ماتریس JJ\prime حاصل شود.

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

مثال 1

 فرض کنید براساس داده‌های شبیه‌سازی‌ شده می‌خواهیم پارامترهای مدل رگرسیون غیرخطی به شکل زیر را برآورد کنیم.

y=aXb+xy=\dfrac{aX}{b+x}

از کد زیر که با زبان برنامه‌نویسی 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 است، می‌توانید رگرسیون غیرخطی را با روش کمترین مربعات خطا اجرا کنید. پارامترهای این دستور، معرفی مدل مورد نظر براساس متغیرهای تعریف شده است. خروجی با اجرای کدهای نوشته شده به صورت زیر خواهد بود:

nonlinear regression output
خروجی دستورات مربوط به رگرسیون غیرخطی

همانطور که دیده می‌شود مقدار برآورد شده برای پارامتر اول برابر با 20.41 و برای پارامتر دوم نیز 10.24 خواهد بود. البته در خروجی، نمودار مربوط به رابطه بین متغیر X و Y به همراه منحنی برازش شده دیده می‌شود.

nonlinear one variable regression plot
منحنی برازش شده

استفاده از تبدیلات

بعضی از مسائل مربوط به رگرسیون غیرخطی ممکن است با استفاده از یک تبدیل به تحلیل مدل رگرسیون خطی تغییر یابند.

برای مثال فرض کنید رابطه بین متغیر مستقل X با متغیر وابسته y با توجه به متغیر خطای U به صورت زیر باشد:

Y=aebXUY=ae^{bX}U

در این حالت، a و b پارامترهای مدل خواهند بود. با استفاده از لگاریتم‌گیری از هر دو طرف رابطه بالا به فرم خطی و به شکل زیر درخواهد آمد:

ln(y)=ln(a)+bx+ln(U)ln(y)=ln(a)+bx+ln(U)

این مدل نسبت به پارامترهای جدید یعنی ln(a)ln(a) و b، خطی است. پس می‌توان پارامترهای مدل را برآورد کرده و به مدل اولیه تعمیم دهیم.

مثال ۲

جدول زیر اطلاعات مربوط به داده‌های X و Y هستند. می‌خواهیم با توجه به تابع Y=aebXY=ae^{bX}، پارامترهای مدل را برآورد کنیم.

ردیف123456789
XX43210.51353
YY574.20117.047.840.751.343.30149.06448.12101.99
ln(Y)ln(Y)6.354.762.06-0.290.291.195.006.114.62

با توجه به اطلاعات موجود در جدول و رابطه ln(y)=ln(a)+bxln(y)=ln(a)+bx بهتر است رگرسیون خطی ساده را اجرا کرده و پارامترها را برآورد کنیم. برای انجام این کار از کد‌ زیر کمک می‌گیریم

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 قرار گرفته، حاصل برآورد پارامترهای ln(a)ln(a) و b را نشان می‌دهد.

nonlinear regression with transformation
خروجی رگرسیون غیرخطی با توجه به تبدیل لگاریتمی

همانطور که در خروجی مشاهده می‌شود برآورد پارامترهای a و b در انتها قرار دارند. همچنین نموداری برای نمایش برازش منحنی داده‌ها با ln(y)ln(y)‌ ترسیم شده است.

nonlinear regression with transformation plot
نمودار رگرسیون خطی حاصل از تبدیل لگاریتمی

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

^^

بر اساس رای ۱۴ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
نظر شما چیست؟

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