نرمال سازی با تبدیل باکس کاکس (Box-Cox) در زبان R

  • یکشنبه ۲۹ خرداد ۱۴۰۱
  • بازدید 18 نفر
  • 1 امتیاز2 امتیاز3 امتیاز4 امتیاز5 امتیاز (5 امتیاز از 1 رای)
    Loading...

normalization box cox transformation r 23868 1 تصویر

نرمال سازی با تبدیل باکس کاکس (Box-Cox) در R

در این مقاله آموزشی به روش نرمال سازی با تبدیل باکس کاکس (Box-Cox) در محیط برنامه R می پردازیم که نوع خاصی از تبدیل های توانی (Power Transformation) می باشد. این مقاله در ۵ بخش شامل توضیحات کلی از نرمال سازی با باکس کاکس ، آشنایی با خانواده Box-Cox ، تابع boxcox در R ، مثالی از Box Cox transformation و همچنین استخراج دقیق لامبدا می باشد.

نرمال سازی با تبدیل Box-Cox

روش نرمال سازی با تبدیل باکس کاکس (Box-Cox) یک شیوه جهت تبدیل متغیرهای وابسته غیرنرمال به داده هایی با توزیع نرمال می باشد. نرمال بودن چنین داده هایی فرض مهمی برای خیلی از تکنیک های آماری می باشد. در صورتی که داده های شما دارای توزیع نرمال نباشند، به کمک نرمال سازی با تبدیل Box-Cox قادر خواهید بود تا توزیع احتمالی آنها را تقریبا به توزیع نرمال نزدیک کرده و بتوانید از مزایای روش های پارامتری و آزمون های پرتوان آن جهت انجام تحلیل های آماری استفاده کنید. تبدیل باکس کاکس (Box-Cox) یک نوع تبدیل توانی است که عدم تقارن یک متغیر، واریانس های مختلف یا غیر خطی بودن بین متغیرها را تصحیح می کند. در نتیجه برای تبدیل یک متغیر و به دست آوردن یک متغیر جدید که از توزیع نرمال پیروی می کند، بسیار مفید است.

خانواده Box-Cox

تبدیل توابع Box-Cox برای مقادیر مختلف لامبدا (lambda) با عبارت زیر داده می شود:

normalization box cox transformation r 23868 2 تصویر

در اینجا y متغیری است که باید تبدیل شود و لامبدا نیز پارامتر تبدیل است. با این حال، رایج ترین تبدیل ها در جدول زیر نشان داده شده است:

normalization box cox transformation r 23868 3 تصویر

اگر پارامتر تبدیل تخمین زده شده نزدیک به یکی از مقادیر جدول قبلی باشد، در عمل توصیه می شود که به جای مقدار دقیق، مقدار جدول را انتخاب کنید، زیرا تفسیر مقدار از جدول آسان تر است.

تابع boxcox در R

هنگامی که از R استفاده می کنیم، می توانیم از تابع boxcox و پکیج MASS استفاده کنیم تا پارامتر تبدیل را با تخمین حداکثر احتمال تخمین بزنیم. این تابع فاصله اطمینان ۹۵% پارامتر را نیز به ما می دهد. آرگومان های تابع به شرح زیر است:

The boxcox function

boxcox(object, # lm or aov objects or formulas
lambda = seq(-2, 2, 1/10), # Vector of values of lambda
plotit = TRUE, # Create a plot or not
interp, # Logical. Controls if spline interpolation is used
eps = 1/50, # Tolerance for lambda. Defaults to 0.02.
xlab = expression(lambda), # X-axis title
ylab = "log-Likelihood", # Y-axis title
…) # Additional arguments for model fitting

مثالی از تبدیل باکس کاکس

نمونه بردار x را در نظر بگیرید که از توزیع نرمال پیروی نمی کند:

Sample data

x <- c(0.103, 0.528, 0.221, 0.260, 0.091,
۱٫۳۱۴, ۱٫۷۳۲, ۰٫۲۴۴, ۱٫۹۸۱, ۰٫۲۷۳,
۰٫۴۶۱, ۰٫۳۶۶, ۱٫۴۰۷, ۰٫۰۷۹, ۲٫۲۶۶)

