اذهب إلى المحتوى

تعد لغة R من اللغات التي صعد نجمها حديثا وبشكل سريع بمجال البرمجة العلمية في قطاعي الإحصاء والمعلوماتية الحيوية (bioinformatics) حيث باتت معتمدة على نطاق واسع في كثير من الجامعات ومراكز البحث العلمية، وأصبحنا نرى استخدامها والإشارة إليها في المقالات المنشورة بالمجلات العلمية المحكّمة يزداد بشكل طردي ومتسارع، هذا عدى عن حقيقة كونها لغة حرة مفتوحة المصدر يخضع توزيعها لترخيص GPL الشهير. كل ذلك أدى إلى تزايد ما هو متوفر ومتاح على الشابكة (الإنترنت) من مصادر لها على توزع طيف تلك المصادر، فهناك الكتب الإلكترونية والدروس التعليمية وحتى المناهج الأكاديمية والدورات التدريبية إضافة إلى البرامج الجاهزة والمكتوبة بلغة R لتنفيذ هذه المهمة أو تلك، حتى أنها باتت تحظى ببعض الامتياز مقارنة بالعديد من العمالقة في قطاع البرمجة الرياضياتية العلمية والإحصائية مثل SAS و SPSS خصوصا في مجال توافر الجديد من الطرق والخوارزميات الحديثة، حيث يقاد هذا التوجه في معظمه من طرف الجامعات ممثلة بطلاب الدراسات العليا يحفّزهم على ذلك سهولة بناء الإضافات لهذه اللغة، ويعتبر هذا الأسلوب رغم ما قد يشوبه من نقاط ضعف تتعلق بموثوقية وجودة وغزارة تلك الإضافات الجديدة، والتي تتبع خبرة ومهارة مطوريها وناشريها، لكنها تبقى في القطاع العلمي والأكاديمي أفضل كثيرا من البدائل التجارية التي يعيبها ارتفاع ثمنها من جهة، ومن جهة أخرى بطئ إضافة التحديثات التي تعكس تطور القطاعات العلمية المختلفة، حيث أنها عادة ما تتبع دورة تجارية تتحكم بها الشركات المنتجة.

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

للتذكير فقط، تستطيع أن تقوم بتحميل لغة R من الموقع الرسمي لها على الرابط http://www.r-project.org، وعملية تنصيب هذه اللغة تخلو من التعقيدات وبانتهاءها يمكنك تشغيل سطر الأوامر الخاص بها من خلال النقر على أيقونة اللغة على سطح المكتبة، وكل مانكتبه تاليا يكون داخل سطر الأوامر هذا، علما أننا نستخدم في كل أمثلتنا إطار البيانات المدعو mtcars والذي يأتي محزوما مع اللغة بشكل إفتراضي، وللحصول على معلومات إضافية عن طبيعة محتوى هذه البيانات يمكنك كتابة الأمر التالي في سطر الأوامر mtcars? ولاختصار طريقة الوصول إلى المعلومات ضمن إطار البيانات ننفذ الأمر (attach(mtcars فنصبح قادرين على استخدام التسمية mpg بدلا من استخدام الطريقة المفصلة mtcars$mpg للدلالة على عدد الأميال المقطوعة بغالون البنزين الواحد.

كل ما سبق ذكره من دوال يندرج تحت مظلة ما يدعى بالإحصائيات الوصفية العامة والتي تتعلق بشعاع معين من القيم، أما الدالة cor(x, y) فهي تحسب مقدار معامل الارتباط بين شعاعين من القيم هما في هذه الحالة x و y (أو بين عمودين في حالة البيانات المستوردة من ملف ما)، حيث تتدرج قيمة معامل الارتباط من -1 حتى +1 وتشير القيم الموجبة إلى وجود إرتباط طردي يزداد وضوحا كلما اقترب من +1، أي أنه كلما زادت قيمة x رافقها زيادة في قيمة y، فيما تشير القيمة السالبة لمعامل الارتباط إلى وجود ارتباط أيضا لكنه في هذه الحالة عكسي ويزداد وضوحا كلما اقترب من -1، أي أن قيمة x تزداد بتناقص y والعكس صحيح، في حين تشير قيمة معامل الارتباط التي تقترب من الصفر إلى أن تغير قيمة x لا يظهر أي علاقة بتغير قيمة y المقابلة. مع ذلك عليك كباحث أن تجد علاقة سببية بين x و y قبل أن تلجئ إلى حساب معامل الارتباط واعتماد ما تحصل عليه من نتائج، فإن كانت x تشير على سبيل المثال إلى عدد سكان مدينة دمشق خلال السنوات العشرين الماضية، فيما تشير yإلى عدد السيارات في مدينة حلب خلال نفس الفترة الزمنية، فإن قيمة معامل الارتباط إن تم حسابه سوف تشير إلى وجود ارتباط إيجابي طردي واضح، وهو شيء طبيعي! فعدد سكان دمشق في ازدياد وكذلك عدد السيارات في مدينة حلب، لكن هل لهذا الارتباط الطردي المحسوب هنا أي معنى سببي؟ من الواضح أن الجواب هو لا، لذا عليك توخي الحذر عند استخدام الأساليب والطرق الإحصائية.

