إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

مقدمة للحوسبة الإحصائية مع r

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • [شرح] مقدمة للحوسبة الإحصائية مع r

    السلام عليكم ورحمة الله وبركاته،

    في هذه السلسة من الدروس سنحاول إن شاء الله تقديم لغة البرمجة وبيئة التطوير R
    والتعريف بإمكانياتها في مجال الحوسبة الإحصائية وذلك بشكل موجز ومبسط قدر الإمكان.

    رخصة هذا الشرح: رخصة "وقف" العامة


    لقطة شاشة لبيئة عمل R
    على منصة يونكس.

    ملاحظة:
    لن أسعى هنا لتعريف المفاهيم الأساسية أو المتقدمة في علم الإحصاء، أولاً لأن طبيعة المنتدى لا تسمح بذلك، وثانياً لأن هناك مراجع كثيرة ودروس تفيض في هذا الموضوع على مواقع كثيرة. لذلك سأفترض بأن المهتم بهذا الشرح سيكون على إلمام ولو بسيط بماهية مصطلحات إحصائية مثل: متغير، عينة، ارتباط، معدل، رسم بياني، ... حسنًا دعنا نتوقف هنا قبل أن يلوذ من بقي منكم بالفرار !
    عموما لا تخف أعدك أنك لن ترى أشياء مثل هذه:

    أثناء الشرح .

    ماذا نعني أولا بالحوسبة الإحصائية ؟

    لعل أهمية علم الإحصاء في مختلف مجالات الحياة لا تخفى على أحد بالرغم من السمعة السيئة التي اكتسبها هذا العلم كأداة للكذب وتحريف الحقائق (خصوصا إذا وقع استعماله استعمالا خاطئا في عالم السياسة والصحافة). ولكن بعيدا عن هذا وذاك، علم الإحصاء يبقى من أقوى الأدوات التي لا يمكن الاستغناء عنها في عدة مجالات من العلوم والهندسة والاقتصاد.
    ومع التطور الهائل التي عرفته قوة الحوسبة "computing power" منذ نصف القرن الأخير، صار بالإمكان إجراء عدد من العمليات الحسابية المعقدة بإمكانيات لا تتجاوز أحيانا ما يوفرها حاسوب شخصي. وقد أتاح هذا الأمر إمكانية إجراء الدراسات الإحصائية وتحليل المعلومات بتكاليف ومدة زمنية معقولة. وفي هذا الإطار يشير مصطلح الحوسبة الإحصائية "Computational statistics" إلى فضاء رحب من الطرق والأساليب التي تشترك فيها مهارات متعددة من علم الإحصاء وعلم الحواسيب "Computer science" والتعلم الآلي "Machine learning" لحل المشاكل وتحليل الظواهر الطبيعية أو الاجتماعية.


    بعض الإختصاصات المتعلقة بالحوسبة الإحصائية

    أين نقوم باستعمال الحوسبة الإحصائية؟ ولماذا؟


    في عدة مجالات من الحياة غالبا ما نبحث عن التقدير الأشياء بلغة الأرقام والإحصائيات، وذلك للوقوف على حقيقتها أو لاتخاذ القرارات المناسبة حيالها. ويضفي استعمال الحاسوب كأداة للقيام بالحسابات الإحصائية وتمثيل البيانات عدة ميزات لم تتوفر لأجدادنا (الذين كانوا على دراية تامة بعلم الإحصاء) مثل الأتمتة "Automation"، والموثوقية، والسرعة.

    على الحواسيب القديمة (الضخمة، والمعقدة، وكثيرة العطب) كان المبرمجون يعملون أياما لإدخال "الكود" والبيانات بواسطة البطاقات المثقبة أو المفاتيح (لأنها لا تفهم سوى 1 أو 0) في حين تدوم مدّة الإحتساب الفعلية بضع ثوان.

    ليس من الممكن تحديد كل المجالات، لكثرتها، التي تعتمد على التحليل الحاسوبي للبيانات، ولكن سنقدم بعض الأمثلة للتوضيح:


    بعض من مجالات عمل الحوسبة الإحصائية.

    1 – تقدير تأثير النشاط البشري على البيئة، كتوزيع الملوثات الصناعية في التربة، الهواء، والماء وتأثيرها على التوازنات الأحيائية وصحّة الإنسان يتم بنماذج عددية وإحصائية.
    2- تعتمد دراسة الجينوم (مجموع المورثات) على تحليل بنية ألاف الجينات، ومقارنتها، وتصنيفها، وإيجاد طريقة عملها المعقدة في إطار شبكات (Gene regulatory network). وقد يمكن هذا الأمر في المستقبل من السيطرة على أمراض مستعصية مثل السرطان.
    3- تطوير نوع جديد من العقارات يعتمد على دراسات إحصائية تأكد مدى فاعليتها أو تأثيراتها الجانبية. وهذا جانب حيوي في عمل شركات الأدوية.
    4- عالم الاقتصاد والأعمال يعتمد على التحليل الإحصائي السريع لعدة مؤشرات مثل الاستهلاك (العرض والطلب)، واحتساب نسب الأرباح، وتوقعات الأسواق المالية، ...

    ماذا عن علاقة كل هذا بتكنولوجيا المعلومات "IT" (محل اهتمامنا في هذا المنتدى) ؟
    الحوسبة الإحصائية هي جزء أساسي من نمذجة الحمل على الشبكات "Network load"، تدفق المعلومات، أنماط البحث، تطوير المواقع، وهناك المزيد طبعا ...

    ما هي لغة

    كانت بداية R أكثر من عادية عندما حاول "Ross Ihaka" (من جامعة أوكلاند بنيوزيلاندا) إعادة كتابة بعض الدوال الإحصائية بلغة S بواسطة اسكيم "Scheme" . ولغة S هذه هي أولى اللغات المختصة بالحوسبة الإحصائية التي وقع تطويرها في مختبرات "AT&T" في سبعينات القرن الماضي كبديل لفورتران. و في البداية كانت مختبرات "AT&T" تقوم بتوزيع مصدر لغة S (كما كانت تفعل مع النسخ الأولى لنظام يونكس)، قبل أن تغير رخصته إلى تجاري ومغلق سنة 1984. وعندما عرض "Ross Ihaka" على زميله "Robert Gentleman" نتائج محاولاته، قرر الاثنان إعادة كتابة "Implementation" مصدر S بالكامل بواسطة فرتران وسي. ونشرت أول نسخة حاملة الحرف الأول من اسميهما (R) تحت بنود رخصة غنو الحرّة سنة1997. وبوتيرة تطوير متسارعة صار المشروع ناضجا منذ سنة 2000، وهو الآن من الشهرة في الأوساط الأكاديمية، بحيث أنه تجاوز بمراحل إمكانيات لغة S ولغات أخرى مختصة بهذا المجال.



    "GNU R"
    أو المعروفة اختصارًا ب R هي لغة وبيئة تطوير (Language and development environment) متخصصة في تحليل وتمثيل البيانات والحوسبة الإحصائية. وتتكون R من حزمة رئيسية "core" يمكن توسيعها بواسطة حزم أخرى موجودة بمستودعات المشروع الرئيسي "CRAN". يبلغ عدد هذه الحزم لحد الآن 2456. وهي تقدم مكتبات للطرق الإحصائية الأساسية والمقدمة كالإحصاء الوصفي، والاختبارات الإحصائية، وتخطيط التجارب، وتحليل الارتباطات الخطية، واللاخطية، وتحليل المتتاليات الزمنية، والتحليل متعدد المتغيرات، وتحليل الإشارات، ... وبقية القائمة المفصّلة ستجدها هنا.

    في السنوات العشر الأخيرة، تجاوزت R الدوائر الأكاديمية إلى قطاعات تكنولوجية متعددة حيث تقوم باستعمالها شركات كبرى بما في ذلك غوغل ومايكروسوفت وموقع فايسبوك (لتحليل البيانات الشخصية). ثم إن شركات أدوية عالمية (AstraZeneca ،Pfizer،Johnson & Johnson ، …) تعتمده لتحليل البيانات السريرية.

    للمزيد من المعلومات تفضل بزيارة موقع مشروع R.

    ما هي مميزات

    -
    مجانية، مفتوحة المصدر، ومتاحة للجميع.
    -
    متعددة المنصات يعمل على أنظمة لينوكس ويونكس وماك وويندوز.
    -
    مختصة في التحليل الإحصائي وبنائها "syntax " سهل ملائم جدا لهذه الغاية، مثلا لحساب المجموع والمعدل والتباين. أستعمل أوامر بديهية مثل:
    mean, sum, var
    -تعتمد فلسفة البساطة والحد الأدنى، أي أنها تعطيك المخرجات التي تحتاجها فقط وتتفادى تكديس النتائج كما تفعل برمجيات إحصائية أخرى ( كتقارير SPSS).
    -
    لغة مفسرة ولغة لكتابة السكربتات مثل بايثون.
    -
    ذات أداء عال وقابلة للموازاة (Parallel computing) وهو أمر هام لعمليات حوسبة معقدة مثل نمذجة ومحاكاة المناخ والنظم الأحيائية، ...
    -
    التمثيل بياني ذو جودة عالية مع إمكانية إنتاج مخططات ثلاثية الأبعاد باستعمال مكتبة "OpenGL".
    ستجد هنا بعض الأمثلة.
    -
    نظام وثائق ودعم محكم ومتنوع.

    ماهي حدود


    طبعا لنكون واقعيين لكل لغة برمجة حدود، فمن الواضح أنك لن تستطيع مثلا عمل لعبة ثلاثية الأبعاد بواسطة R كما أنك لن تستطيع حل كل المشاكل الرياضية وتحليل جميع أنواع البيانات.
    -
    لتحليل الأطياف والإشارات (Signal processing) ومحاكاة النظم الإلكترونية سيكون من الأفضل استعمال لغات الحوسبة العددية مثل متلاب (التجارية) أو بديل مفتوح المصدر مثل أوكتاف " Octave" أو سيلاب "Scilab ".
    -
    بما أنها لغة مفسرة، ستكون R أبطأ في بعض البرامج الضخمة وذات البنية معقدة. في هذه الحالة، إذا كانت السّرعة أمرا حيويًا، يتجه الكثيرون نحو لغات مصرّفة "Compiled" مثل "SAS" أو فورتران.
    -
    قد تكون ذاكرة R غير مهيأة لتعامل مع بيانات ذات سعة فائقة لأنها تقوم بتحميل كافة البيانات والمكتبات في الذاكرة الحيّة (وإن كان هناك تحسينات منذ الإصدار. 2). الحلّ المتوفر هو إنشاء قاعدة بيانات خارجية وربطها ب R (باستعمال MySQL، أو PostgreSQL، أو غيرها).

    تثبيت واستعمال R على لينكس

    هناك إصداران من R كل سنة، في أبريل وأكتوبر. سنستخدم الإصدار الأحدث في هذا الشرح وهو 2.11. الحزم التنفيذية "Binaries" متاحة للتحميل من الموقع الرئيسي، وكذلك تثبيتها من مدير حزم مباشرة متاح لأغلب التوزيعات.

    نسخة R للينكس تتفوق على نفس النسخة لويندوز في استخدام الموارد، خاصة في استهلاك الذاكرة الحيّة. كما يمكن تثبيت R من المصدر على لينوكس لجعلها أعلى في الأداء.

    افتح الطرفية، وتأكد من أنك تحمل صلاحيات الجذر، ثم أكتب أوامر التثبيت:
    - على دبيان وأوبنتو وسبيلي ومينت:
    كود:
    apt-get install r-base r-base-dev

    - على فيدورا وأعجوبة لينكس:
    كود:
    yum install R R-devel

    - على مندريفا:
    كود:
    urpmi R-base R-devel

    - على أوبن سيوز:
    كود:
    zypper install R-base R-base-devel


    للتعليمات الخاصة بالتثبيت من المصدر أنظر هنا.

    تستطيع العمل على بيئة R بشكل أساسي بواسطة سطر الأوامر كما أن هناك واجهات رسومية عديدة (سنرى بعضها لاحقا). من الممكن أيضا دمجها مع تطبيقات أخرى كالمتصفحات (بواسطة "rapache") والجداول الممتدة "spreadsheets" أو جعلها تعمل كخادم (بواسطة "Rserve").

    لفتح جلسة R
    جديدة، أكتب في الطرفية:
    كود:
    ~$ R[FONT=Tahoma]
    [/FONT]

    إذا كان كل شيء على ما يرام سترى رسالة ترحيب كالتالي
    (إذا لم ترى شيئا أصرخ بأعلى صوتك )


    فتح R على الطرفية (الواجهة النصيّة).

    والعلامة التنصيص ">" هي استدعاء لنا لبداية إدخال الأوامر، مثلا لندخل عملية بسيطة:
    كود PHP:
    >7+28 

    والمخرجة ستكون:
    كود PHP:
    [135 

    للخروج من الجلسة أكتب
    كود PHP:
    q() 

    سيطلب منك إن كنت تريد حفظ بيانات الجلسة الحالية أم لا (y/n) فاختر ما تراه مناسباً.

    هذه الطريقة، التي لا تعتبر غريبة على من يتعامل مع "بيثون" و"روبي" ، تسمى " Console mode ".
    يمكنك أيضا عمل سكربتات بلغة R وتنفيذها عن طريق " Batch mode " وكتجربة افتح محرر النصوص لديك ثم أنقل وألصق التالي:

    كود PHP:
    #!/usr/bin/env R
    cat("Hello World!\n"



    إحفظ الملف بامتداد " .R" ثم لرؤية النتيجة أكتب في الطرفية:
    كود PHP:
    ~$ cat hello.--slave
    Hello World




    لنبدأ ! Getting Started

    في البداية ستستعمل R كآلة حاسبة. جرب أشياء كالتالي:

    كود PHP:
    3+7-3#  addition and subtraction 
    [1


    لاحظ هنا أمرين:
    أولاً، أجريت العملية الحسابية ولكن وقع تجاهل كل ماهو مكتوب بعد العلامة "#" لأنه يعتبر تعليقا. كتابة التعليقات مهمة جداً في أي لغة برمجة لأنك قد تكون أول من سينسى طريقة عمل الكود بعد أشهر من كتابته.
    ثانيًا، طبعت قبل النتيجة العلامة "[1]" وهذا لأن R يعتبر افتراضيا كل شيء بمثابة جدول "vector" والرقم واحد هو مؤشر عن العنصر الأول في الجدول.

    كود PHP:
    6-3+2
      
    [15
      
    6-(3+2# operation order
      
    [11
      
    12*6+4# multiplication first
      
    [176
      
    72/# division 
      
    [114.4
      
    6^# squaring
      
    [136 
      
    8^13 # to the power of
      
    [1549755813888 
      
    8**13 # same thing
      
    [1549755813888
      
    > ((5*13)-(1+4)^2)/62 # more complicated
      
    [10.6451613 


    تستطيع أيضا استعمال بعض الدوال الرياضية، مثلا:

    كود PHP:
    sqrt(2# square root
      
    [176
      
    cos(pi# cosine of pi, pi is the ‘π’ constant
      
    [1] -1
      
    sin(20)^2+cos(20)^2
      
    [11
      
    log(1# natural log
      
    [10
      
    log10(10# decimal log
      
    [11
      
    exp(0# exponential
      
    [1


    يمكن تخزين المتغيرات باسم معين:

    كود PHP:
    x<-# assigns 5 to x
      
    >x=# equivalent but not recommended for scripts 
    كما ترى R ليس كثير الكلام ، لو أردت أن تطبع قيمة المتغير (ما تحتويه x هنا) :

    كود PHP:
    # print x’s value
      
    [15
      
    -> # same thing, assigns 2 to y
      
    y
      
    [12
      
    z<- x*y-x+y
    [1


    لإنشاء الجداول:

    كود PHP:
    v<-c(1,2,3,4# create a vector with combine function “c()”
      
    v
      
    [11  2  3  4
      
    w<-c("Age","Gender","Length"# create a vector of strings
      
    w
      
    [1"Age"  "Gender"  "Length"
      
    v<-1:10 # create a vector with a sequence from 1 to 10
      
    v
      
    [11  2  3  4  5  6  7  8  9 10
      
    v<-seq(1,10# same thing with “seq()” function  
      
    v
      
    [11  2  3  4  5  6  7  8  9 10
      
    u<-sin(v#calculate sin of v elements and assign them to a new vector u  
      
    # display u
      
    [1]  0.8414710  0.9092974  0.1411200 -0.7568025 -0.9589243 -0.2794155
      
    [7]  0.6569866  0.9893582  0.4121185 -0.5440211 


    كمثال بسيط سنقوم برسم منحنى دالة الجيب كالآتي:

    كود PHP:
    v<-seq(-6,6,.2# create a sequence from -6,6 with an increment of 0.2 
      
    u<-sin(v)
      > 
    plot(v,u,type='l',col='red')# plot u=sin(v) with a red line ‘l’ 


    والنتيجة ستكون:

    الرسم البياني لدالة الجيب.

    كما ترى من المثال السابق، الدوال
    "functions"فيR تأتي على الشكل التالي:

    كود PHP:
    function(arg1=,arg2=,# function with some arguments 


    هناك العديد من الملقمات "arguments "
    في الدالة ()plot، بعضها أساسي والآخر اختياري. قمنا هنا بتحديد أربعة منها فقط.
    في الأول والثاني قمنا بتحديد البيانات v و u التي سنقوم بتمثيلها في المنحنى (أساسي).
    في الثالث والرابع قمنا اختياريا بتحديد نوع المنحنى"type=" ولونه "col="، وإن كان من الممكن تركهما دون تحديد.

    يمكنك أن تطلب المساعدة لمعرفة طريقة استعمال أي دالة كالتالي:

    كود PHP:
    help(plot)# display help of plot function in console mode
      
    > ?plot # same thing 


    لتصفح المساعدة بشكل أفضل على متصفح الويب (
    على ثعلب النار مثلا )، قم فقط بتغيير الخيارات كالآتي:

    كود PHP:
    options(help_type "html"browser "firefox")
    help(plot



    وثائق المساعدة على المتصفح موزيلا فايرفوكس.

    ويمكن أيضا استعراض كل الملقمات المتوفرة لدالة معينة بواسطة المفتاح "tab"
    ، تماما كما تعمل خاصية الإتمام الذاتي على الطرفية. على سبيل المثال:
    كود PHP:
    plot()
      
    topic=            package=          lib.loc=          verbose=           
      try.
    all.packageshelp_type=
    ... 


    أرجوا أن يكون هذا الشرح المتواضع قد أفادكم، وأرحب بكل الملاحظات والأسئلة.
    ولي عودة إن شاء الله.


    المصادر

    Why Study Statistics Brochure
    Statistics with R
    Joseph Adler (2009), R in a Nutshell, Publisher: O'Reilly Media
    Getting Started in R


    التعديل الأخير تم بواسطة Albakry; الساعة 11-07-2010, 03:18 AM.

  • #2
    سبحان الله !!

    اليوم كنت ابحث عن برنامج للتحليل الاحصائي وركبت برنامج pspp واثناء ذلك بحثت عن برامج أخرى فظهرت لي لغة R كنت اتمنى ان اجد ملخص لما تقوم به هذه اللغة حفظاً للوقت .. تحققت امنيتي بتعريفك العام لهذه اللغة فشكرا لك أخي الكريم

    تعليق


    • #3
      رائع رائع رائع!
      نحتاج للكثير من هذه المواضيع عن البرمجيات الحرة المتخصصة، أشكرك كثيرا و متابع إذا كان هناك مواضع أخرى مشابهه ^_^
      كتاب أوبنتو ببساطة: http://www.simplyubuntu.com
      ابدأ مع النظام الرائع أوبنتو لينُكس الآن!

      تعليق


      • #4
        اليوم كنت ابحث عن برنامج للتحليل الاحصائي وركبت برنامج pspp واثناء ذلك بحثت عن برامج أخرى فظهرت لي لغة r كنت اتمنى ان اجد ملخص لما تقوم به هذه اللغة حفظاً للوقت .. تحققت امنيتي بتعريفك العام لهذه اللغة فشكرا لك أخي الكريم
        pspp برنامج جيد وهو يحاكي عدة أشياء في spss، ولكن مع R لست مكبلا بواجهة رسومية (حيث كل شيء محدد مسبقا) وإنما تستطيع فعل ما تريده ببياناتك.
        رائع رائع رائع!
        نحتاج للكثير من هذه المواضيع عن البرمجيات الحرة المتخصصة، أشكرك كثيرا و متابع إذا كان هناك مواضع أخرى مشابهه ^_^
        العفو، هناك شروح أخرى للبرامج التي أستعملها إن شاء اللّه.

        تعليق


        • #5
          نظرة عامة على لغة r (الجزء الأول)


          بعد هذه اللمحة الأولية حول بيئة R، وقبل المرور إلى استعمالاتها المتقدمة في مجال الحوسبة الإحصائية سنتطرق بشكل موجز لأساسيات البرمجة بلغة R.

          المتغيرات في R

          عندما نعمل في R فإننا سنتعامل مع كائنات تسمى الأشياء "objects"، وهذه الأشياء ستكون في أغلب الأحيان متغيرات "variables" أو دوال "functions" (أخبرني إذا رأيت كائنات أخرى ).
          سنهتم أولا بمعرفة المتغيرات وطريقة إنشائها وأنواعها.

          الإسناد Assignment

          في R، كما في معظم لغات البرمجة، توجد متغيرات لتخزين أنواع مختلفة من البيانات. المتغير هو للتبسيط بمثابة "خانة" يقع حجزها في الذاكرة الحيّة لاحتواء قيمة معينة. وهذه القيمة ليست ثابتة حيث أن بإمكانها أن تتغير أثناء المعالجة. عملية إنشاء متغير وإسناد قيمة له "assign" تتم بطريقة متزامنة كالتالي:
          كود PHP:
          x<-# assign 1 to a variable named ‘x’ 
          من خلال هذا الأمر قمنا بحجز "خانة" في الذاكرة باسم "x" ووضعنا فيها على سبيل المثال قيمة وهي 5. وهذا ما سنفعله مع متغير آخر "y" :
          كود PHP:
          y<-
          الآن نستطيع بكل بساطة استدعاء المتغيرات بأسمائها لكي نقوم بمختلف أنواع المعالجات:
          كود PHP:
          z<-x+# now we can use variables by their names
          z=x+# equivalent syntax 
          z<<-x+# equivalent syntax 
          x+y-># equivalent syntax
          assign("z",x+y# equivalent syntax 
          و لمعرفة قيمة المتغير (طباعة المحتوى):
          كود PHP:
          # see what is stored as ‘y’
          [18
          x<-(-3# assign a new value to ‘x’
          # changing ‘x’ doesn’t change ‘z’ 
          [1
          كما ترى قيمة المتغير "z" لم يطرأ عليها شيء بالرغم من تحديث قيمة المتغير"x" . وهذا أمر طبيعي لأن قيمة "y" وضعت في خانة منفصلة من الذاكرة ولم تعد لها علاقة بالمتغير"x".
          بالنسبة لنا الإسناد العادي هو أغلب ما نحتاجه. ولكننا قد نضطر أحيانا إلى تأخير إسناد قيمة المتغير كالتالي:
          كود PHP:
          delayedAssign("z",x+y# don’t assign the z value immediately  
          x<-(-3
          # evaluate the promise object ‘z’
          [1

          ملاحظة: "
          promise" هي متغيرات لا يقع إسناد قيمة لها وقت إنشائها، ولكن يقع تقديرها عند أول استعمال (يعني تكون بين الموت والحياة حتى تنادى باسمها ). للمزيد من المعلومات حول أهمية هذا الأمر إبحث في غوغل عن "eager evaluation".


          إذا أردنا يمكن المحافظة على ارتباط ديناميكي دائم بين المتغيرات، وذلك بإنشاء متغير يحتوي على عبارة "quote" تحدد العلاقة بينها:
          كود PHP:
          z<-quote(x+y# assign an expression to ‘z’ 
          # display ‘z’
          [1x+y
          > eval(z# evaluate ‘z’ for given ‘x’ and ‘y’
          [10
          x<-# change ‘x’ value
          > eval(z# reevaluate ‘z’
          [1
          أنواع المتغيرات Variables types

          المتغير الافتراضي في R هو الجدول "vector"، وهذا يعني أن أي متغير مفرد نقوم بإنشائه دون تحديد أي شيء آخر:
          كود PHP:
          x<-1
          x
          [1
          سيكون العنصر الأول في جدول [1]. خلافا لبايثون ترقيم عناصر الجدول يبتدئ من 1 وليس 0.


          للمقارنة، في متلاب يكون نوع المتغير الافتراضي في شكل مصفوفة.

          لا يمكن للجدول احتواء سوى نوع واحد من المتغيرات، ونسمي هذه الخاصية ذرية المتغير "atomicity". يمكن أن تكون المتغيرات بشكل أساسي عددية "numeric"، أو عددية مركبة "complex"، أو نصية "character"، أو منطقية "logical"، أو خاصة."special"

          لنأخذ في البداية بعض الأمثلة من متغيرات عددية:
          كود PHP:
          x<-# keep in mind that ‘x’ is a vector 
          y<-2.3
          z<-2+3i 
          سنقوم الآن بتفقد أنواع المتغيرات التي قمنا بإنشائها:
          كود PHP:
          > class(x# what is the class of variable x 
          [1"numeric"
          typeof(x# what is the type of variable x (more specific)
          [1"double" 
          كما ترى هنا كل الأعداد التي نقوم بإدخالها يعتبرها R، بشكل افتراضي، ثنائية double حتى نقوم نحن بتحديد ما إذا كنا نريدها صحيحة:
          كود PHP:
          x<-as.integer(1# set the type of x as integer 
          typeof(x)
          [
          1"integer"
          typeof(y# "double"   is the default type of numerical variables 
          [1"double" 
          والمتغير الثالث هو عبارة عن عدد مركب:
          كود PHP:
          typeof(z
          [
          1"complex" 
          ويمكننا العمل بالجزء الحقيقي أوالتخيّلي من العدد المركب:
          كود PHP:
          Re(z# display the real part
          [12
          Im(z# imaginary part
          [1
          وكذلك حجّة ومرافق العدد المركب:
          كود PHP:
          Arg(z# the argument of ‘z’
          [10.9827937
          Conj(z# the conjugate of ‘z’
          [10.9827937 
          المتغيرات المنطقية تكون إما بقيمة"TRUE" أو "FALSE" قطعا. تصلح هذه المتغيرات كما سنرى لاحقا في عمل الاختبارات وفي التحكم في تدفق البيانات بالجمل الشرطية "conditional statements"، حيث الإجابة تكون بنعم أو لا:
          كود PHP:
          x<-2
          x==# is ‘x’ equal to 2 ? 
          [1TRUE 
          تعاملنا هنا مع علامات المقارنة "==" وهذا يعني أننا نريد أن نعرف هل قيمة إن المتغير "x" مساوية تماما ل2 أم لا. الإجابة ستكون بالطبع بنعم وهكذا قمنا بإنشاء متغير منطقي بقيمة "TRUE":
          كود PHP:
          typeof(x==2)
          [
          1"logical"
          x># is ‘x’ superior to 3 ?
          [1FALSE
          > (x>3)!=TRUE # is this expression different ‘!=’ form true ?
          [1TRUE 
          أما بالنسبة لقيم المتغيرات ذات الطبيعة النصّية فيجب كتابتها بين علامتي " " وذلك لتمييزها من أسماء المتغيرات العادية:
          كود PHP:
          s<-"Hello"
          > class(s)
          [
          1"character" 
          الجداول Vectors

          كما رأينا سابقا، لإنشاء جدول متعدد العناصر نحتاج إلى الدالة الدمج "Combine". مثلا قمنا هنا بإدخال جدول "v" يحتوي على ستة أعداد كالتالي:
          كود PHP:
          v<-c(2,3,5,7,11,13)
          v
          [1]  2  3  5  7  11  13 
          وهذه مكافئة تماما لما نفعله في بايثون أو متلاب بالصيغة:
          كود PHP:
          >> v=[2,3,5,7,11,13
          نستطيع استدعاء عناصر الجدول على حدا عن طريق مؤشراتها "indexes" وهي ببساطة أرقام "الخانات" التي تشغلها هذه العناصر:
          كود PHP:
          v[1]  # display the 1st element 
          [12
          v[3# display the 3d element
          [15
          v[3:5# display the elements from 3 to 5
          [1]  5  7  11
          v[-2# display all elements without the 2nd one 
          افتراضيا ينشئ R جداول عمودية "column vector". إذا أردنا عمل جدول أفقية "row vector"، فعلينا أن نمر بعملية التحويل "transposition":
          كود PHP:
          v<-t(v# transpose ‘v’
          v
               
          [,1] [,2] [,3] [,4] [,5] [,6]
          [
          1,]    2    3    5    7   11   13 
          ويصير التأشير هنا يخص الأعمدة وليس السطور. يعني بعبارة أخرى مررنا من جدول بعمود واحد وستة سطور إلى جدول بسطر واحد وستة أعمدة. و لتفهم الأمر بصورة أوضح إليك الشكل التالي :


          نستطيع إنشاء جدول من المتغيرات النصية مثل:
          كود PHP:
          b<-c("Hello","New","World"# b is a vector of characters 
          b
          [1]  "Hello"  "New"  "World" 
          وبما أن الجدول لا يمكن أن يحتوي إلا على متغيرات من نوع واحد، فإدخال عنصر نصيّ واحد في جدول من القيم العددية سيحوله (بدون إذن منك ) إلى جدول من القيم النصّية:

          كود PHP:
          x<-c(2,3,5,7,11)
          > class(
          x)
          [
          1"numeric"
          x<-c(2,3,5,7,11,"Hello")
          > class(
          x)
          [
          1"character" 
          بالإضافة إلى هذه المتغيرات المعهودة في كل لغات البرمجة تتيح لنا لغة R تخزين البيانات في شكل عامل "Factor". هذا النوع من المتغيرات مهم لأن هناك نوعية من البيانات، التي تتوارد كثيرا في التحليل الإحصائي للتجارب، تأتي على شكل مستويات "levels" مختلفة. على سبيل المثال، أعتقد أن كلنا يعرف أن كميات الأسمدة في التربة تؤثر على نمو الأشجار. نقول أن "تركيزات الأسمدة" تشكل عاملا لأن الأشجار تنمو بطريقة مختلفة عند التعرض لتركيزات مختلفة من الأسمدة. بصورة مبسّطة، يمكننا تكويد هذه بيانات (تركيز الأسمدة) على شكل جدول:
          كود PHP:
          fertilizer<-c(1,3,3,2,0,1,0,3,2,2,1,0
          حيث تكون 0، 1، 2 و3 مثلا تركيزات الأسمدة في 12موقعا. لتحويل نوع المتغير إلى عامل سنسميه fertilizer.factor:
          كود PHP:
          fertilizer.factor<-factor(fertilizer)
          fertilizer.factor 
           
          [11 3 3 2 0 1 0 3 2 2 1 0
          Levels
          0 1 2 3
          > class(fertilizer.factor)
          [
          1"factor" 
          المصفوفات matrices and arrays

          ماذا لو أردنا الآن إنشاء جدول يتكون من عدّة أعمدة وسطور؟
          هنا نتحدث عن نوع محدد من المتغيرات وهو المصفوفة "matrix". المصفوفة هي ببساطة جدول ذو بعدين:


          ولإنشاء مثل هذا الشيء نستعمل الدالة :
          كود PHP:
          m<-matrix(c(2,3,5,7,11,13),nrow=2,ncol=3
          كما ترى أدخلنا هنا ستة عناصر مرتبة على شكل مصفوفة لها سطران وثلاث أعمدة. ولطبع النتيجة:

          كود PHP:
          m
               
          [,1] [,2] [,3]
          [
          1,]    2    5   11
          [2,]    3    7   13 
          للإبحار في المصفوفة نشير لكل عنصر بمؤشرين وهما مؤشر السطر ومؤشر العمود:
          كود PHP:
          m[1,2# display the element in the 1st line and the 2nd column 
          [15
          m[2,3]
          [
          113 
          يمكن أيضا استعمال الدالة array() لإنشاء مصفوفة:

          كود PHP:
          m<-array(c(2,3,5,7,11,13),c(2,3)) 
          يكمن الفرق بين "matrix" و"array" في أن الأولى تكون ذات بعدين في حين أن الثانية يمكن أن تكون متعددة الأبعاد، كما يوضح الشكل التالي:

          هذه مصفوفة بثلاث أبعاد، ويمكن ان تكون بأبعاد أكثر من ذلك ولكني أجد أصلا صعوبة في تصور الأشياء في البعد الثالث فما أدراك بمصفوفة بعشرة ابعاد .


          مثلا لإنشاء مصفوفة بثلاث أبعاد:
          كود PHP:
          m<-array(c(v,v**2,sqrt(v)),c(2,3,3))
          m
          , , 1

               
          [,1] [,2] [,3]
          [
          1,]    2    5   11
          [2,]    3    7   12

          , , 2

               
          [,1] [,2] [,3]
          [
          1,]    4   25  121
          [2,]    9   49  144

          , , 3

                   
          [,1]     [,2]     [,3]
          [
          1,] 1.414214 2.236068 3.316625
          [2,] 1.732051 2.645751 3.464102

          m[1,2,3]
          [
          12.236068 
          القوائم وأطر البيانات
          Lists and dataframes


          كيف يمكننا الآن تخزين أنواع مختلفة من المتغيرات في كائن واحد؟ هنا سنحتاج لمتغيرات تسمى بالقوائم "Lists". ننشئ القوائم باستعمال الدالة list() عوضا عن c()، كالتالي:
          كود PHP:
          x<-list(1,2,3,2+3i,"Hello",TRUE# put anything into a list
          > class(x
          [
          1"list"
          # display ‘x’ content
          [[1]]
          [
          11

          [[2]]
          [
          12

          [[3]]
          [
          13

          [[4]]
          [
          12+3i

          [[5]]
          [
          1"Hello"

          [[6]]
          [
          1TRUE 
          لاحظ معي هنا أن القوائم ما هي في الحقيقة إلا مجموعة من الجداول ولكل منها نوعه الخاص. يمكننا التحكم في كل جدول على حدا، كأن نقوم بإضافة عنصر جديد في جدول معين.
          لنستدعي أولا محتوى الجدول الخامس:
          كود PHP:
          x[[5]] # display the content of the 5th vector 
          [1"Hello"
          > class(x[[5]]) # this is a character vector of length 1
          [1"character"
          > class(x[5]) # this is a list of length 1
          [1"list" 
          العنصر الأول [1] في هذا الجدول هو كلمة "Hello".
          كود PHP:
          x[[5]][1# the first element in ‘x[[5]]’
          [1"Hello" 
          العنصر الثاني [2] في هذا الجدول غير موجود:
          كود PHP:
          x[[5]][2# the second element is not available ‘NA’
          [1NA 
          لنقم بإنشائه:
          كود PHP:
          x[[5]][2]<-"World"
          x[[5]] # now the vector has a length of 2 
          [1"Hello" "World" 
          عندما تصير الجداول في قائمة متعددة العناصر، نتحدث بشكل عام عن أطر بيانات "data frames". إطار البيانات يخزن أكثر من جدول أو قائمة بأكثر من نوع، حيث يمكنه احتواء بيانات عددية ونصية وعوامل ...

          لنقم مثلا بإنشاء ثلاث جداول مختلفة:
          كود PHP:
          v<-c(1,2,3,4,5# numeric vectors
          w<-x**
          levels<-factor(c("A","B","C","C","D")) # factor vector 
          وإنطلاقا من هذه الجداول (لاحظ أنها بنفس الطول) سنقوم بإنشاء إطار بيانات بواسطة الدالة "data.frame()" :
          كود PHP:
          data<-data.frame(v,w,f=levels# build data frame with given vectors, ‘levels’ a factor 
          data # display data frame content
            
          x  w f
          1 1  1 A
          2 2  4 B
          3 3  9 C
          4 4 16 C
          5 5 25 D 
          أنمنى أن يكون الشرح المتواضع قد أفادكم وأنتظر ملاحظاتكم .
          ولنا عودة إن شاء الله.

          تعليق


          • #6
            السلام عليكم، ما هي الواجهة الرسومية للبرنامج التي في الصورة في بداية الشرح؟

            تعليق


            • #7
              السلام عليكم

              لأول مرة أطلع على هذا النوع من اللغات

              العمل بها سيكون أكثر إنتاجيه فمعها يتم التركيز على اليانات أكثر من كيفية عمل هذه الأشياء

              شكرا على الشرح

              لدي سؤال:
              عند إجراء العمليات على المصفوفات هل تتم مباشرة؟ ؛ بمعنى:
              لو فرضنا مصفوفتين x و y
              الضرب: x*y
              الجمع : x+y
              هل هكذا تتم؟
              ظاهرة " الفرنكو آراب " مخطط أمريكي للقضاء علي اللغة العربية && قصة الإسلام
              أيام الأسماء المستعارة كنت أدعى : The Nubian Muha

              تعليق


              • #8
                السلام عليكم ورحمة الله وبركاته ...
                اخى الفاضل ...
                أشكرك شكراً جزيلاً على ما قدمت من شرح للغة متخصصة كلغة الـ R .... متأكد أن ذلك لا يتعارض مع قوانين المجتمع التى تحث على نشر البرمجيات الحرة بكل الوسائل والتى من ضمنها ..
                **** التعريف بالبرامج التخصصية ..
                **** تقديم شروحات لها ..

                ولو تعارض الشرح المستفيض لبعض التفاصيل التى تهم المتخصصين ... كما تفضلت بالإشارة فى بداية مقالك ... فيمكن تجنب ذلك عن طريق كتابة الشروحات فى كتيبات تحت نفس الرخصة ...

                قد يطلب منك البعض المزيد ... ولكنى أطالبك بالمزيد .. طالما كان عندك ...
                ======================================
                تخصصى هو الفيزياء ....
                ويههمنى ما يسمى بالفيزياء الحاسوبية أو Computational Physics ...وبالطبع سأستخدم لغة الـR كجزء من عملى مستقبلاً ...
                قمت بتثبيت برامج الـ Octave و برنامج الـ Mathematica ...
                ======================================
                يهمنى جدا ما كتبت ... وأنتظر ما ستكتب ...

                بارك الله فيك ووفقك إلى كل خير
                لا اله الا الله

                OpenERP & Django Developer


                تعليق


                • #9
                  العمل بها سيكون أكثر إنتاجيه فمعها يتم التركيز على اليانات أكثر من كيفية عمل هذه الأشياء
                  فعلا فهي اكثر من مجرد لغة برمجية، هي بيئة كاملة موجهة لعلم الإحصاء، وتحليل البيانات.

                  لدي سؤال:
                  عند إجراء العمليات على المصفوفات هل تتم مباشرة؟ ؛ بمعنى:
                  لو فرضنا مصفوفتين x و y
                  الضرب: x*y
                  الجمع : x+y
                  هل هكذا تتم؟
                  بالنسبة لضرب مصفوفتين matrix product نستعمل الرمز %*% وهو ما يقابل *. على متلاب. مثلا :
                  كود PHP:
                  A<-matrix(2:10,ncol=3#Let A be an 3-by-3 matrix
                  B<-matrix(4:9,ncol=2# B an 3-by-2 matrix
                  X<-c(11,13,17# X a vector
                  A%*%B
                       
                  [,1] [,2]
                  [
                  1,]   81  126
                  [2,]   96  150
                  [3,]  111  174
                  B%*%# returns an error message because ncol(A)!=ncol(B)
                  X%*%# vector by matrix product 
                       
                  [,1] [,2] [,3]
                  [
                  1,]  129  252  375
                  X%*%(A%*%B# matrix multiplcation is associative
                       
                  [,1] [,2]
                  [
                  1,] 4026 6294
                  > (X%*%A)%*%B
                       
                  [,1] [,2]
                  [
                  1,] 4026 6294
                  X%*%A%*%B
                       
                  [,1] [,2]
                  [
                  1,] 4026 6294 
                  بالنسبة لل pairwise matrix product:
                  كود PHP:
                  C<-A/56 # C is an 3-by-3 matrix 
                             
                  [,1]       [,2]      [,3]
                  [
                  1,] 0.03571429 0.08928571 0.1428571
                  [2,] 0.05357143 0.10714286 0.1607143
                  [3,] 0.07142857 0.12500000 0.1785714
                  C*# pwm
                             
                  [,1]      [,2]     [,3]
                  [
                  1,] 0.07142857 0.4464286 1.142857
                  [2,] 0.16071429 0.6428571 1.446429
                  [3,] 0.28571429 0.8750000 1.785714
                  A*# pwm is commutative 
                             
                  [,1]      [,2]     [,3]
                  [
                  1,] 0.07142857 0.4464286 1.142857
                  [2,] 0.16071429 0.6428571 1.446429
                  [3,] 0.28571429 0.8750000 1.785714 

                  تعليق

                  يعمل...
                  X