آموزش آمار: آموزش SPSS و آموزش SAS و آموزش STATA و آموزش نرم افزار R


نکاتی که باید در R مراقبشان بود

نویسنده: هیئت تحریریه ژورنال الکترونیکی آمار آکادمی

این فایل شامل چند نکته است که اغلب برنامه نویسها نسبت به آن کم توجه بوده و موجب بروز اشتباهاتی در نتیجه گیری نهایی شما می گردد. نکات ریزی که معمولا نادیده گرفته می شوند:

•    مراقب عبارت هایی که از چند خط تشکیل شده اند، باشید!

به مثالهای زیر دقت کنید:

> x=2
> z=4

> m=2+2*x
    +2*z
> m
[1] 6

> n=2+2*x;
      +2*z
> n
[1] 6

> n=2+2*x;+2*z
> n
[1] 6

> y=2+2*x+
    2*z
> y
[1] 14


می توانید ببینید که در محاسبه ی عبارت 2+2*x+2*z  به فرم n و m سطر دوم منظور نشده است اما همان عبارت اگر به فرم y نوشته شود سطر دوم را حساب می کند. استفاده از سمیکالن در  بین عبارات، اختیاری است و بسیاری از برنامه نویس ها ممکن است به آن اهمیت ندهند.

ملاحظه ی این نکته در نوشتن عبارات طولانی که شما پاسخ نهایی را نمی دانید بسیار اساسی است. چون ممکن است با یک جابجایی کوچک کل سطر دوم نادیده گرفته شود و نتیجه ای که به دست می آید کاملا متفاوت باشد.
استفاده از بک اسلش نیز در خطوط طولانی مفید نبوده چرا که بک اسلش یک علامت کلیدی در R است و معنی دیگر ی برای آن خواهد داشت.
بنابراین:
یک راه حل این مشکل آن است که باید به R نشانه هایی داد تا بداند که عبارت هنوز تمام نشده و ادامه دارد. مثلا در فرم Y علامت + در انتهای سطر اول نشانه ی این است که قرار است بعد از آن عبارتی اضافه شود و عبارت شما هنوز تمام نشده است. راه حل دیگر استفاده از علامت های () و {} می باشد. این علائم در عبارات طولانی بسیار مفیدند اما مراقب باشید آن ها را در جای درستشان به کار برید.

