التحليل الإحصائيالقياس النفسي ومناهج البحثبرمجة R

كيفية استخدام na.rm في R (مع أمثلة)

دليل أكاديمي شامل يشرح كيفية استخدام معامل na.rm في لغة R لتجاهل القيم المفقودة وحساب المقاييس الإحصائية بدقة، مع أمثلة برمجية وتطبيقية مفصلة.

تاريخ النشر

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

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

يهدف هذا الدليل المرجعي الشامل إلى تفكيك كافة الجوانب النظرية والتطبيقية المرتبطة بمعامل na.rm في لغة R. سنستعرض الآليات الدقيقة التي تُدار بها المفقودات على مستوى الذاكرة ومعالجة المتجهات، مروراً بالتطبيقات الموسعة في حزم المعالجة الحديثة مثل Tidyverse و dplyr، ووصولاً إلى الفروق الجوهرية بين الحذف الموضعي وتقنيات التعويض الإحصائي المتقدمة في البحوث السيكومترية والاجتماعية، مدعومة بنماذج شفرات تحليلية متكاملة وتوصيات كتابة التقارير وفق المعايير الأكاديمية الصارمة.

1. مقدمة شاملة حول القيم المفقودة في لغة R ودور معامل na.rm

1.1 مفهوم القيم المفقودة (NA) في البيئة الإحصائية R

تمثل القيمة المفقودة في لغة R بالرمز الثابت NA، وهو اختصار للمصطلح الإنجليزي Not Available. لا تُعامل لغة R هذه القيمة كصفر حسابي أو كنص مجرد، بل كحالة خاصة ومحجوزة ضمن النظام للدلالة على غياب المعلومة أو عدم إمكانية قياسها. تتميز NA بكونها متعددة الأنماط الرياضية؛ فهناك NA_real_ للمتغيرات العددية العشرية، وNA_integer_ للمتغيرات الصحيحة، وNA_character_ للسلاسل النصية، وNA_complex_ للأعداد المركبة. هذا التمييز الداخلي الدقيق يسمح للغة بالحفاظ على نوع المتجه (Vector Type) متجانساً حتى في حال غياب بعض عناصره.

من الضروري التمييز الإحصائي والبرمجي الحاسم بين NA والقيم الخاصة الأخرى في بيئة R. فالقيمة NaN (Not a Number) تنتج حصراً عن عمليات حسابية غير معرّفة رياضياً، مثل قسمة الصفر على الصفر أو استخراج الجذر التربيعي لعدد سالب دون الانتقال للأعداد المركبة. أما الكائن NULL فيمثل الفراغ البرمجي التام أو كائناً غير موجود أصلاً في بنية البيانات، في حين تشير Inf و-Inf إلى اللانهاية الموجبة والسالبة الناتجة عن القسمة على الصفر. تتصرف لغة R مع هذه الكيانات بمنطق صارم: فبينما تُعتبر NaN حالة خاصة من حالات NA، فإن NULL لا تدخل إطلاقاً في طول المتجهات ولا يمكن استبعادها عبر معامل na.rm المخصص للقيم المفقودة حصراً.

تعتمد R مبدأ “انتشار المفقودات” (Propagation of Missing Values). يعني هذا المبدأ أن أي عملية حسابية أو منطقية تشمل القيمة NA ستكون نتيجتها الحتمية NA، ما لم يُحدد خلاف ذلك برمجياً. على سبيل المثال، فإن جمع عدد معلوم مع قيمة مجهولة يعطي بالضرورة ناتجاً مجهولاً، ومقارنة متغير بقيمة NA لا تسفر عن صواب أو خطأ بل تسفر عن NA. هذا السلوك الافتراضي الصارم صُمم لحماية الباحث من استخلاص استنتاجات خاطئة بناءً على بيانات منقوصة دون إدراك وافٍ لحجم الفقد الموجود.

1.2 التعريف البرمجي والإحصائي لمعامل na.rm

يُشتق المعامل na.rm وظيفياً ولغوياً من العبارة الإنجليزية NA Remove، أي “حذف أو استبعاد القيم غير المتوفرة”. يمثل هذا المعامل وسيطاً منطقياً (Logical Argument / Boolean Parameter) يقبل إحدى القيمتين: TRUE (أو اختصاراً T) للموافقة على الاستبعاد، أو FALSE (أو اختصاراً F) لرفض الاستبعاد والإبقاء على المعالجة الافتراضية الصارمة.

عند تمرير na.rm = TRUE إلى دالة إحصائية معينة، يقوم المترجم الداخلي لـ R بتصفية المتجه المدخل واستبعاد كافة العناصر التي تتطابق مع القيمة NA قبل الشروع في تنفيذ الخوارزمية الرياضية للدالة. في المقابل، فإن الضبط الافتراضي في الغالبية الساحقة من دوال التحليل الأساسية هو na.rm = FALSE. يعكس هذا الضبط الافتراضي فلسفة تصميمية حذرة تفرض على المستخدم التعبير الصريح عن نيته في تجاهل البيانات المفقودة، مما يمنع تمرير التقديرات المشوهة بصورة غير مقصودة.

من الناحية الإحصائية، فإن تفعيل na.rm = TRUE يعني تعديل فضاء العينة الفعلي المستخدم في الحسابات اللحظية. فالعملية لا تقتصر على تجاهل الرمز NA برمجياً فحسب، بل يمتد أثرها إلى تقليص حجم العينة (Sample Size) الفعلي الذي تعتمد عليه المقامات في القوانين الرياضية للمتوسطات والانحرافات والمعاملات الإحصائية، وهو ما يفرض على الباحث فهماً عميقاً لطبيعة هذا الإجراء وتأثيراته الرياضية.

1.3 أهمية استبعاد القيم المفقودة في البحوث السيكومترية والاجتماعية

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

في حال عدم استخدام آليات استبعاد المفقودات مثل na.rm = TRUE، فإن استدعاء دوال الحساب التراكمي لدرجات المقاييس السيكومترية سيؤدي إلى إنتاج مصفوفات كاملة من قيم NA. يؤدي هذا التراكم السلبي إلى تعطل سلاسل التحليل الإحصائي اللاحقة، مثل تحليل الانحدار، وتحليل التباين، والتحليل العاملي التوكيدي، مما يعيق استخراج النتائج ويوقف تنفيذ البرمجيات النصية للتحليل.

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

2. التركيب النحوي والأساس المنطقي لمعامل na.rm

2.1 البنية النحوية العامة (Syntax) في استدعاء الدوال

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

mean(x, trim = 0, na.rm = FALSE, ...)

sd(x, na.rm = FALSE)

sum(..., na.rm = FALSE)

في هذا النسق، يمثل x كائن البيانات الأساسي (متجه عددي أو منطقي)، بينما يمثل na.rm الوسيط المنطقي المنظم لسلوك التعامل مع الفقد. يمكن للباحث تمرير هذا المعامل باستخدام أسلوبين برمجيين: التمرير الاسمي (Named Argument) أو الترتيب الموضعي (Positional Matching). يُعد التمرير الاسمي—مثل كتابة mean(x, na.rm = TRUE)—الأسلوب القياسي والمهني الأفضل، لأنه يحمي الكود من الأخطاء التفسيرية في حال تغير ترتيب وسائط الدالة في التحديثات البرمجية أو اختلافها بين الحزم.