لننتقل الآن إلى استعراض مجموعة من الاختبارات الإحصائية وكيفية تنفيذها باستخدام لغة R. دعونا نبدأ باختبار معامل الارتباط والذي سبق وأن رأينا دالة cor البسيطة التي تحسب قيمته، لكنها تبقينا في التباس إحصائي، فإن حصلنا على سبيل المثال على الناتج 0.3 فهل سنقول بأن هناك إرتباط لكنه ضعيف؟ أم ننفي وجود مثل هذا الارتباط ونقبل أن مقدار معامل الارتباط قريب إلى 0 وبالتالي فهو غير معنوي أي غير موجود؟ في حقيقة الأمر هناك اختبار يحسب مدى إحتمالية الحصول على مقدار ما لمعامل الارتباط عن طريق المصادفة البحتة دون أن يكون هناك إرتباط حقيقي أو فعلي، وعادة ما يقبل في مجال الإحصاء إعتبار الحد 0.05 (أي 5%) هو الحد الأقصى المسموح به من الشك، فإن كان احتمال المصادفة أقل من 0.05 رفضنا فرضية المصادفة وبالتالي فالارتباط موجود ومعنوي (أي أننا نعمل هنا بأسلوب نقض الفرض)، وإلا فإننا لا نستطيع إثبات ذلك كون الشكوك في إحتمال المصادفة أكبر من أن يتم إهمالها أو التغاضي عنها.

