کارا

تمام ترکیبات ممکن در R

یافتن تمام ترکیبات m تایی ممکن از یک مجموعه دلخواه در نرم افزار R:

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

مثال ۱: یک ماتریس شامل ۱۰ ستون داریم. می خواهیم در بین تمام ستون ها، دو ستون را که کمترین فاصله اقلیدسی از هم دارند مشخص کنیم.

مثال۲ : چند مجموعه داده داریم، می خواهیم در بین کل مجموعه ها، دو مجموعه از داده ها را که به لحاظ توزیع احتمالی نزدیکتر هستند (مثلاً با معیار آماره کلوموگروف – اسمیرنوف یا نزدیکی چندک های نمونه ای) پیدا کنیم.

مثال۳: یک مجموعه داده داریم، می خواهیم میانگین تمام ترکیبات ۳ تایی ممکن را پیدا کنیم.

برای پاسخ به  سوالات از این دست می توان از توابع choose و combn استفاده نمود.

تابع choose تعداد تمام ترکیبات با اندازه مشخص از یک مجموعه را به ما می دهد. مثلاً تعداد ترکیبات ۲ تایی از یک مجموعه ۵ تایی برابر است با

> choose(5,2)
[۱] ۱۰

تابع combn را می توان به دو منظور استفاده نمود. هم لیست تمام ترکیبات با اندازه دلخواه ممکن از یک مجموعه دلخواه را به دست آورد و هم بر روی تمامی ترکیبات ممکن، تابعی را اعمال نمود. مثلاً لیست تمام ترکیبات ۲ تایی ممکن از مجموعه اعداد ۱ تا ۵ به صورت زیر است:

> combn(1:5,2)
[,۱] [,۲] [,۳] [,۴] [,۵] [,۶] [,۷] [,۸] [,۹] [,۱۰]
[۱,] ۱ ۱ ۱ ۱ ۲ ۲ ۲ ۳ ۳ ۴
[۲,] ۲ ۳ ۴ ۵ ۳ ۴ ۵ ۴ ۵ ۵

میانگین تمام ترکیبات ممکن ۲ تایی از مجموعه اعداد ۱ تا ۵ به صورت زیر است :

> combn(1:5,2,mean)
[۱] ۱.۵ ۲.۰ ۲.۵ ۳.۰ ۲.۵ ۳.۰ ۳.۵ ۳.۵ ۴.۰ ۴.۵

مثلاً در مثال ۱ فرض کنیم تمام فواصل اقلیدسی ممکن را بخواهیم به دست آوریم، کمترین میزان فاصله و شماره ستون های با کمترین فاصله را مشخص کنیم. به صورت زیر می توان در نرم افزار R عمل نمود:

set.seed(10)
> M <- matrix(rnorm(1000),ncol=10)
> f <- function(x)sqrt( sum( (M[,x[1]]-M[,x[2]])^2))
> all.Euc.dis <- combn(1:10,2,f)
> min(all.Euc.dis)
[۱] ۱۲.۲۹۴۲۲
> indmin <- which.min(all.Euc.dis)
> combn(1:10,2)[,indmin]
[۱] ۲ ۸

به عنوان مثال دیگر فرض کنید که  چند مجموعه داده داریم که آن ها را به صورت یک ماتریس و یا دیتافریم در R تعریف کرده ایم به طوری که هر ستون مربوط به یک مجموعه داده باشد، حال می خواهیم نمودار Q-Q یا چندک – چندک تمام ستون ها را در مقابل هم رسم کنیم و دو مجموعه داده که نزدیکی بیشتری به لحاظ توزیع دارند انتخاب کنیم. در دستورهای زیر ابتدا چهار مجموعه داده از توزیع نرمال استاندارد، توزیع کای دو، توزیع دو جمله ای و باز هم توزیع نرمال استاندارد شبیه سازی کرده ایم. انتظار داریم که Q- Q plot برای ستون اول و دوم نسبت به بقیه نمودار ها به خط راست نزدیکی بیشتری داشته باشد. همچنین برنامه ای که نوشته ایم، شماره ستون های با کمترین فاصله را به ما بدهد.

 

نرم افزار R

 

> x <- cbind(rnorm(100),rchisq(100,2),
+ rbinom(100,5,0.5),rnorm(100))
>
> par(mfrow=c(2,3))
>
> f <- function(t){ x1<-x[,t[1]]; x2<-x[,t[2]]
+ qqplot(x1,x2,xlab=paste(“x”,t[1]),
+ ylab=paste(“x”,t[2]));sum((sort(x1)-sort(x2))^2)}
> dist <- combn(1:ncol(x),2,f)
> combn(1:ncol(x),2)[,which.min(dist)]
[۱] ۱ ۴