عند غياب التحديد الصريح لقيمة na.rm في سطر الأوامر، يعتمد المترجم القيمة الافتراضية المعرفة داخل هيكل الدالة (Default Argument)، والتي تكون غالباً FALSE. تجدر الإشارة إلى أن تمرير قيم غير منطقية للمعامل، كإسناد أعداد صحيحة بديلة أو متغيرات نصية، يؤدي إما إلى حدوث تحويل ضمني غير آمن للنوع (Type Coercion) كأن يتحول الرقم 1 إلى TRUE والرقم 0 إلى FALSE، أو توقف التنفيذ وظهور أخطاء نحوية تعطل سريان التحليل.

2.2 الآلية الداخلية لمعالجة البيانات عند تفعيل na.rm = TRUE

تتم عملية معالجة البيانات واستبعاد المفقودات عبر na.rm = TRUE على مستوى داخلي فائق السرعة، غالباً ما يكون مكتوباً بلغة C أو Fortran ضمن النواة الصلبة لحزمة R Base. عند تفعيل الخيار، لا تقوم R بتعديل كائن البيانات الأصلي المخزن في الذاكرة العشوائية (RAM)، بل تُنشئ تصفية موضعية مؤقتة للمتجه أثناء تمريره للمعالجة الحسابية.

تنعكس هذه الآلية مباشرة على المقام المستخدم في القوانين الإحصائية. ففي حساب المتوسط الحسابي، يتم احتساب المقام $N_{valid}$ بوصفه عدد العناصر التي تحقق الشرط المنطقي !is.na(x) فقط، وليس الطول الكلي للمتجه length(x). إذا كان لدينا متجه يحتوي على 10 عناصر، اثنان منها NA، فإن المقام الرياضي لحساب المتوسط سيصبح 8 تلقائياً، وليس 10. هذا الضبط التلقائي يمنع تشويه المتوسط الحسابي بالقيمة الصفرية أو تقليصه الوهمي.

يبرز هنا تمايز منهجي جوهري بين “الحذف الموضعي اللحظي” (Ad-hoc In-situ Removal) الذي يحققه na.rm = TRUE، و”الحذف الهيكلي الدائم” (Permanent Deletion) الذي يحذف المشاهدات من أطر البيانات نهائياً. يتيح الحذف الموضعي مرونة استثنائية؛ حيث يمكن للباحث حساب متوسط المتغير الأول بناءً على 95 مفحوصاً، ومتوسط المتغير الثاني بناءً على 90 مفحوصاً، مع الاحتفاظ بكامل السجلات الديموغرافية والتشخيصية لجميع المفحوصين المئة داخل قاعدة البيانات للتحليلات الأخرى.

3. تطبيق na.rm مع مقاييس النزعة المركزية على المتجهات (Vectors)

3.1 حساب المتوسط الحسابي (Mean) باستخدام mean()

يُعد المتوسط الحسابي أكثر مقاييس النزعة المركزية حساسية للبيانات المفقودة والقيم المتطرفة. عند تطبيق الدالة mean() على متجه يضم قيماً مفقودة دون وسائط إضافية، يفشل الإجراء في حساب المجموع والبسط، وتكون النتيجة الحتمية NA. لتجاوز هذه المعضلة، يُكتب الأمر بالصيغة: mean(x, na.rm = TRUE).

لنستعرض مثالاً برمجياً مقارناً يوضح الفارق الرياضي والتحليلي:

# تعريف متجه درجات اختبار الذكاء لعينة صغيرة
iq_scores <- c(105, 112, NA, 98, 120, NA, 115)

# الحساب الافتراضي بدون تفعيل المعامل
mean_default <- mean(iq_scores)
# النتيجة تكون: NA

# الحساب الصحيح بعد استبعاد القيم المفقودة
mean_clean <- mean(iq_scores, na.rm = TRUE)
# النتيجة تكون: 110

في هذا المثال، احتسبت الدالة مجموع القيم الصالحة الخمس فقط (105 + 112 + 98 + 120 + 115 = 550) وقسمتها على عددها الفعلي (5)، مما أنتج المتوسط الدقيق 110. لو كانت الدالة قد قسمت على الطول الكلي للمتجه (7) لكان الناتج المشوه 78.57، وهو ما يبرز الدقة الحسابية التي يوفرها na.rm = TRUE في إدارة المقامات الإحصائية بصورة آلية وسليمة.

3.2 حساب الوسيط الإحصائي (Median) باستخدام median()

يمثل الوسيط الإحصائي المقياس المفضل للنزعة المركزية عندما تكون البيانات رتبية، أو عندما تظهر التوزيعات التواءات شديدة وقيم متطرفة لا تعكس مركز الثقل الحقيقي للبيانات. تتصرف الدالة median() بذات الصرامة الافتراضية؛ حيث يؤدي وجود أي عنصر NA إلى تعذر ترتيب القيم وتحديد موقع الرتبة الوسيطة، مما يُنتج القيمة NA.

يُستخدم الوسيط على نطاق واسع في معالجة درجات مقاييس القلق، مثل مقاييس ليكرت الخماسية أو السباعية التي لا تحقق شروط التوزيع الطبيعي الاعتدالي. يوضح المثال التالي آلية استخدام median(x, na.rm = TRUE):

# درجات مقياس القلق التفاعلي لعينة من المفحوصين
anxiety_scale <- c(2, 4, 1, NA, 5, 3, 2, 4, NA, 1)

# محاولة حساب الوسيط بالطريقة الافتراضية
med_raw <- median(anxiety_scale)
# المخرج: NA

# تطبيق حساب الوسيط مع استبعاد الفقد
med_adjusted <- median(anxiety_scale, na.rm = TRUE)
# المخرج: 2.5

عند تفعيل na.rm = TRUE، قامت الدالة أولاً بعزل قيمتي NA، ثم أعادت ترتيب القيم الثمانية المتبقية تصاعدياً: (1, 1, 2, 2, 3, 4, 4, 5). ولما كان عدد المشاهدات زوجياً ($n=8$)، قامت بحساب المتوسط الحسابي للرتبتين المركزيتين الرابعة والخامسة $((2 + 3) / 2)$ ليكون الناتج الدقيق 2.5، محققة بذلك المتانة الإحصائية المطلوبة دون الحاجة لإعادة هيكلة المتجه يدوياً.

3.3 حساب المجموع الكلي (Sum) باستخدام sum()

تكمن خطورة استخدام الدالة sum() بدون استبعاد المفقودات في توقف العمليات الحسابية التراكمية، خاصة في تصحيح الاختبارات النفسية والتحصيلية. ففي كثير من الأحيان، يحتاج الباحث لحساب مجموع الدرجات الخام التي حصل عليها المفحوص في اختبار مكوّن من عدة فقرات فرعية.

إذا كان المقياس يتطلب حساب الدرجة الكلية باستبعاد الفقرات المتروكة، فإن الصيغة sum(x, na.rm = TRUE) تكون ضرورية. لنفترض أن باحثاً يرغب في حساب الدرجة الكلية لمفحوص على مقياس الرضا الوظيفي:

# استجابات مفحوص على 6 فقرات في مقياس ليكرت
subject_responses <- c(4, 5, 3, NA, 4, 2)

# حساب المجموع الكلي مع تفعيل na.rm
total_score <- sum(subject_responses, na.rm = TRUE)
# الناتج: 18

ومع ذلك، ينبغي على الباحث توخي الحذر المنهجي الشديد عند استخدام sum(x, na.rm = TRUE)؛ فالدالة ستعامل المفقود معاملة الصفر الإضافي في عملية الجمع، مما يعني أن المفحوص الذي ترك فقرات دون إجابة سيحصل على مجموع كلي منخفض مقارنة بأقرانه الذين أجابوا على كافة الفقرات، حتى لو كانت استجاباته على الفقرات التي أجاب عليها مرتفعة. لذلك، يفضل السيكومتريون في مثل هذه الحالات حساب متوسط الفقرات الصالحة ثم ضربه في العدد الكلي للفقرات، بدلاً من الاكتفاء بالجمع المباشر المستبعد للمفقودات.

4. استخدام na.rm مع مقاييس التشتت والتباين الإحصائي

4.1 حساب الانحراف المعياري (Standard Deviation) عبر sd()

يُعد الانحراف المعياري مقياس التشتت الأبرز لوصف مدى تقارب أو تباعد الدرجات عن متوسطها الحسابي. تعتمد الصيغة الرياضية الكلاسيكية لحساب الانحراف المعياري للعينة على قسمة مجموع مربعات الانحرافات على درجات الحرية ($n – 1$):

$$s = \sqrt{\frac{\sum_{i=1}^{n} (x_i – \bar{x})^2}{n – 1}}$$

عند استدعاء الدالة sd(x, na.rm = TRUE)، تقوم خوارزمية R بتعديل مزدوج: فهي أولاً تستبعد قيم NA من حساب المتوسط $\bar{x}$، ثم تطرح عدد القيم المفقودة من حجم العينة الكلي لتحديد درجات الحرية الفعلية ($n_{valid} – 1$) المستخدمة في مقام الجذر التربيعي. يمنع هذا التصحيح الدقيق حدوث تضخيم أو تقليص مصطنع في قيمة التشتت.

# درجات مقياس الذاكرة العاملة لعينة إكلينيكية
wm_scores <- c(85, 92, 88, NA, 104, 95, NA, 90)

# حساب الانحراف المعياري بعد استبعاد الفقد
wm_sd <- sd(wm_scores, na.rm = TRUE)
# الناتج: 6.643292

في هذا المثال الإكلينيكي، استند حساب درجات الحرية إلى $6 – 1 = 5$، وليس $8 – 1 = 7$. ولو تم تقسيم مجموع الانحرافات على 7 لنتج انحراف معياري منخفض زائفاً، مما قد يقود الباحث إلى استنتاجات خاطئة حول تجانس العينة المدروسة.

4.2 حساب التباين (Variance) باستخدام var()

يمثل التباين مربع الانحراف المعياري، ويُعد اللبنة الأساسية في تحليلات التباين الأحادي والمتعدد (ANOVA/MANOVA) ونماذج المعادلات البنائية. تطبق الدالة var(x, na.rm = TRUE) نفس المنهجية الرياضية على المتجهات الأحادية البعد لاستبعاد المفقودات وحساب متوسط مربعات الانحرافات بدقة تامة.

تتعقد المسألة التحليلية عند الانتقال من المتجهات الفردية إلى مصفوفات التغاير (Covariance Matrices) التي تُحسب بواسطة var() لعدة متغيرات في آن واحد. لا يقبل وسيط na.rm في دالة var() عند تمرير مصفوفات أو إطارات بيانات العمل بذات البساطة المباشرة، بل يتطلب الأمر استخدام وسيط مكافئ يُعرف باسم use، والذي يحدد سياسة التعامل مع المشاهدات المفقودة عبر المتغيرات المتعددة (مثل الحذف الكامل للصفوف أو الحذف المزدوج)، كما سنفصل في الأقسام اللاحقة.

من الأهمية بمكان إدراك أن تباين العينة الجزئية الناتجة عن na.rm = TRUE يكون تقديراً غير متحيز لتباين المجتمع الإحصائي فقط إذا كان نمط الفقد عشوائياً بالكامل. أما إذا ارتبط غياب البيانات بمتغيرات كامنة، فإن التباين المحسوب قد يعاني من قيود المدى (Restriction of Range)، مما يقلل من القيمة الحقيقية للتباين المقدر في المجتمع الأصلي.

4.3 حساب المدى والربيعيات (Range, Min, Max, Quantile)

تتطلب دوال استكشاف الأطراف والتوزيعات الإحصائية دعماً مباشراً لاستبعاد المفقودات. فدوال القيم القصوى والدنيا max() وmin()، إضافة إلى دالة المدى range()، تُرجع NA فوراً إذا اشتمل المتجه على قيمة مفقودة واحدة دون تفعيل وسيط الحذف.

# فحص النطاق العمري للمشاركين في دراسة مسحية
ages <- c(19, 25, 42, NA, 61, 33, 28, NA)

# استخراج أصغر وأكبر عمر والمدى الشامل
min_age <- min(ages, na.rm = TRUE) # الناتج: 19
max_age <- max(ages, na.rm = TRUE) # الناتج: 61
age_range <- range(ages, na.rm = TRUE) # الناتج: متجه من قيمتين [19, 61]

تمتد هذه الضرورة الحسابية إلى دالة الربيعيات quantile()، المسؤولة عن تقسيم التوزيع التكراري إلى مئينات ونسب مئوية دقيقة. يتطلب حساب الربيع الأول ($Q_1$) والربيع الثالث ($Q_3$) والمدى الربيعي ($IQR$) استخدام quantile(x, probs = c(0.25, 0.75), na.rm = TRUE). ترتبط هذه الحسابات ارتباطاً وثيقاً بإنشاء المخططات الصندوقية (Boxplots)؛ حيث تعتمد خوارزميات الرسم على القيم الخمس الملخصة الناتجة بعد استبعاد المفقودات لرسم الصندوق وتحديد حدود القيم الشاذة والمتطرفة بدقة هندسية ورياضية متكاملة.

5. التعامل مع إطارات البيانات (Data Frames) باستخدام na.rm

5.1 تطبيق na.rm على أعمدة مفردة داخل إطار البيانات

في التطبيقات الواقعية، تُخزن البيانات داخل أطر بيانات (Data Frames) تحتوي على متغيرات متعددة الأنواع مرتبة في صفوف وأعمدة. للوصول إلى عمود معين وحساب إحصاءاته الوصفية مع استبعاد المفقودات، يُستخدم عامل التشغيل المرجعي $ متبوعاً باسم المتغير، مع تمرير na.rm = TRUE داخل الدالة المستهدفة.

# إنشاء إطار بيانات تجريبي للأبحاث النفسية والسريرية
clinical_data <- data.frame(
  participant_id = 101:105,
  depression_score = c(14, 22, NA, 18, 30),
  treatment_group = c("Control", "CBT", "CBT", "Control", "CBT")
)