لتجريب ذلك دعونا بداية نختبر حساب معامل الارتباط ما بين وزن السيارة من جهة والمسافة التي تقطعها بالأميال لكل غالون من البنزين، ويتم ذلك مباشرة من خلال الأمر (cor(wt, mpg وسيكون الناتج في هذه الحالة هو -0.87 أي أن طبيعة تلك العلاقة هي عكسية واضحة. أما لتنفيذ الاختبار المفصل لمعامل الارتباط، فعلينا حينها استخدام الأمر البديل التالي (cor.test(wt, mpg ليظهر الناتج كما هو موضح في الشكل التالي والذي يتضمن أيضا إختبار وجود أي إرتباط ما بين وزن السيارة من جهة والزمن اللازم لقطع مسافة ربع ميل.

AW+jZEtLNFQ6AAAAAElFTkSuQmCC

لتفسير ما حصلنا عليه من نتائج علينا مراقبة القيمة المحسوبة للمقدار p-value والتي تشير إلى احتمال كون قيمة معامل الارتباط التي لدينا قد ظهرت بالمصادفة وأن هذا الارتباط الذي نتحدث عنه غير موجود أصلا، ففي الحالة الأولى قيمة هذا الاحتمال صغيرة جدا إذ تبلغ 1.294e-10 (وهي معروضة بصيغة التمثيل العلمي للأرقام الكبيرة أو الصغيرة، وفي حالتنا هذه يساوي 1.294 x 10^-10 أو 1.294 مقسوما على عشرة بالأس عشرة). أما في الحالة الثانية، فعلى الرغم من أن قيمة معامل الإرتباط هي -0.175 إلا أن احتمال المصادفة في الحصول على هذه القيمة لمعامل الارتباط بالنسبة لمجموعة البيانات المدروسة (أي p-value) هو 0.3389 أي تقريبا %34 وهو هامش شك كبير يصعب تجاهله، لذا من وجهة النظر الإحصائية لا يعد ذلك الارتباط معنويا أو موجودا أصلا.

يمكننا أيضا تطبيق دالة الارتباط على كامل إطار البيانات بكل ما فيه من أعمدة بحيث تحفظ النتائج ضمن مصفوفة تعرض فيها قيم معامل الارتباط ما بين كل زوجين ممكنين من الأعمدة مثنى مثنى بشكل مشابه لما نحصل عليه في النسخة الرسومية من تلك الأزواج والتي تنتج عند تطبيق الدالة pairs، وللقيام بذلك يمكنك تنفيذ الأمر التالي: (cor(mtcars.

هناك إختبار إحصائي آخر مفيد وبسيط هو إختبار t يستخدم عادة لتحديد ما إذا كانت مجموعتان من العينات أو القراءات تنتميان لذات المجتمع الإحصائي، بمعنى أنهما تمتلكان ذات الصفات والمقومات الإحصائية، وبالتالي لا دليل إحصائي يمكنه التمييز فيما بينهما، أي أنه يختبر الفروق الظاهرة بين المجموعتين هل هي معنوية لدرجة يمكننا معها التفريق بينهما أم لا، إن ناتج هذا الاختبار كما هو حال الإختبار السابق والعديد غيرها من الإختبارات الإحصائية يعطى على شكل قيمة تمثل مقدار احتمال ما يدعى بفرضية العدم، وفي حالتنا هذه تنص فرضية العدم على نفي وجود فروق معنوية ما بين مجموعتي العينات أو القراءات قيد الدراسة، فإن كانت قيمة هذا الإحتمال 0.05 فما دون، رفضنا نظرية العدم وقبلنا بأن ما نراه من فروقات ليس مجرد مصادفة بل هو دليل على أن الفروقات ما بين هاتين المجموعتين من البيانات معنوية في هامش خطأ لا يتجاوز 5% وهي العتبة الإحصائية المقبولة عادة (في بعض الدراسات كالحالات المخبرية أو الطبية قد يجري التشدد أكثر فلا نقبل بأكثر من 1% كهامش للخطأ أو ما هو دون ذلك).

سنقوم بداية بتقسيم بيانات الزمن اللازم لقطع مسافة ربع ميل والتي لدينا في إطار البيانات mtcars إلى ثلاث مجموعات على أساس عدد اسطوانات المحرك cyl (المجموعة a للسيارات ذات 4 اسطوانات، والمجموعة b للسيارات ذات 6 اسطوانات، وأخيرا المجموعة c للسيارات ذات 8 اسطوانات) وذلك بمعونة مجموعة التعليمات التالية بلغة R:

a <- qsec[cyl == 4];
b <- qsec[cyl == 6];
c <- qsec[cyl == 8];

يوضح المثالين التاليين إختبار t للمقارنة بين سيارات المجموعة a والمجموعة b من ناحية التسارع، ونلاحظ أن الفروقات بينهما غير معنوية! حيث أن احتمال المصادفة p-value هو %18 تقريبا (أي أنه يتجاوز حد %5 المعتمد عادة)، فمتوسط الزمن اللازم لقطع ربع ميل في الفئة الأولى هو تقريبا 19 ثانية، أما في المجموعة الثانية فهو 18 ثانية تقريبا. بعد ذلك قمنا بالمقارنة ما بين المجموعتين a و c لنجد أن الفروقات بينهما تصنف على أنها معنوية وذلك بحسب نتائج إختبار t حيث أن قيمة p-value هي تقريبا %0.1 مع متوسط زمن 19 ثانية للمجموعة الأولى و 16.75 ثانية للمجموعة الثانية.

B8Nj1s9ivHySAAAAAElFTkSuQmCC

من جهة أخرى وبمجرد تحديد وجود ارتباط معنوي ما بين أي مقدارين، علينا عندها توصيف ذلك الارتباط بشكل كمي بعد أن حددنا وجوده بشكل وصفي، وهذا ما يتم توصيفه من خلال علاقة الانحدار (Regression) ومثالها العلاقة الخطية البسيطة والتي يعبر عنها بمعادلة خط مستقيم من الشكل y = a + b x حيث a هو الثابت الذي يمثل قيمة y حينما تكون قيمة x = 0 في حين أن b تمثل ميل ذلك الخط المستقيم (أو نسبة تغير المقدار y من أجل تغير قيمة x بمقدار 1)، وتحسب هذه المقادير بحيث يمر الخط المستقيم من بين مجموعة النقاط (x, y) بشكل يجعل مقدار الخطأ أقل ما يمكن، حيث أن قيمة الخطأ في كل نقطة x مقاسة هي عبارة عن الفرق ما بين قيمة y الفعلية المقابلة وبين قيمة y المحسوبة من خلال علاقة الخط المستقيم التي حصلنا عليها في علاقة الإنحدار.

إن أشكال علاقات الإنحدار يمكن لها أن تتدرج من البساطة (حيث قيمة y تحسب بدلالة متحول وحيد x1) إلى أشكال أكثر تعقيدا نستخدم فيها أكثر من متحول x لحساب قيمة y ( مثلا y = a + b x1 + c x2 + d x3)، كما أن علاقة الإنحدار تلك يمكن أن لا تكون خطية فحسب (وفيها تظهر x من الدرجة الأولى فقط) بل يمكن لها أن تتعدى إلى صيغ تربيعية أو تكعيبية أو سواها (مثلا y = a + b x + c x2 + d x3)، وللقيام بحساب تابع الإنحدار الخطي البسيط بلغة R نستخدم التعليمة التالية (fit <- lm(y ~ x، فمثلا في حال الرغبة في إيجاد تابع الإنحدار الخطي البسيط الذي يحسب المسافة المقطوعة بغالون البنزين الواحد بدلالة وزن السيارة نستخدم الأمر التالي:

fit <- lm(mpg ~ wt);

ويمكن عرض تفاصيل نتائج هذا الحساب الذي أجريناه للتو باستخدام الدالة summary العامة الأغراض بعد تمرير النموذج الذي تم حسابه باستخدام الدالة ()lm سابقة الذكر، وسيكون الناتج كما هو موضح أدناه:

CAEcm30WIHcB07hoeMSH7AiOQHjEh+wIjkB4xIfs

كذلك نستطيع عرض علاقة الإنحدار الخطي البسيطة هذه بشكل رسومي أيضا وذلك من خلال التعليمتين التاليتين:

plot(wt, mpg);
abline(fit);

حيث تقوم دالة ()plot برسم المخطط البياني الذي يمثل وزن السيارات wt على محور السينات x فيما المسافة المقطوعة بغالون البنزين الواحد mpg يتم تمثيلها على محور العينات y، من جهة أخرى تقوم الدالة ()abline بإضافة ورسم الخط المستقيم الذي يوضح علاقة الإنحدار التي لدينا، وهي علاقة خطية بسيطة.

Z

بإمكانك تحسين ما يعرضه الشكل السابق من خلال إظهار أسماء موديلات السيارات لبعض النقاط المختارة من ذلك المخطط البياني من خلال استدعاء الدالة التالية:

identify(wt, mpg, labels=rownames(mtcars));

حيث يشير الوسيطين الأول والثاني إلى المقادير الممثلة على كل من محور السينات x ومحور العينات y على التوالي، فيما وظيفة الوسيط الثالث هي تحديد القيمة المراد عرضها لكل نقطة يتم اختيارها من نقاط المخطط البياني الظاهر أمامنا (حيث سيتغير شكل مشيرة الفأرة، وعند النقر على أي نقطة من نقاط المخطط البياني يتم إضافة تسمية قربها، ويستمر هذا السلوك إلى أن تنقر على زر Esc من لوحة المفاتيح)، وفي حالتنا هذه سنستخدم أسماء موديلات السيارات المتوافرة أصلا في إطار mtcars للبيانات على شكل تسميات للأسطر، وما تقوم به دالة rownames هنا هو استرجاع تلك الأسماء وتمريرها للوسيط labels في الدالة identify حتى تستخدمها.

إن طريقة كتابة العلاقة في الدالة lm تحدد نوع تابع الإنحدار الذي يجري نمذجته، وما رأيناه في مثالنا السابق هو علاقة إنحدار خطية بسيطة حيث أن ترميز العلاقة المستخدم كان من الشكل y~x وهو يكافئ العلاقة الرياضية y=a+bx، قد نحتاج إلى بناء نموذج فيه تابع الإنحدار خطي بسيط لكن بدون الثابت (أي أن a=0 بمعنى أن y لا تمتلك قيمة عندما x=0)، في تلك الحالة نستخدم الترميز التالي للعلاقة في الدالة lm وهو y~x-1 والمكافئ الرياضي لهذه العلاقة هو y=bx، أما إن كانت علاقة الإنحدار خطية لكن ليست بسيطة، بمعنى أنه لدينا أكثر من متحول أو قيمة تؤثر في حساب y عندها نستخدم الترميز التالي y~x1+x2 وفي تلك الحالة يكون المكافئ الرياضي هو y=a+bx1+cx2، من جهة أخرى إن أردنا نمذجة علاقة إنحدار بسيطة لكن غير خطية فعلينا حينها استخدام الترميز التالي في الوسيط الذي سيتم تمريره للدالة lm وهو (y~x+I(x^2 وأعتقد أنك تستطيع تخمين المكافئ الرياضي لعلاقة الانحدار البسيطة غير الخطية هذه وهو y=a+bx+cx^2

بمجرد حساب علاقة الإنحدار، يمكننا استخدام النموذج الناتج لتوقع قيمة y بدلالة قيمة x المعطاة، فماذا ستكون المسافة المتوقع قطعها بغالون البنزين الواحد إن علمنا أن وزن السيارة هو 4.5 ألف ليبرة؟ لحساب ذلك نستخدم الدالة ()predict كما يلي (وسيكون الناتج هو 13.235 ميل تقريبا):

predict(fit, list(wt = 4.5));

هذه هي نهاية الجزء الثالث من سلسلة المقالات التي تتحدث عن لغة R، انتظروا الجزء الرابع والذي سنتناول فيه بعض التطبيقات المتقدمة لهذه اللغة فإلى لقاء قريب.

لائحة المراجع:


تفاعل الأعضاء

أفضل التعليقات



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...