# Histogram of the data
hist(x)

برای محاسبه بهینه لامبدا باید یک مدل خطی را با تابع lm محاسبه کنید و به صورت زیر به تابع boxcox منتقل کنید:

normalization box cox transformation r 23868 4 تصویر

# install.packages(MASS)
library(MASS)

boxcox(lm(x ~ 1))

خروجی تابع به صورت نمودار زیر خواهد بود:

normalization box cox transformation r 23868 5 تصویر

توجه داشته باشید که خط عمودی خط چین نشان دهنده پارامتر تخمینی لامبدا و بقیه ۹۵% فاصله اطمینان تخمین است. نمودار بالا نشان می دهد که ۰ در داخل فاصله اطمینان لامبدای بهینه قرار دارد و از آنجایی که تخمین پارامتر در این مثال واقعاً نزدیک به ۰ است، بهترین گزینه اعمال تبدیل لگاریتمی داده ها است (به جدول ارائه شده در توضیحات بالا توجه کنید).

# Transformed data
new_x <- log(x)

# Histogram
hist(new_x)

normalization box cox transformation r 23868 6 تصویر

اکنون داده ها بیشتر شبیه به دنبال کردن یک توزیع عادی به نظر می ‌رسند، اما می توانید به عنوان مثال یک آزمایش آماری را برای بررسی آن انجام دهید، مثلا تست Shapiro-Wilk :

shapiro.test(new.x)

Output

Shapiro-Wilk normality test
data: new_x
W = 0.9, p-value = 0.2

از آنجایی که p-value بیشتر از سطوح معنا ‌دار معمول (۱%، ۵% و ۱۰%) است، هیچ مدرکی برای رد فرضیه صفر نرمال بودن نداریم.

استخراج دقیق لامبدا

اگر فاصله اطمینان پارامتر تخمین زده شده با هیچ مقدار جدول مطابقت نداشته باشد، می توانید لامبدا دقیق را با استفاده از کد زیر استخراج کنید:

# install.packages(MASS)
library(MASS)

b <- boxcox(lm(x ~ 1))

# Exact lambda
lambda <- b$x[which.max(b$y)] # -0.02

اکنون می توانید با استفاده از عبارت قسمت اول، تبدیل متغیر را انجام دهید:

new_x_exact <- (x ^ lambda - 1) / lambda


مشاهده ویدئو در این باره

خوشحال خواهیم شد اگر نظر خودتون رو درباره این مطلب ثبت کنید

خطا!دکمه ریفریش را بزنید

    لیســــــــت پــــــــروژه های انتشــــــــار نشده ( 22 موضوع )

    مشاهده لیست کامل
    مشاهده لیست کامل
    مشاهده لیست کامل
    مشاهده لیست کامل
    socket programing آموزش برنامه نویسی آموزش سی شارپ اینترنت اشیا بازی تحت شبکه بازی تحت شبکه به زبان سی شارپ برنامه تحت شبکه با سی شارپ برنامه نویسی ترجمه مقاله ترجمه مقاله شبکه دانلود رایگان پروژه های دانشجویی دانلود سورس برنامه دانلود سورس رایگان دانلود نرم افزار دانلود پروژه دانشجویی دانلود پروژه رایگان دانلود پروژه های دانشجویی دانلود کتاب دانلود کتاب آموزشی دانلود کتاب اموزشی سورس رایگان سورس کد بازی تحت شبکه سورس کد بازی تحت شبکه با C# سورس کد بازی تحت شبکه چند نفره سوکت پروگرمین شبکه SDN شبیه سازی با نرم افزار R نحوه نوشتن برنامه تحت شبکه نرم افزار Rstudio پروژه arena پروژه matlab پروژه ns2 پروژه opnet پروژه ارنا پروژه سیمولینک matlab پروژه شبکه عصبی پروژه مهندسی صنایع پروژه مهندسی صنایع با ارنا پروژه های آماده با OpenGL پروژه های آماده با OpenGL در سی پلاس پلاس پروژه های آماده با ارنا پروژه های آماده برای درس گرافیک کامپیوتری پروژه هوش مصنوعی پروژه پردازش تصویر matlab پروژه پردازش سیگنال matlab