# حساب متوسط درجات الاكتئاب للعمود المحدد
mean_dep <- mean(clinical_data$depression_score, na.rm = TRUE)
# الناتج: 21

يمكن أيضاً استخدام أسلوب الفهرسة المصفوفية المعيارية clinical_data[, "depression_score"] أو clinical_data[["depression_score"]] لتحقيق نفس النتيجة البرمجية. يتميز هذا النهج بالمرونة والأمان؛ حيث يتيح للباحث استخراج المؤشرات الإحصائية لكل متغير سريري أو ديموغرافي على حدة دون المساس بسلامة الصفوف التي تحتوي على قيم صالحة في متغيرات أخرى.

5.2 استخدام دوال عائلة Apply مع na.rm لحساب الإحصاءات لعدة أعمدة

عندما يحتوي إطار البيانات على العشرات من متغيرات الاستبيان الرقمية، يصبح حساب الإحصاءات لكل عمود منفرداً إجراءً غير عملي وعرضة للأخطاء التكرارية. توفر لغة R عائلة دوال apply كحل موجه وفعال برمجياً لتمرير العمليات عبر الهياكل البيانية بكفاءة عالية دون الحاجة لكتابة حلقات تكرارية (for loops) طويلة.

تُستخدم الدالة sapply() أو lapply() لتطبيق العمليات الحسابية عبر أعمدة إطار البيانات وتمرير وسيط na.rm = TRUE كمعامل إضافي في نهاية الاستدعاء:

# مصفوفة فرعية تضم درجات بنود مقياس الرضا
survey_items <- data.frame(
  item1 = c(4, 5, NA, 3, 2),
  item2 = c(3, NA, 4, 4, 1),
  item3 = c(5, 4, 5, 2, NA)
)

# حساب المتوسطات والانحرافات لجميع الأعمدة بضربة واحدة
item_means <- sapply(survey_items, mean, na.rm = TRUE)
item_sds <- sapply(survey_items, sd, na.rm = TRUE)

إذا كانت البيانات مخزنة في مصفوفة نقية (Matrix)، يمكن استخدام الدالة apply(X, MARGIN = 2, FUN = mean, na.rm = TRUE) لتطبيق المتوسط عبر الأعمدة ($MARGIN = 2$) أو عبر الصفوف ($MARGIN = 1$). تتميز هذه الدوال الموجهة بكونها أسرع حسابياً في استهلاك موارد المعالج مقارنة بالحلقات اليدوية، كما تجعل الكود التحليلي أكثر إيجازاً وقابلية للقراءة والمراجعة العلمية.

5.3 استخراج ملخصات شاملة عبر summary() ومقارنتها بـ na.rm

تمثل الدالة العامة summary() أداة الاستكشاف الأولية الأكثر أهمية في لغة R عند التعامل مع قواعد البيانات الحديثة. تتميز هذه الدالة بسلوك تحليلي فريد ومغاير للدوال الإحصائية القياسية؛ فهي لا تتطلب تفعيل معامل na.rm صراحة، بل تقوم تلقائياً بحساب القيم الخمس الملخصة (الأدنى، الربيع الأول، الوسيط، المتوسط، الربيع الثالث، الأقصى) مع إضافة بند سابع مخصص يحمل اسم NA's يوثق بدقة عدد المشاهدات المفقودة في كل متغير.

تعتبر المخرجات التقريرية لدالة summary() خريطة طريق تشخيصية للباحث؛ فمن خلالها يكتشف المتغيرات التي تحتوي على فجوات رقمية تستدعي تفعيل na.rm = TRUE في التحليلات التفصيلية اللاحقة. إضافة إلى ذلك، يمكن للباحثين بناء جداول إحصائية وصفية مخصصة تجمع بين مخرجات sapply() الموجهة بـ na.rm وعدد المفقودات المستخرج عبر is.na() لتقديم تقرير وصفي متكامل يعكس الواقع الإحصائي للعينة قبل الشروع في النمذجة المتقدمة.

6. تطبيق na.rm مع حزمة tidyverse ودوال dplyr الحديثة

6.1 استخدام na.rm داخل دالة summarise() في dplyr

أحدثت منظومة حزم Tidyverse، وبخاصة حزمة dplyr، نقلة نوعية في منهجيات هندسة البيانات وتحليلها في R. تعتمد هذه المنظومة على التعبير البرمجي المتسلسل باستخدام معامل الأنبوب الأساسي (Native Pipe |>) أو معامل الأنبوب الكلاسيكي التابع لحزمة magrittr (%>%). في هذا السياق الحديث، يُدمج المعامل na.rm = TRUE بسلاسة داخل الدالة التلخيصية summarise().

library(dplyr)

# إنشاء ملخص إحصائي لمتغيرات متعددة باستخدام أنابيب التمرير
research_summary <- clinical_data %>%
  summarise(
    mean_depression = mean(depression_score, na.rm = TRUE),
    sd_depression = sd(depression_score, na.rm = TRUE),
    valid_cases = sum(!is.na(depression_score))
  )

توفر دالة across() الحديثة في dplyr قدرة هائلة على تطبيق المعامل عبر مصفوفة واسعة من المتغيرات وفق شروط محددة؛ حيث يمكن كتابة: summarise(across(where(is.numeric), ~ mean(.x, na.rm = TRUE))). يتيح هذا التركيب النحوي المتقدم تنظيف وتلخيص عشرات الأعمدة الرقمية دفعة واحدة مع الحفاظ على أعلى معايير المقروئية البرمجية.

6.2 التحليل التجميعي عبر المجموعات (group_by) مع na.rm

تبرز القوة التحليلية الحقيقية لـ dplyr عند الجمع بين الدالة التجميعية group_by() والدوال الإحصائية الموجهة بمعامل na.rm = TRUE. يسمح هذا الاقتران بحساب المؤشرات الإحصائية لكل مجموعة فرعية (مثل مجموعات العلاج التجريبي مقابل المجموعات الضابطة، أو التصنيفات الجندرية والمهنية) بصورة معزولة ومستقلة تماماً.

# مقارنة الفروق في درجات الاكتئاب حسب المجموعات العلاجية
treatment_comparison <- clinical_data %>%
  group_by(treatment_group) %>%
  summarise(
    group_mean = mean(depression_score, na.rm = TRUE),
    group_median = median(depression_score, na.rm = TRUE),
    sample_n = n(),
    missing_n = sum(is.na(depression_score))
  )

يجب الانتباه البرمجي والمنهجي للحالات التي تكون فيها استجابات مجموعة فرعية معينة مفقودة بالكامل (أي أن جميع عناصر المتغير للمجموعة المعنية هي NA). في هذه الحالة، سينتج عن mean(x, na.rm = TRUE) القيمة NaN، وسينتج عن min() القيمة Inf، وسينتج عن max() القيمة -Inf، مع ظهور رسائل تحذيرية من R تنبه الباحث إلى خلو المجموعة من أي قيمة صالحة، وهو ما يستدعي فحص توزيع الفقد بين الطبقات قبل اعتماد التحليل النهائي.

6.3 التحويلات وحساب الدرجات الكلية داخل mutate()