•    مینیمم ()min  و ماکزیمم ()max :
وقتی که در داده های ما مقادیر (NA (not availab وجود داشته باشد توابع()min  و ()max عمل نخواهند کرد. بنابر این شما باید از عبارت زیر برای یافتن ماکزیمم و یا مینیمم داده های موجود استفاده کنید:
(max(X, na.rm=T یا (min (X, na.rm=T

با این عمل شما داده های NA یا مقادیر گمشده را قبل از محاسبه  ماکزیمم یا مینیمم  دور ریخته اید.



x        2 , 3 , 4 , 5 , NA , 6 , 7, 78 , 8 ,  8

>  min(x)
[1] NA
>  max(x)
[1] NA
>   min(x,na.rm=T)
[1] 2
>   max(x,na.rm=T)
[1] 78



•    اسم هایی که برای متغیرهایتان در نظر می گیرید:

زیاد دیده شده است که برنامه نویس ها نام متغیر خود را try گذاشته اند و ندانسته اند که با این کار اشتباه بزرگی را مرتکب شده اند. چرا که در بازخوانی این متغیر که به صورت زیر است R، متغیر تعریف شده  را با بسته ی ()try اشتباه می گیرد و نتایج شما دگرگون می شود.
همچنین؛ مراقب باشید هیچ گاه نام متغیر خود را 'c' 'q', 'T', 'F', 't' نگذارید چرا که تمام این اسامی برای R مفهوم دیگری دارند.



•    Print  درون یک تابع:

اگر شما در خطوط فرمان R بنویسید:


> x=c(2,5,1,8,9)
> y=c(4,9,6,12,15)

>   m = lm(y ~ x)
>   n = summary(m)
>   n

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

Call:
lm(formula = y ~ x)

Residuals:
   1    2    3    4    5
-1.6 -0.2  1.6 -0.8  1.0

Coefficients:
            Estimate Std. Error t value Pr(>|t|) 
(Intercept)   3.2000     1.2596   2.540   0.0846 .
x             1.2000     0.2129   5.636   0.0111 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.506 on 3 degrees of freedom
Multiple R-squared: 0.9137,     Adjusted R-squared: 0.8849
F-statistic: 31.76 on 1 and 3 DF,  p-value: 0.01105


و این دقیقا معادل است با اینکه بنویسید؛


>   m = lm(y ~ x)
>   summary(m)

این خروجی دقیقا با خروجی دستورات قبل یکسان خواهد بود.

اما در تعریف یک تابع این دستور به صورت قبل عمل نمی کند و حتما باید برای نمایش آن از تابع print() استفاده کنید.
به مثال زیر دقت کنید:



> f <- function(x, y) {
      m = lm(y ~ x)
      summary(m)
      return(42)}
 
> f(x,y)



خروجی این تابع تنها به صورت زیر و بدون خلاصه داده هاست.



[1] 42


برای اینکه بتوانید خلاصه داده ها را نیز در خروجی این تابع دریافت کنید تابع بالا را به صورت زیر اصلاح کنید.


> f <- function(x, y) {
   m = lm(y ~ x)
   print(summary(m))
   return(42)
 }
> f(x,y)


 این بار خروجی شامل خلاصه توصیفات نیز می باشد؛

Call:   
lm(formula = y ~ x)

Residuals:
   1    2    3    4    5
-1.6 -0.2  1.6 -0.8  1.0

Coefficients:
            Estimate Std. Error t value Pr(>|t|) 
(Intercept)   3.2000     1.2596   2.540   0.0846 .
x             1.2000     0.2129   5.636   0.0111 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.506 on 3 degrees of freedom
Multiple R-squared: 0.9137,     Adjusted R-squared: 0.8849
F-statistic: 31.76 on 1 and 3 DF,  p-value: 0.01105

[1] 42


مشاهده می کنید که خروجی این تابع با قرار دادن تابع print() اصلاح شده است.


•    بعد فضای متغیر ها:

برنامه ی زیر را ببینید

demo <- function(t) {
   return(t+y);
}

y=7;
print(demo(3));

درباره ی خروجی آن چه فکر می کنید؟
در یک زبان برنامه نویسی استاندارد، وقتی که y در تعریف تابع مقداردهی یا تعریف نشده باشد باید انتظار خطا در خروجی را داشت در حالیکه این جا خروجی 10 می باشد. دقت کنید در تعریف یک تابع بعد فضای متغیر بسیار مهم است. و متغیری که درون تابع تعریف می گردد می تواند هر نامی به خود برگزیند. برای مثال اگر تابع بالا را به فرم زیر بنویسیم تعریف دو تابع هیچ عوض نشده است


demo <- function(t) {
   return(t+z);
}

y=7;
print(demo(3));

حال در باره ی خروجی این تابع چه فکر می کنید؟ آیا باز هم خروجی 10 است؟

این بار شما آن پیغام خطایی که منتظرش بودید را دریافت خواهید کرد.

Error in demo(3) : object 'z' not found


کلمات کليدي:


بازديد:
آموزش spss

نام و نام خانوادگي:

ايميل:
وبسايت:
شماره امنيتي:
پيام شما:


8/4/1391 - ساعت -443/1/-605 عیده راسخی نژاد | ايميل
با سلام. ممنون از مطالب مفید ارائه شده. لطفا امکان کپی کردن مقاله ها را فراهم کنید.
پاسخ: با سلام.
خوشحال از اینکه مطالبمان برای شما مفید بوده است. متاسفانه امکان کپی کردن مقاله ها در داخل متن وجود ندارد. شما می توانید برای داشتن امکانات لینک صفحه ی مورد نظر خودتون رو به لیست فووریت خودتون اضافه کنید یا کل صفحه را در جایی ذخیره کنید.
با تشکر هیئت تحریریه ژورنال آمار آکادمی