تُستخدم الدالة mutate() لإنشاء متغيرات جديدة أو تعديل متغيرات قائمة على مستوى الصفوف الفردية. عند الرغبة في حساب الدرجة المركبة أو المتوسط الفردي لاستجابات كل مفحوص عبر عدة بنود استبيانية، تبرز دوال الجمع والتوسيط عبر الصفوف مثل rowMeans() وrowSums() كأدوات موجهة فائقة الكفاءة تدعم تمرير na.rm = TRUE.

# حساب متوسط درجات كل مفحوص عبر أبعاد الشخصية الفرعية
personality_scores <- survey_items %>%
  mutate(
    respondent_mean = rowMeans(select(., item1:item3), na.rm = TRUE),
    respondent_sum = rowSums(select(., item1:item3), na.rm = TRUE)
  )

ينطوي هذا الاستخدام على مخاطرة برمجية دقيقة: فإذا كانت استجابات المفحوص مفقودة في كافة البنود الثلاثة، فإن rowSums(..., na.rm = TRUE) ستُرجع القيمة 0 بدلاً من NA، مما يوحي خطأً بأن المفحوص حصل على أدنى درجة ممكنة بدلاً من كونه لم يجب إطلاقاً. لتفادي هذه المشكلة الرياضية، يوصى بالتحقق من عدد البنود المكتملة لكل صف وإعادة إسناد NA للصفوف الفارغة بالكامل لضمان الاتساق السيكومتري لدرجات المفحوصين.

7. تطبيقات na.rm في معالجة مصفوفات البيانات السيكولوجية والاستبيانات

7.1 حساب درجات مقاييس الشخصية ذات الاستجابات الجزئية المفقودة

في اختبارات الشخصية القياسية، مثل مقياس العوامل الخمسة الكبرى (Big Five Personality Traits) أو مقياس العصابية والانبساط، يواجه الباحثون معضلة المفحوصين الذين يتركون بعض الفقرات دون إجابة. لا يسمح علم القياس النفسي بتمرير na.rm = TRUE بشكل عشوائي دون وضع عتبة منهجية صارمة (Threshold Rule).

تقتضي الممارسة السيكومترية الفضلى عدم احتساب درجة البعد الفرعي باستخدام mean(items, na.rm = TRUE) إلا إذا كانت نسبة الفقرات المفقودة للمفحوص لا تتجاوز 20% من بنود ذلك البعد. إذا تجاوز الفقد هذه العتبة، يُعتبر البعد مفقوداً بالكامل (NA) لهذا المفحوص لعدم كفاية التمثيل القياسي للمفهوم النفسي.

# تطبيق برمجي لقاعدة العتبة السيكومترية (أقصى فقد مسموح: بند واحد من 5)
calculate_scale_score <- function(items) {
  missing_count <- sum(is.na(items))
  if (missing_count <= 1) {
    return(mean(items, na.rm = TRUE))
  } else {
    return(NA_real_)
  }
}

يضمن هذا الإجراء المتوازن الحفاظ على حجم العينة المفيدة من خلال استيعاب السهو البسيط للمفحوصين عبر na.rm، مع وضع سد منهجي منيع يمنع تشويه الدرجات المعيارية نتيجة الاستجابات المبتورة أو غير الجادة.

7.2 حساب معاملات الاتساق الداخلي ومصفوفات الارتباط في القياس النفسي

يمثل استخراج مصفوفات الارتباط (Correlation Matrices) وحساب معامل الثبات ألفا كرونباخ (Cronbach’s Alpha) ركيزتين لا غنى عنهما للتحقق من الاتساق الداخلي للاختبارات النفسية. عند استدعاء دالة الارتباط الأساسية cor()، يكتشف الباحث أنها لا تحتوي على وسيط باسم na.rm، بل تعتمد على وسيط مكافئ وظيفياً يُدعى use.

يقبل وسيط use عدة خيارات منهجية تحاكي وتوسع فلسفة na.rm:

  • “everything”: السلوك الافتراضي الصارم؛ يرجع NA إذا وُجد أي فقد في أي متغير.
  • “complete.obs”: يعادل الحذف الشامل للصفوف (Listwise Deletion)؛ يستبعد أي مشارك لديه فقد في أي من المتغيرات المدخلة في المصفوفة.
  • “pairwise.complete.obs”: يعادل الحذف الثنائي الموضعي عبر na.rm؛ يحسب معامل الارتباط بين كل زوج من المتغيرات بناءً على الحالات التي تتوفر فيها بيانات صالحة لكلا المتغيرين معاً فقط.

تؤثر هذه الخيارات تأثيراً مباشراً على حساب ثبات الاختبارات في حزم القياس النفسي مثل psych عبر دالة alpha(). إن استخدام الحذف الثنائي يحافظ على درجات حرية أعلى لكل معامل ارتباط، ولكنه قد يؤدي في بعض الحالات إلى مصفوفات ارتباط غير موجبة التحديد (Non-positive definite matrices)، مما يتطلب فحصاً حذراً قبل المضي قدماً في التحليلات العاملية الاستكشافية والتوكيدية.

8. الفروق الجوهرية بين na.rm ودوال معالجة المفقودات الأخرى في R

8.1 المقارنة بين na.rm = TRUE ودالة na.omit()

يكمن الاختلاف الجوهري بين na.rm = TRUE ودالة na.omit() في النطاق المعماري لعملية الاستبعاد. يُعد na.rm = TRUE إجراءً موضعياً عابراً ولحظياً (Local/Ad-hoc)، حيث يُطبق على متجه رقمي أثناء تنفيذ دالة إحصائية معينة دون التأثير على بنية إطار البيانات العام. في المقابل، تُعد دالة na.omit() إجراءً هيكلياً شاملاً يُطبق استراتيجية الحذف الشامل للصفوف (Listwise / Casewise Deletion)، حيث تقوم بحذف أي صف يحتوي على قيمة NA واحدة في أي عمود من أعمدة قاعدة البيانات.

ينطوي الاعتماد غير المدروس على na.omit() على مخاطر جسيمة تتعلق بالانخفاض الحاد في حجم العينة الكلي؛ فإذا كان الاستبيان يضم 50 متغيراً موزعة على 500 مفحوص، وكان الفقد مبعثراً بنسبة 2% في كل متغير عبر مشاركين مختلفين، فإن تطبيق na.omit() قد يؤدي إلى حذف أكثر من نصف العينة الكلية، مما يقلل القوة الإحصائية بشكل كارثي. في حين أن استخدام na.rm = TRUE يسمح باستثمار البيانات المتاحة في كل متغير بنسبة 98%.

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

8.2 المقارنة مع complete.cases() و is.na()

تمثل الدالتان is.na() وcomplete.cases() أدوات الفحص المنطقي الثنائي (Boolean Logical Vectors) في R. تُرجع الدالة is.na(x) متجهاً منطقياً يحمل القيمة TRUE لكل عنصر مفقود وFALSE لكل عنصر صالح. يستغل المبرمجون المحترفون هذه الخاصية لإجراء تصفية يدوية سريعة للمتجهات عبر التعبير: x[!is.na(x)]، وهو ما يطابق وظيفياً تمرير na.rm = TRUE للدوال الحسابية.

أما الدالة complete.cases()، فتُطبق على إطارات البيانات والمصفوفات لإنتاج متجه منطقي يشير إلى الصفوف المكتملة الخالية تماماً من أي فقد عبر جميع الأعمدة. يُستخدم التعبير data[complete.cases(data), ] لفلترة البيانات يدوياً. من الناحية البرمجية، تُعد التصفية المباشرة عبر na.rm = TRUE داخل الدوال المبنية في لغة C أسرع في استهلاك الذاكرة والمعالجة الحسابية مقارنة بإنشاء متجهات منطقية وسيطة وتطبيق الفهرسة اليدوية في R، لا سيما عند التعامل مع مجموعات البيانات الضخمة (Big Data).

8.3 مقارنة na.rm مع تقنيات التعويض الإحصائي (Imputation)

يتوقف الاختيار المنهجي بين استخدام na.rm = TRUE واعتماد تقنيات التعويض الإحصائي (Imputation) على نسبة البيانات المفقودة وطبيعة الفرضيات البحثية. يمثل na.rm استراتيجية “تجاهل واستبعاد المشاهدة”، في حين يمثل التعويض استراتيجية “تقدير واستبدال القيمة المفقودة” بقيمة احتمالية مستندة إلى العلاقات الارتباطية بين المتغيرات الأخرى.

تعتبر استراتيجيات التعويض الفردي البسيط (Single Imputation)، مثل التعويض بالمتوسط الحسابي، أساليب غير مستحبة حديثاً لأنها تؤدي إلى تقليص مصطنع لتباين المتغير وتضخيم وهمي لدرجات الثقة الإحصائية. في المقابل، تبرز تقنيات التعويض الإحصائي المتعدد عبر المعادلات المتسلسلة (MICE – Multivariate Imputation by Chained Equations) كمعيار ذهبي لمعالجة الفقد؛ حيث تقوم بإنشاء مجموعات بيانات متعددة تعكس عدم اليقين المرتبط بالقيم المفقودة.

يُنصح منهجياً بالاكتفاء بـ na.rm = TRUE في مراحل الاستكشاف الأولي وعندما تكون نسبة الفقد ضئيلة للغاية (أقل من 3% إلى 5%) موزعة عشوائياً بالكامل. أما في حال ارتفاع معدلات الفقد وتجاوزها 10% في الدراسات الطولية والمسحية الكبرى، فإن الانتقال إلى حزم التعويض المتقدمة مثل mice أو حزمة Amelia يصبح ضرورة منهجية لتفادي الانحياز الإحصائي وضمان قوة التعميم العلمي.

9. الأثر الإحصائي لحذف القيم المفقودة باستخدام na.rm على دقة النتائج

9.1 أنماط البيانات المفقودة (MCAR, MAR, MNAR) وتأثير na.rm عليها

صاغ عالم الإحصاء دونالد روبين (Donald Rubin) الإطار النظري التأسيسي لتصنيف آليات الفقد إلى ثلاثة أنماط رئيسية تحدد الصلاحية الإحصائية لاستخدام تقنيات الحذف عبر na.rm:

  • مفقود تماماً عشوائياً (Missing Completely at Random – MCAR): يحدث عندما لا يرتبط احتمال فقدان المشاهدة بأي متغير مرصود أو غير مرصود داخل الدراسة. في هذه الحالة، تكون العينة الصالحة المتبقية بعد تفعيل na.rm = TRUE ممثلة تمثيلاً غير متحيز للمجتمع الأصلي، وتقتصر الخسارة على انخفاض القوة الإحصائية فقط.
  • مفقود عشوائياً (Missing at Random – MAR): يحدث عندما يرتبط الفقد بمتغيرات مرصودة أخرى داخل قاعدة البيانات، ولكنه لا يرتبط بقيمة المتغير المفقود نفسه (مثال: ميل الذكور لعدم الإفصاح عن درجات القلق مقارنة بالإناث، مع ثبات مستوى القلق الفعلي). هنا يؤدي na.rm البسيط إلى تحيز في النتائج ما لم تُضبط المتغيرات الوسيطة عبر النمذجة أو التعويض.
  • مفقود غير عشوائي (Missing Not at Random – MNAR): النمط الأخطر إحصائياً، حيث يرتبط احتمال الفقد بقيمة المتغير المفقود ذاته (مثال: امتناع الأفراد ذوي الاكتئاب الحاد جداً عن ملء بنود مقياس الاكتئاب). في هذه الحالة، يؤدي استخدام na.rm = TRUE إلى استبعاد أكثر الحالات حدة، مما ينتج عنه متوسطات منخفضة زائفاً ونتائج مضللة جذرياً تعجز عن عكس الواقع الإكلينيكي.

يتعين على الباحث فحص نمط الفقد الإحصائي تجريبياً عبر اختبار ليتل (Little’s MCAR Test) المتاح في حزمة naniar أو BaylorEdPsych قبل الركون التام إلى سلامة مخرجات na.rm.

9.2 التأثير على قوة الاختبار الإحصائي (Statistical Power) وخطأ القياس

يترتب على استبعاد البيانات المفقودة عبر na.rm = TRUE تقليص فوري في حجم العينة الفعلي ($N$) المستخدم في الاختبارات الاستدلالية. يؤدي هذا التقليص إلى توسيع الخطأ المعياري للتقدير ($Standard Error = s / \sqrt{n}$)، مما ينتج عنه اتساع فترات الثقة (Confidence Intervals) وانخفاض دقة التقدير الإحصائي للمعالم المجتمعية.

علاوة على ذلك، يتأثر مفهوم “قوة الاختبار الإحصائي” (Statistical Power)—وهي احتمالية رفض الفرضية الصفرية عندما تكون خاطئة بالفعل ($1 – \beta$)—سلباً بنقصان حجم العينة؛ مما يزيد من مخاطر الوقوع في الخطأ من النوع الثاني (Type II Error)، أي الفشل في اكتشاف فروق حقيقية أو علاقات جوهرية موجودة بالفعل بين المتغيرات المدروسة.

كما يمكن أن يؤدي الحذف الموضعي إلى تضخيم أو تقليص مصطنع في حجوم الأثر (Effect Sizes) مثل معامل كوهين $d$ أو مربع إيتا $\eta^2$. لذلك، تشترط المعايير الأكاديمية الصارمة الإفصاح الدقيق عن حجم العينة الاسمي (Nominal Sample Size) قبل الحذف، وحجم العينة الفعلي المستخدم (Achieved Sample Size) في كل عملية إحصائية نُفذت باستخدام na.rm = TRUE لتمكين القراء والمحكمين من تقييم متانة الاستنتاجات العلمية.

10. التعامل مع الحالات المتقدمة والمصفوفات متعددة الأبعاد بواسطة na.rm

10.1 تطبيق na.rm على المصفوفات (Matrices) والمصفوفات متعددة الأبعاد (Arrays)

في تصاميم البحوث التجريبية المتقدمة التي تتضمن قياسات متكررة عبر الزمن (Time-series Designs) أو بيانات عصبية وسلوكية معقدة، تُخزن البيانات داخل مصفوفات ثنائية أو متعددة الأبعاد (Arrays). توفر لغة R دوالاً موجهة مدمجة فائقة السرعة مكتوبة بلغة C للتعامل مع هذه الهياكل، أبرزها colMeans()، rowMeans()، colSums()، وrowSums().

# إنشاء مصفوفة استجابات تجريبية (4 مفحوصين عبر 3 فترات زمنية)
longitudinal_matrix <- matrix(
  c(12, 15, NA, 20, 14, NA, 18, 22, 10, 11, 13, NA),
  nrow = 4,
  ncol = 3,
  dimnames = list(paste0("Subject_", 1:4), paste0("Time_", 1:3))
)

# حساب متوسط الأداء عبر الزمن ومتوسط كل مفحوص بدقة فائقة
time_means <- colMeans(longitudinal_matrix, na.rm = TRUE)
subject_means <- rowMeans(longitudinal_matrix, na.rm = TRUE)

تتميز هذه الدوال بقدرتها على التعامل مع المصفوفات الضخمة التي تحتوي على مئات الآلاف من العناصر بسرعة تفوق أداء دوال apply بأضعاف مضاعفة، مما يجعلها الخيار الهندسي الأول في معالجة مصفوفات القياس النفسي العصبي والتصوير الدماغي وتتبع حركة العين، مع ضمان الاستبعاد الآمن لقيم NA على طول المحاور المحددة.

10.2 استخدام na.rm داخل الدوال المخصصة (Custom Functions)

عند بناء دوال إحصائية مخصصة لتلبية احتياجات بحثية نوعية، يُعد تمرير وسيط na.rm كمعامل اختياري للمستخدم ممارسة برمجية قياسية تعكس احترافية الكود البرمجي. يتيح ذلك لمستخدم الدالة التحكم في سياسة إدارة الفقد بمرونة تامة.

يوضح المثال البرمجي التالي كيفية بناء دالة مخصصة لحساب “معامل الالتواء الإحصائي” (Skewness Coefficient) مع دعم المعامل المنطقي وعامل القطع المتعدد (Ellipsis ...):

# بناء دالة مخصصة لحساب معامل الالتواء مع وسيط na.rm مدمج
calc_skewness <- function(x, na.rm = TRUE) {
  # التحقق من نوع المدخلات
  if (!is.numeric(x)) {
    stop("خطأ: يجب أن يكون المتجه المدخل عدداً رقمياً.")
  }

  # تصفية البيانات إذا طُلب ذلك
  if (na.rm) {
    x <- x[!is.na(x)]
  }

  n <- length(x)
  if (n < 3) return(NA_real_) # درجات حرية غير كافية

  m <- mean(x)
  s <- sd(x)
  skew <- (sum((x - m)^3) / n) / (s^3)
  return(skew)
}

كما يمكن استخدام معامل التمرير العام ... داخل الدوال لتمرير na.rm = TRUE تلقائياً إلى كافة الدوال الإحصائية الفرعية المنفذة في الداخل دون الحاجة لإعادة تعريفه يدوياً في كل خطوة، مما يسهم في كتابة شيفرات برمجية نظيفة وقابلة للصيانة والتطوير.

11. الأخطاء البرمجية الشائعة عند استخدام na.rm وكيفية تصحيحها

11.1 محاولة تمرير na.rm لدوال لا تدعم هذا المعامل

يقع كثير من مبرمجي وباحثي R المبتدئين في خطأ افتراض أن جميع دوال اللغة تقبل الوسيط na.rm = TRUE. عند محاولة تمرير هذا المعامل لدوال لا تتضمنه في بنيتها التعريفية، يتوقف تنفيذ البرنامج فوراً وتظهر رسالة الخطأ الشهيرة:

Error in some_function(x, na.rm = TRUE) : unused argument (na.rm = TRUE)

من أبرز الأمثلة على ذلك دالة النمذجة الخطية الأساسية lm()، ودالة الارتباط cor()، ودوال اختبارات الفروض مثل t.test(). تعتمد دالة الانحدار الخطي lm() على وسيط بديل يُدعى na.action، والذي يقبل خيارات مثل na.omit أو na.exclude أو na.fail لتحديد كيفية معالجة المشاهدات المفقودة في النموذج، في حين تعتمد cor() على وسيط use كما أسلفنا.

لتجنب هذا الخطأ، يجب على الباحث استشارة التوثيق الرسمي للدالة بكتابة علامة الاستفهام متبوعة باسم الدالة في سطر الأوامر (مثل ?lm أو ?t.test)، وفحص قائمة الوسائط المدعومة (Arguments) قبل كتابة الكود التحليلي.

11.2 التعامل مع المتجهات الفارغة تماماً من القيم الصالحة

تنتج سلوكيات حسابية غير متوقعة عند تطبيق الدوال الإحصائية مع na.rm = TRUE على متجهات تتكون حصراً من قيم NA (All-NA Vectors). يؤدي غياب أي قيمة عددية صالحة إلى توليد مخرجات قد تبدو مضللة للباحث غير المتمرس:

  • الدالة sum(): عند تنفيذ sum(c(NA, NA), na.rm = TRUE)، يكون الناتج الحسابي هو 0 (المحايد الجمعي)، وهو ما قد يوهم الباحث بوجود مجموع صفري حقيقي بدلاً من انعدام البيانات.
  • الدالة mean(): عند تنفيذ mean(c(NA, NA), na.rm = TRUE)، تسفر العملية عن NaN مع ظهور رسالة تحذيرية تفيد بحدوث قسمة على الصفر ($0 / 0$) لغياب المشاهدات في المقام.
  • الدوال max() و min(): عند تنفيذ max(c(NA, NA), na.rm = TRUE)، تُرجع الدالة -Inf، في حين تُرجع min() القيمة Inf مع إطلاق تحذيرات تفيد بأن المعاملات غير متوفرة (no non-missing arguments to max/min).

تتطلب معالجة هذه الحالات الشاذة بناء شروط تحقق مسبقة في الكود البرمجي تفحص ما إذا كان المتجه يحتوي على قيمة صالحة واحدة على الأقل عبر الشرط: if (all(is.na(x)))، للتعامل مع المتجهات الفارغة بطريقة آمنة لا تشوه نتائج التقارير الإحصائية المجمعة.

11.3 كتابة المعامل بصيغة غير صحيحة

تتميز لغة R بحساسيتها الشديدة لحالة الأحرف (Case Sensitivity). لذلك، فإن أي خطأ إملائي طفيف في كتابة المعامل سيؤدي إلى فشل العملية الحسابية أو تجاهل الوسيط بالكامل. تشمل الأخطاء الشائعة كتابة NA.RM = TRUE بأحرف كبيرة، أو narm = TRUE بحذف النقطة الفاصلة، أو na_rm = TRUE بشرطة سفلية.

كذلك، يقع البعض في خطأ إسناد نصوص بدلاً من المتغيرات المنطقية، مثل كتابة na.rm = "TRUE" أو na.rm = "T" بين علامات تنصيص؛ مما يجعل المترجم يتعامل معها كسلسلة نصية تفشل في تشغيل مفتاح التصفية المنطقي، وقد تقود إلى نتائج غير متوقعة بسبب التحويل غير المناسب للأنواع.

تتمثل الممارسة الفضلى لتصحيح الأخطاء (Debugging) في الالتزام بالكتابة المعيارية الصريحة بأحرف صغيرة: na.rm = TRUE، واستخدام بيئات التطوير المتكاملة مثل RStudio / Posit Workbench التي توفر ميزات الإكمال التلقائي الذكي للوسائط (Auto-completion) لتفادي الأخطاء الطباعية وتوفير وقت التحليل.

12. أفضل الممارسات المنهجية والبرمجية عند التعامل مع na.rm في البحث العلمي

12.1 إرشادات كتابة التقارير الإحصائية وتوثيق المفقودات وفق معايير APA

تفرض جمعية علم النفس الأمريكية في دليلها السيكومتري والتحليلي السابع (APA 7th Edition) معايير شفافية متقدمة في الإفصاح عن البيانات المفقودة وكيفية إدارتها برمجياً. لا يجوز للباحث الأكاديمي الاكتفاء بتقديم المتوسطات والانحرافات المعيارية دون توضيح حجم الفقد الميداني والآلية المتبعة للتعامل معه.

يجب أن يتضمن التقرير العلمي توثيقاً مفصلاً في قسم المنهجية والإجراءات يغطي النقاط التالية:

  • العدد الكلي للمشاركين المسجلين في الدراسة ($N$).
  • عدد ونسبة الاستجابات المفقودة لكل متغير من المتغيرات موضع الدراسة في جدول الإحصاء الوصفي الأساسي.
  • الإفصاح الصريح عن استخدام الحذف الموضعي (Pairwise Deletion / Ad-hoc removal عبر na.rm = TRUE) مع توضيح درجات الحرية الفعلية ($df$) المرافقة لكل اختبار استدلالي.
  • تبرير عدم استخدام نماذج التعويض المتقدمة إذا كانت نسبة الفقد متدنية، أو تقديم مقارنة حساسية (Sensitivity Analysis) تبرهن على عدم تغير النتائج الجوهرية بتغير طريقة معالجة المفقودات.

إن الالتزام بهذه الضوابط التوثيقية يعزز من الموثوقية الأكاديمية للدراسة ويسهل عملية المراجعة والتحكيم في المجلات العلمية المصنفة دولياً.

12.2 قائمة التحقق البرمجية للباحث ومحلل البيانات في R

لضمان أعلى درجات الدقة الإحصائية وقابلية إعادة الإنتاج العلمي (Reproducibility) للأكواد التحليلية، يُنصح كل محلل بيانات وباحث باتباع قائمة التحقق البرمجية المنهجية التالية قبل اعتماد نتائج na.rm:

  1. الفحص البصري والرقمي الاستكشافي: استخدام دالة summary() أو حزمة naniar لرسم خريطة توزيع المفقودات وتحديد ما إذا كان الفقد متكتلاً في متغيرات أو مجموعات سكانية معينة.
  2. اختبار عشوائية الفقد: إجراء الفحوص الإحصائية الملائمة للتأكد من تحقق فرضية العشوائية الكاملة (MCAR) قبل الركون للحذف الموضعي.
  3. التدقيق في المقامات والدرجات الحرجة: التحقق من أن حساب المتوسطات والانحرافات المعيارية يعتمد على الأحجام الحقيقية الصالحة للعينة، وتجنب استخدام sum(..., na.rm = TRUE) مع مقاييس الاستبيانات دون ضبط أثر البنود المتروكة.
  4. تضمين شروط الأمان في الدوال المخصصة: التأكد من وضع معالجات استثنائية للمتجهات الفارغة تماماً لمنع تسرب قيم 0 وNaN وInf المضللة إلى التقارير النهائية.
  5. توثيق بيئة التحليل والحزم البرمجية: تدوين إصدار لغة R والحزم المستخدمة وتثبيت بذور التوليد العشوائي إن وُجدت، لضمان تطابق المخرجات عند إعادة تشغيل الشيفرات من قبل باحثين آخرين.

خاتمة

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

ومع ذلك، يجب أن يظل استخدام na.rm = TRUE محكوماً بالوعي المنهجي الرصين بأنماط البيانات المفقودة ومحددات القياس السيكومتري؛ فالحذف الموضعي ليس حلاً سحرياً لكافة معضلات الفقد، بل هو خيار تحليلي تحكمه شروط العشوائية واعتدال نسب الغياب. ومن خلال المزاوجة الواعية بين الدقة البرمجية في كتابة شيفرات R والالتزام الصارم بمعايير التوثيق الأكاديمي، يرتقي الباحث بجودة مخرجاته العلمية ويضمن نزاهة وقابلية تعميم نتائج أبحاثه الميدانية والتجريبية.

References

  • American Psychological Association. (2020). Publication manual of the American Psychological Association (7th ed.). American Psychological Association. https://doi.org/10.1037/0000165-000
  • Little, R. J. A. (1988). A test of missing completely at random for multivariate data with missing values. Journal of the American Statistical Association, 83(404), 1198–1202. https://doi.org/10.1080/01621459.1988.10478722
  • R Core Team. (2023). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. https://www.R-project.org/
  • Revelle, W. (2023). psych: Procedures for psychological, psychometric, and personality research. Northwestern University, Evanston, Illinois. https://CRAN.R-project.org/package=psych
  • Rubin, D. B. (1976). Inference and missing data. Biometrika, 63(3), 581–592. https://doi.org/10.1093/biomet/63.3.581
  • Tierney, N., & Cook, D. (2023). Expanding tidy data principles to facilitate missing data exploration, visualization and assessment of imputations. Journal of Statistical Software, 105(7), 1–31. https://doi.org/10.18637/jss.v105.i07
  • van Buuren, S., & Groothuis-Oudshoorn, K. (2011). mice: Multivariate imputation by chained equations in R. Journal of Statistical Software, 45(3), 1–67. https://doi.org/10.18637/jss.v045.i03
  • Wickham, H., Averick, M., Bryan, J., Chang, W., McGowan, L. D., François, R., Müller, K., & Yutani, H. (2019). Welcome to the Tidyverse. Journal of Open Source Software, 4(43), 1686. https://doi.org/10.21105/joss.01686
  • Wickham, H., Çetinkaya-Rundel, M., & Grolemund, G. (2023). R for data science: Import, tidy, transform, visualize, and model data (2nd ed.). O’Reilly Media. https://r4ds.hadley.nz/

اقتباس هذا المقال

looti, M. (2026, سبتمبر 1). كيفية استخدام na.rm في R (مع أمثلة). عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-use-na-rm-in-r-with-examples/
looti, Mohammed. “كيفية استخدام na.rm في R (مع أمثلة).” عرب سايكلوجي, 1 سبتمبر 2026, https://arabpsychology.com/statistics/how-to-use-na-rm-in-r-with-examples/.
looti, Mohammed. “كيفية استخدام na.rm في R (مع أمثلة).” عرب سايكلوجي. سبتمبر 1, 2026. https://arabpsychology.com/statistics/how-to-use-na-rm-in-r-with-examples/.