التحليل الإحصائيبرمجة SAS

كيفية إزالة الصفوف ذات القيم المفقودة في SAS

دليل أكاديمي ومنهجي شامل يوضح كيفية إزالة الصفوف التي تحتوي على قيم مفقودة في برنامج SAS باستخدام دوال مثل CMISS وخطوات البيانات وتقنيات التحليل الإحصائي.

Mohammed looti أكاديمي وباحث متخصص في علم النفس
تاريخ النشر
تمت المراجعة العلمية · د. مروة عبد العظيم · 11 سبتمبر، 2026
مراجعة وتدقيق علمي معتمد تاريخ التدقيق: 11 سبتمبر، 2026
د. مروة عبد العظيم دكتوراه
أستاذة علم النفس جامعة كربلاء
معايير التدقيق والاعتماد السريري

يخضع هذا المحتوى لمعايير ضبط الجودة والتدقيق العلمي والأكاديمي الصارمة في شبكة علم النفس العربي، لضمان صحة المعلومات ودقتها السريرية ومطابقتها لأحدث الأدلة والبراهين الصادرة عن الجمعيات النفسية والطبية المعتمدة (APA / WHO).

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

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

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

1. مقدمة نظرية حول تمثيل القيم المفقودة في نظام التحليل الإحصائي (SAS)

1.1 مفهوم القيم المفقودة وطبيعتها في بيئة SAS

تُعرّف القيمة المفقودة في بيئة نظام التحليل الإحصائي (SAS) بأنها غياب القيمة المقاسة أو الملاحظة لمتغير معين في سجل محدد داخل جدول البيانات. ينطلق النظام من بنية ثنائية صارمة تفصل فصلاً جذرياً بين المتغيرات الرقمية (Numeric Variables) والمتغيرات الرمزية أو النصية (Character Variables). في المتغيرات الرقمية، يُمثل النظام القيمة المفقودة القياسية بنقطة مفردة (.)، وهي تعبير رمزي يُخزن داخلياً بأصغر قيمة عددية ممكنة يمكن للنظام تمثيلها، وتكون أقل من أدنى قيمة سالبة في نطاق الأرقام الحقيقية. أما في المتغيرات النصية، فإن القيمة المفقودة تُخزن كسلسلة من المساحات الفارغة (Blank Spaces) تتطابق في طولها مع الطول المحدد لسلسلة البايتات المخصصة للمتغير في قاموس البيانات.

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

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

1.2 أثر المفقودات على دقة النمذجة الإحصائية والقياس النفسي

يشكل وجود البيانات المفقودة خطراً حقيقياً يهدد سلامة الاستدلال الإحصائي والقياس النفسي والتربوي، حيث يتجاوز مجرد كونه عائقاً برمجياً إلى كونه مصدراً رئيسياً للتحيز المنهجي (Methodological Bias). عندما تُفقد البيانات بنمط غير منتظم، فإن العينة المستبقاة للتحليل النهائي تفقد تمثيلها العادل للمجتمع الأصلي، مما يؤدي إلى خلل فادح في الصدق الداخلي (Internal Validity) للدراسة نتيجة التشوه في تقدير معالم المجتمع، فضلاً عن تقويض الصدق الخارجي (External Validity) الذي يحول دون تعميم النتائج على فئات سكانية مشابهة للبيئة التي انطلقت منها التجربة.

من الناحية الرياضية، يتسبب انخفاض حجم العينة الفعال الناتج عن فقدان البيانات في تراجع مباشر للقوة الإحصائية (Statistical Power) للاختبارات البارامترية، مثل اختبارات “ت” (t-tests) وتحليل التباين (ANOVA) ونماذج الانحدار الخطي المتعدد. يعني تراجع القوة الإحصائية ازدياد احتمالية ارتكاب الخطأ من النوع الثاني (Type II Error)، أي الفشل في رفض الفرضية الصفرية الخاطئة، مما قد يؤدي إلى إهمال تأثيرات علاجية أو فروق جوهرية ذات دلالة علمية وعملية بالغة الأهمية. في القياس النفسي، يؤدي حذف البنود المفقودة أو استبعاد المفحوصين إلى تقويض موثوقية المقاييس؛ حيث تتأثر معاملات الاتساق الداخلي، مثل ألفا كرونباخ، بحجم التباين المشترك بين البنود، والذي يتعرض للتشويه عند اختفاء استجابات عشوائية أو موجهة.

تتطلب المعايير المنهجية الصارمة قبل الشروع في بناء النماذج الإحصائية المتقدمة، مثل نمذجة المعادلات الهيكلية (Structural Equation Modeling) والنماذج الخطية الهرمية (Hierarchical Linear Models)، فحصاً استكشافياً دقيقاً لطبيعة الفقدان. يتعين على الباحث التحقق مما إذا كان الفقدان يتبع آليات عشوائية بالكامل أم أنه مدفوع بعوامل خفية ترتبط بمتغيرات الدراسة ذاتها. إن إهمال هذه الخطوة التشخيصية والشروع المباشر في تشغيل الإجراءات التحليلية المتقدمة في SAS يقود حتماً إلى مصفوفات ارتباط غير موجبة التحديد (Non-positive Definite Matrices)، مما يمنع النماذج من الوصول إلى نقطة التقارب الرياضي (Convergence) ويفشل التحليل الإحصائي برمته.

1.3 مسوغات اللجوء إلى استراتيجية الحذف الكامل للملاحظات (Listwise Deletion)

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

يستند المسوغ الرياضي الأساسي لتبني الحذف الكامل إلى افتراض أن آلية فقدان البيانات هي الفقدان العشوائي التام (Missing Completely at Random – MCAR). وفقاً لهذا المفهوم الذي صاغه الإحصائي دونالد روبين، يتحقق هذا الافتراض عندما يكون احتمال فقدان قيمة معينة مستقلاً تماماً عن المتغير نفسه وعن أي متغيرات أخرى مسجلة في مجموعة البيانات. في ظل توفر شرط MCAR، يضمن الحذف الكامل عدم تحيز تقديرات المعالم (Unbiased Parameter Estimates)؛ أي أن المتوسطات ومعاملات الانحدار المحسوبة على العينة المكتملة تظل مقدرات غير متحيزة لمعالم المجتمع الأصلي، وتقتصر الخسارة فقط على انخفاض الكفاءة الإحصائية جراء انخفاض حجم العينة الكلي.

تعتبر هذه الاستراتيجية مفضلة كذلك في الدراسات التي تتطلب اتساقاً مطلقاً في المقاييس المتعددة ومصفوفات التباين، حيث يضمن استخدام نفس العينة الدقيقة لجميع الحسابات المقارنة تفادي التناقضات الحسابية التي تنشأ أحياناً عن أساليب الحذف الزوجي (Pairwise Deletion). ومع ذلك، يجب توخي الحذر الشديد؛ فإذا تجاوزت نسبة السجلات المحذوفة 5% إلى 10% من إجمالي حجم العينة، أو إذا فشلت البيانات في استيفاء شروط اختبارات الفقدان العشوائي التام (مثل اختبار ليتل Little’s MCAR Test)، فإن تقليص العينة قد يُحدث تشوهاً جوهرياً في بنية التوزيعات التكرارية ويفرغ البحث من مصداقيته العلمية.

2. البنية البرمجية الأساسية لحذف الملاحظات عبر خطوة البيانات (DATA Step)

2.1 آلية عمل جملة الحذف الشرطية (DELETE Statement)

تُمثل خطوة البيانات (DATA Step) النواة الأساسية لمعالجة وتحويل البيانات في بنية SAS التحتية. تعتمد هذه الخطوة على حلقة معالجة تكرارية ضمنية (Implicit Loop) تقرأ سجلات البيانات صفاً تلو الآخر من الجدول المصدر، وتضع كل صف داخل مساحة ذاكرة مؤقتة تُعرف بمتجه بيانات البرنامج (Program Data Vector – PDV). يتم تنفيذ جميع العمليات المنطقية والتحويلات الحسابية داخل هذا المتجه قبل أن يُكتب السجل في مجموعة البيانات المخرجة النهائية. وتلعب جملة الحذف الشرطية (DELETE Statement) دوراً محورياً في التحكم في مسار هذا التدفق البرمجي.

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

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

2.2 إنشاء مجموعات بيانات نظيفة مقابل التعديل على البيانات الأصلية

تعتبر سلامة البيانات الأصلية (Data Integrity) مبدأً مقدساً في الحوسبة الإحصائية والتحليل المتقدم. في بيئة SAS، تتيح المرونة البرمجية للمطور خيارين: إما الكتابة فوق الجدول الأصلي لتعديله مباشرة، أو إنشاء جدول جديد وسيط ومستقل يحمل البيانات المنقحة. تقتضي الممارسات المعيارية المعتمدة في الأوساط الأكاديمية والسريرية الامتناع القاطع عن الكتابة المباشرة فوق جداول البيانات الخام؛ إذ إن فقدان البيانات الأصلية نتيجة خطأ برمجي غير مقصود في كتابة شروط الحذف يؤدي إلى أضرار لا يمكن تداركها وإلى تعذر استعادة المدخلات الأولية للتجربة.

يتيح بناء بيئات تحليلية وسيطة الحفاظ الكامل على ما يُعرف بقابلية إعادة إنتاج التحليل (Reproducibility). من خلال تخصيص جدول إخراج جديد عبر جملة DATA clean_data; SET raw_data;، يضمن الباحث وجود مسار تدقيق رقمي واضح (Audit Trail) يتيح لأي طرف خارجي أو مدقق علمي مراجعة خطوات التحويل خطوة بخطوة، والتحقق من حجم البيانات المستبعدة ومقارنتها مباشرة بالأصل. كما تسهم هذه المنهجية في تجنب قفل الملفات المشتركة في قواعد البيانات المتعددة المستخدمين، مما يسمح لفرق العمل بالعمل التزامني دون تضارب صلاحيات الوصول.

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

2.3 قراءة وتفسير مخرجات سجل العمليات (SAS Log)

يُعد سجل العمليات في SAS (المعروف بـ SAS Log) الواجهة التشخيصية الأكثر أهمية لتقييم صحة تنفيذ العمليات البرمجية وسلامتها المنهجية. لا يقتصر دور هذا السجل على رصد الأخطاء البرمجية الصريحة التي توقف المعالجة، بل يقدم تقريراً كمياً مفصلاً يوثق حركة البيانات عبر النظام. بعد تشغيل خطوة البيانات الخاصة بحذف الملاحظات، يجب على المحلل فحص السطور التي تسرد عدد السجلات التي تمت قراءتها من الجدول المصدر بدقة ومقارنتها بعدد السجلات التي كُتبت بنجاح في الجدول المصفى الجديد.

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

بالإضافة إلى إحصاء الملاحظات، يجب التحقق بصرامة من خلو سجل العمليات من رسائل التحذير (WARNING) والتنبيهات الخاصة بالتحويل التلقائي لأنماط البيانات (Numeric to Character Conversion Notes). تظهر هذه التنبيهات غالباً عندما تتم كتابة شروط المقارنة المنطقية بطريقة غير دقيقة؛ كأن يُطلب فحص متغير نصي بقيمة رقمية أو العكس. يستهلك التحويل التلقائي دورات معالجة إضافية من وحدة المعالجة المركزية (CPU)، وربما يقود إلى نتائج فرز خاطئة تؤدي إلى حذف صفوف سليمة أو الإبقاء على صفوف مشوهة دون قصد المبرمج.

3. تطبيق الدالة CMISS لحذف الصفوف الشاملة للقيم المفقودة

3.1 الخصائص الوظيفية والرياضية للدالة CMISS

تمثل الدالة CMISS واحدة من أحدث الدوال المدمجة وأكثرها تطوراً في لغة SAS لفحص وتدقيق اكتمال البيانات. صُممت هذه الدالة خصيصاً لتجاوز القيود الوظيفية الصارمة التي كانت تعيب الدوال الإحصائية التقليدية؛ حيث تتميز بقدرتها الفريدة على فحص المتغيرات الرقمية والمتغيرات الرمزية النصية في آن واحد دون الحاجة إلى التمييز المسبق بين نوع البيانات أو كتابة دوال تحويل وسيطة. تلغي هذه الخاصية خطر توقف البرنامج الناتج عن أخطاء عدم تطابق النوع (Type Mismatch Errors) التي كانت شائعة عند استخدام الدوال القديمة.

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

من الناحية المفاهيمية، تتفوق الدالة CMISS على الدوال التقليدية مثل NMISS التي تنحصر حصرياً في النطاق الرقمي، كما تتفوق على استخدام المقارنات المنطقية المتكررة عبر معامل OR. توفر الدالة كفاءة عالية في تخصيص موارد المعالجة داخل بيئة التشغيل؛ حيث تُنفذ عمليات الفحص على مستوى كود الآلة المترجم داخلياً، مما يقلل من زمن الفحص المقارن بالمقارنة مع معالجة الشروط المنطقية الطويلة، فضلاً عن توفيرها صياغة برمجية بالغة الأناقة والاختصار تسهم في تسهيل مراجعة الأكواد وتدقيقها.

3.2 توظيف الكلمة المحجوزة _ALL_ للفحص الميداني الشامل

توفر لغة SAS مجموعة من الكلمات المحجوزة المخصصة للتعامل مع مجاميع المتغيرات دفعة واحدة، وتأتي الكلمة المحجوزة _ALL_ على رأس هذه الأدوات وأقواها تأثيراً. عند إقران هذه الكلمة مع الدوال الفاحصة، يقوم مترجم النظام بتوسيع هذا النطاق تلقائياً ليشمل كافة المتغيرات المعرفة في جدول البيانات الحالي؛ سواء كانت تلك المتغيرات مدخلة مباشرة من الجدول المصدر عبر جملة SET، أو تم إنشاؤها وتحديدها حديثاً داخل خطوة البيانات الجارية قبل استدعاء الدالة.

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

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

3.3 الصياغة التركيبية للتعليمة if cmiss(of _all_) then delete

تمثل الصياغة التركيبية if cmiss(of _all_) then delete; واحدة من أكثر العبارات البرمجية إيجازاً وبلاغة في بيئة برمجة SAS لتحقيق التصفية الشاملة للبيانات. يكمن الفهم العميق لهذه التعليمة في إدراك كيفية تقييم النظام للقيم المنطقية. في SAS، يُقيم أي رقم صحيح موجب (أكبر من الصفر) منطقياً كقيمة “صواب” (True)، في حين يُقيم الصفر فقط كقيمة “خطأ” (False). وبناءً على هذا المبدأ، إذا احتوى السجل على أي قيمة مفقودة واحدة على الأقل في أي عمود، فإن الدالة cmiss(of _all_) ستعيد عدداً صحيحاً يساوي 1 أو أكثر، مما يجعل الشرط صحيحاً (True) وينشط جملة delete فوراً لاستبعاد السجل.

من الأهمية بمكان ملاحظة استخدام الكلمة المفتاحية of قبل الكلمة المحجوزة؛ حيث تخبر هذه الكلمة محرك التحليل النحوي في SAS بأن الوسيطة الممررة ليست متغيراً منفرداً يحمل اسم _all_، بل هي قائمة متغيرات ممتدة يجب استعراض كافة عناصرها وتمريرها مجتمعة إلى وسائط الدالة. يؤدي حذف كلمة of إلى حدوث خطأ نحوي وتوقف تنفيذ البرنامج لعدم تعرف النظام على وجود متغير فردي بهذا الاسم في البيئة الحالية.

تتكامل هذه الصياغة التركيبية مع استراتيجيات البرمجة الصريحة والمباشرة؛ حيث توفر بديلاً مكافئاً تماماً للشرط الممتد المكتوب بصيغة if cmiss(of _all_) > 0 then delete;. ورغم أن الصيغتين تحققان نفس النتيجة على مستوى المعالجة الحسابية، إلا أن الاعتماد على التقييم المنطقي التلقائي للأعداد يوضح مستوى متقدماً من التمكن من القواعد الداخلية للغة، ويقلل من حجم النصوص البرمجية في المشاريع البرمجية الكبرى دون أي مساس بدقة التنفيذ أو سرعته الزمنية.

4. دراسة حالة تطبيقية: تنظيف مجموعة بيانات تجريبية

4.1 تصميم مجموعة البيانات الأولية ومحاكاة المفقودات

لإيضاح التطبيق العملي للمفاهيم النظرية المتقدمة السابقة، سنقوم بتصميم تجربة تطبيقية تحاكي استجابات ميدانية في دراسة وبائية سريرية مختلطة. يشتمل هذا الجدول الافتراضي على خليط متنوع من المتغيرات: معرف المريض (Patient_ID)، والجنس (Gender)، والعمر (Age)، ومستوى ضغط الدم الانقباضي (Systolic_BP)، والتشخيص السريري النهائي (Diagnosis). تم توزيع مواضع الفقدان في هذه المجموعة التجريبية عمداً لتمثيل كافة السيناريوهات المحتملة؛ بما في ذلك السجلات الخالية من أي نقص، والسجلات ذات الفقدان الجزئي في المتغيرات النصية، وتلك التي تعاني من فجوات في المتغيرات الرقمية، بالإضافة إلى السجلات المتدهورة كلياً.

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

توضح الشيفرة البرمجية التالية الخطوات التفصيلية لبناء هذا الجدول وتعبئته بالبيانات التجريبية المعنية بالاختبار:


data clinical_trials_raw;
    length Patient_ID $8 Gender$1 Diagnosis $15;
    infile datalines truncover;
    input Patient_ID $ Gender $ Age Systolic_BP Diagnosis $;
    datalines;
PT001 M 45 120 Hypertension
PT002 F . 115 Normal
PT003 . 50 140 Diabetes
PT004 M 62 . Normal
PT005 F 35 110 .
PT006 M 28 118 Healthy
PT007 . . . .
PT008 F 54 135 Cardiac
;
run;

يتضمن هذا التصميم ثماني ملاحظات تتنوع حالاتها بوضوح؛ فالسجلان (PT001) و(PT006) و(PT008) يمثلون حالات مكتملة البيانات بنسبة 100%، في حين يعاني السجل (PT002) من فقدان المتغير الرقمي للعمر، والسجل (PT003) من غياب المتغير النصي للجنس، بينما يخلو السجل (PT007) تماماً من أي معطيات فعلية في كافة المتغيرات المحددة، مما يجعله نموذجاً مثالياً لاختبار قدرة الخوارزمية البرمجية على الاكتشاف والاستبعاد الدقيق.

4.2 تنفيذ كود المعالجة خطوة بخطوة

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

تتم صياغة البرنامج العلاجي ومتابعة استجابة المترجم الداخلي للنظام عبر الكود البرمجي الموضح أدناه:


data clinical_trials_clean;
    set clinical_trials_raw;
    if cmiss(of _all_) then delete;
run;

عند تمرير هذه الشيفرة إلى المترجم في SAS، يبدأ النظام في قراءة الملاحظة الأولى (PT001) ووضعها في متجه بيانات البرنامج (PDV). تقوم الدالة CMISS بفحص كافة الحقول: المعرف، الجنس، العمر، الضغط، والتشخيص؛ وحيث إن جميع الحقول ممتلئة، تعيد الدالة القيمة (0)، وبالتالي يُقيم الشرط على أنه (False) وتتجاوز المعالجة جملة DELETE ليتم حفظ السجل بنجاح في الجدول الجديد. في السجل الثاني (PT002)، تجد الدالة أن حقل العمر فارغ وممثل بالنقطة، فتعيد القيمة (1)، مما يجعل الشرط صائباً (True)، فتصدر التعليمة DELETE أمراً فورياً بإلغاء كتابة السجل والانتقال السريع للملاحظة التالية.

تتكرر هذه السلسلة الحسابية الصارمة عبر جميع السجلات، مما يؤدي إلى استبعاد السجلات غير المكتملة كالسجل (PT003) لغياب الجنس، و(PT004) لغياب الضغط، و(PT005) لغياب التشخيص، فضلاً عن السجل (PT007) الذي ترتفع فيه نتيجة الدالة إلى (5) لتطابق الفقدان في جميع الأعمدة، ليتم حذفه تلقائياً دون أي تمايز عن الحالات ذات الفقدان الجزئي الفردي.

4.3 معاينة النتائج والتحقق المنهجي باستخدام PROC PRINT

تقتضي أصول العمل الأكاديمي والتحليلي عدم الاكتفاء بنجاح تنفيذ الكود في سجل العمليات، بل يجب إتباع ذلك بفحص بصري وإحصائي للبيانات المخرجة للتأكد اليقيني من تطابق النتائج المحققة مع الفرضيات البرمجية الموضوعة. يُعد الإجراء PROC PRINT الأداة الأساسية السريعة والفعالة لمعاينة محتويات الجداول المستخرجة في بيئة SAS.

يتم استدعاء إجراء الطباعة والتحقق عبر الكود التالي، مع تفعيل ترقيم الملاحظات وتضمين العناوين التوضيحية:


title1 "معاينة مجموعة البيانات السريرية بعد إزالة الصفوف المفقودة";
proc print data=clinical_trials_clean noobs;
run;
title1;

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

5. المقارنة التفصيلية بين دوال فحص الفقدان: CMISS وNMISS وMISSING

5.1 استخدام دالة NMISS للمتغيرات الرقمية فقط

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

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

ومع ذلك، تبرز الأفضلية التحليلية لاعتماد الدالة NMISS في الدراسات الإحصائية الحيوية والاقتصادية التي تتطلب تركيزاً استبعادياً على المقاييس المعملية أو المتغيرات الحسابية فقط دون المساس بالبيانات الديموغرافية والتصنيفية. فعلى سبيل المثال، إذا كان الباحث يدرس قياسات ضغط الدم والوزن ومستوى السكر، ويفضل الاحتفاظ بالمشاركين حتى لو لم يحددوا انتماءهم الجغرافي أو حالتهم الاجتماعية، فإن استخدام if nmiss(of _numeric_) then delete; يحقق هذا التطهير الكمي المستهدف بكفاءة برمجية متناهية دون المساس بالمتغيرات النصية غير المكتملة.

5.2 استخدام الدالة MISSING كأداة اختبار شرطية فردية

تُعد الدالة MISSING أداة التحقق الشرطي الفردية الأكثر انتشاراً ومرونة في مكتبة لغة SAS؛ وتعود هذه الشهرة الواسعة إلى قدرتها المتأصلة على قبول المتغيرات الفردية بصرف النظر عن طبيعتها الهيكلية، فهي تتعامل بسلاسة تامة مع المتغيرات الحسابية الرقمية وتتحقق في الوقت ذاته من المتغيرات الرمزية النصية. تُعيد الدالة قيمة منطقية ثنائية محددة: القيمة (1) إذا كانت القيمة الممررة مفقودة فعلياً (سواء كانت نقطة رقمية أو مساحة نصية بيضاء)، والقيمة (0) إذا كان المتغير يحتوي على بيانات صالحة.

تتجلى القوة التطبيقية للدالة MISSING عند بناء الشروط المنطقية الموجهة نحو متغيرات محددة وحرجة داخل مصفوفة التحليل؛ حيث يمكن للمحلل كتابة شروط مركبة بالاعتماد على معاملات الربط البوليانية مثل OR و AND، كأن يُصاغ الشرط: if missing(Age) or missing(Diagnosis) then delete;. يتيح هذا النهج تحكماً فائق الدقة في مسار استبعاد السجلات وتوجيه الفحص نحو المتغيرات الحاكمة التي لا يستقيم التحليل بدونها، متجاهلاً النقص في المتغيرات التكميلية أو الثانوية التي يمكن استيعابها أو تعويضها لاحقاً.

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

5.3 مصفوفة الاختيار البرمجي بين الدوال المتخصصة

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

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

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

المعيار البرمجي دالة CMISS دالة NMISS دالة MISSING
أنواع البيانات المقبولة المتغيرات الرقمية والنصية معاً المتغيرات الرقمية فقط متغير فردي (رقمي أو نصي)
دعم وسائط القوائم (OF List) مدعوم بالكامل (مثل of _all_) مدعوم للمتغيرات الرقمية فقط غير مدعوم (يقبل متغيراً واحداً)
نوع القيمة المخرجة عدد صحيح (إجمالي المفقودات) عدد صحيح (المفقودات الرقمية) قيمة منطقية ثنائية (0 أو 1)
حالة الاستخدام المثلى التنظيف الشامل للجداول المختلطة المصفوفات المعملية والمالية الصرفة الشروط الانتقائية ذات القواعد الخاصة

6. الحذف الانتقائي للصفوف بناءً على مجموعات فرعية من المتغيرات

6.1 تحديد متغيرات الدراسة الأساسية واستثناء المتغيرات الثانوية

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

يتجلى هذا المبدأ بوضوح عند تصميم نماذج الانحدار المتعدد والنمذجة السببية؛ حيث يُعد اكتمال المتغير التابع (Dependent Variable) شرطاً أساسياً لا يقبل المساومة لتضمين الحالة في التحليل، بينما يمكن في كثير من الأحيان التسامح مع بعض الفقدان في المتغيرات التفسيرية المستقلة (Independent Variables) في مراحل التحليل الاستكشافي الأولي، أو معالجتها لاحقاً عبر التعويض. يتيح الاستهداف البرمجي لمجموعات محددة من الأعمدة للمحلل الحفاظ على حجم عينة كبير وكافٍ لدعم استقرار النموذج الإحصائي وقوته التنبؤية.

برمجياً، يتم تنفيذ هذا الفحص الانتقائي عبر صياغة شروط تركز على مصفوفات فرعية يتم اختيارها بعناية فائقة. فبدلاً من تطبيق الدوال على كامل الجدول، يحدد الباحث أسماء الحقول بدقة، كأن يُكتب السطر البرمجي: if cmiss(Treatment, Outcome_Score) > 0 then delete;. يضمن هذا الإجراء الحاسم عدم إسقاط أي مريض يمتلك بيانات كاملة تخص متغير التدخل العلاجي ومتغير النتيجة النهائية، حتى لو كانت بعض بياناته الديموغرافية الثانوية كالدخل السنوي أو مستوى التعليم غير مسجلة في الاستمارة البحثية.

6.2 استخدام قوائم المتغيرات المتقدمة (Variable Lists) في استدعاء الدوال

تتضمن بيئة برمجة SAS إمكانيات فائقة ومرنة للغاية في التعامل مع مجموعات المتغيرات من خلال ما يُعرف بقوائم المتغيرات المتقدمة (Advanced Variable Lists). تتيح هذه الميزة للمطورين استدعاء مجاميع محددة من الأعمدة دون الحاجة لكتابة أسمائها الفردية، مما يرفع من جودة الأكواد ويسرع عمليات الصيانة البرمجية، لاسيما في المسوح الميدانية التي تتضمن استبانات تحوي عشرات الأسئلة المتسلسلة والمترابطة.

من أبرز هذه الخيارات البرمجية استخدام قوائم النطاق الاسمي المرقمة (Numbered Range Lists)، مثل Q1-Q20، والتي تشير تلقائياً إلى كافة الأسئلة المتسلسلة من المتغير الأول وحتى العشرين دون الحاجة لسردهم في سطر الأوامر. بالإضافة إلى ذلك، توفر SAS ميزة قوائم النطاق الموضعي (Name-Position Lists) عبر استخدام الشرطة المزدوجة، كالصيغة Age--Income، والتي تُخبر المترجم بالتقاط كافة المتغيرات الواقعة فيزيائياً في بنية الجدول بين المتغير الأول والمتغير الأخير وفقاً لتسلسل تخزينها في قاموس البيانات (Data Descriptor).

تكتمل هذه المنظومة المرنة باستخدام لواحق التمييز النوعي المحجوزة، مثل _NUMERIC_ لاستهداف جميع الحقول ذات الطبيعة الرياضية، أو _CHARACTER_ لحصر الفحص في السلاسل النصية فقط. عند إقران هذه القوائم بالكلمة المفتاحية of داخل دالة التصفية، مثل: if cmiss(of Item1-Item50) then delete;، يكتسب الباحث قوة برمجية هائلة تمكنه من تنقية استبانات ضخمة بضغطة زر واحدة مع ضمان عدم حدوث أي اختلاط بين مقاييس الاستبانة والمتغيرات المعرفية المرافقة.

6.3 صياغة الشروط المعتمدة على عتبات كمية للفقدان

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

تُصاغ هذه العتبات البرمجية بمنتهى السهولة والوضوح بفضل الطبيعة الحسابية للدالة CMISS؛ حيث تُقارن مخرجات الدالة مباشرة مع العتبة المسموح بها. فإذا كان لدينا مقياس مكون من عشرة أسئلة، ويسمح الدليل الإحصائي بفقدان بندين كحد أقصى مع استبعاد من فقد ثلاثة بنود فأكثر، تتم صياغة جملة المعالجة كالآتي: if cmiss(of Scale_Q1-Scale_Q10) >= 3 then delete;. يؤدي هذا السطر إلى فرز ذكي يحتفظ بالمشاركين ذوي الاستجابات الشبه مكتملة لإخضاعهم لعمليات التعويض لاحقاً، بينما يستبعد الحالات المشوهة التي تتجاوز فيها الفجوات حدود الأمان الإحصائي.

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

7. حذف الصفوف ذات القيم المفقودة باستخدام لغة الاستعلامات البنيوية (PROC SQL)

7.1 بناء جملة التصفية باستخدام تعبيرات WHERE المنطقية

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

لاستبعاد السجلات غير المكتملة عبر هذا المحرك، يُستخدم المعامل القياسي IS NOT NULL، والذي يقوم بفحص الحقول للتأكد من احتوائها على قيم صالحة ومحددة. عند استدعاء هذا المعامل على مجموعة من الأعمدة المرتبطة بروابط العطف AND، يتم استبعاد أي صف يفتقر إلى بيانات في أي من تلك الأعمدة، وتوليد جدول استعلام جديد يقتصر حصرياً على البيانات النقية.

يوضح النموذج البرمجي التالي كيفية توظيف هذا الإجراء لبناء جدول جديد مفلتر ومستقل تماماً:


proc sql;
    create table sql_clean_data as
    select Patient_ID, Gender, Age, Systolic_BP, Diagnosis
    from clinical_trials_raw
    where Age is not null
      and Systolic_BP is not null
      and Diagnosis is not null
      and Gender is not null;
quit;

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

7.2 التعامل مع المتغيرات الرمزية والمسافات الفارغة في SQL

يواجه المحللون تحدياً دقيقاً عند التعامل مع المتغيرات النصية داخل محرك PROC SQL في SAS؛ نظراً للاختلاف الطفيف في التعريفات المنطقية بين معايير SQL العامة وقواعد البيانات الداخلية في SAS. في قواعد بيانات ANSI SQL المعيارية، توجد تفرقة فلسفية وتنفيذية حادة بين القيمة المعدومة غير المعرفة (NULL) والسلسلة النصية ذات الطول الصفري أو المساحة الفارغة (Empty String / Blank). ولكن في بيئة محرك SAS، تُمثل القيم النصية المفقودة دائماً بمساحات بيضاء فارغة، مما قد يخلق التباساً عند كتابة الاستعلامات.

لتفادي هذا الالتباس وضمان التقاط كافة الحالات النصية الفارغة داخل PROC SQL، يُستحسن تجنب الاعتماد الحصري على عبارة is not null للمتغيرات الرمزية، ودمجها مع شرط فحص السلاسل الفارغة صراحة، كأن يُكتب: where Gender is not null and Gender ne ''. هذا التدقيق الشرطي يضمن أن الحقول التي تحتوي على مسافات بيضاء غير مرئية سيتم التعرف عليها واستبعادها بيقين تام من قِبل محرك الاستعلام، وعدم السماح لها بالتسلل إلى مصفوفة التحليل النهائي.

علاوة على ذلك، أتاحت SAS ميزة استثنائية تتمثل في إمكانية استدعاء دوال خطوة البيانات الأصلية داخل استعلامات PROC SQL. يمكن للباحث توظيف الدالة الشاملة MISSING مباشرة داخل تعبيرات WHERE، بصيغة مثل: where not missing(Gender) and not missing(Age). تحقق هذه الممارسة دمجاً مثالياً بين معايير لغة SQL الصارمة والمرونة الفائقة لمحرك دوال SAS، مما يوحد قواعد الفحص عبر كافة الحقول الرقمية والنصية بأسلوب منطقي موحد يقلل من احتمالات الخطأ الإجرائي.

7.3 المقارنة التقنية بين كفاءة DATA Step وكفاءة PROC SQL

تخضع المفاضلة بين الاعتماد على خطوة البيانات (DATA Step) أو استخدام لغة الاستعلامات (PROC SQL) لحذف الصفوف لاعتبارات تقنية معقدة تتعلق بهندسة النظام وموقع تخزين البيانات وحجم الجداول المراد تصفيتها. لا تقتصر المسألة على مجرد تفضيل شخصي في طريقة كتابة الكود، بل ترتبط مباشرة باستهلاك وحدة المعالجة المركزية (CPU)، ومعدلات عمليات القراءة والكتابة من وإلى وسائط التخزين (I/O Bottlenecks).

تتفوق خطوة البيانات (DATA Step) تفوقاً ساحقاً في معالجة الجداول الضخمة المخزنة محلياً بتنسيق ملفات SAS الأصلية (sas7bdat)؛ ويعود ذلك إلى المعمارية الخطية المباشرة لمتجه بيانات البرنامج (PDV) الذي يقرأ السجلات ويسقط غير المستوفي للشروط بأقل قدر ممكن من التكلفة التشغيلية الإضافية (Overhead). كما تتميز خطوة البيانات بالدعم الكامل لكلمات النطاق الشامل مثل _ALL_ والقوائم المختصرة، وهو ما تفتقر إليه لغة SQL التي تفرض وجوب سرد أسماء الأعمدة في جمل الشرط واحداً تلو الآخر دون استثناء، مما يجعل كتابة الشفرة أكثر طولاً وتعقيداً.

في المقابل، يبرز التفوق التقني لإجراء PROC SQL عندما تكون البيانات مخزنة في قواعد بيانات علائقية خارجية، مثل Oracle أو Microsoft SQL Server أو Teradata، ومربوطة بنظام SAS عبر محركات الوصول السريع (SAS/ACCESS Engines). في هذا السيناريو، يمتلك محرك PROC SQL القدرة على تنفيذ ميزة النقل الحسابي المباشر (SQL Pass-Through Facility)، حيث يتم إرسال استعلام التصفية ليتم تنفيذه فيزيائياً داخل خادم قاعدة البيانات الخارجي قبل نقل النتائج عبر الشبكة إلى SAS. يؤدي هذا إلى تقليص هائل في حركة نقل البيانات عبر الشبكة، وتوفير موارد الذاكرة المحلية، مما يجعل SQL الخيار الحتمي والأكثر ذكاءً في مشاريع تكامل البيانات المركزية.

8. التعامل مع القيم المفقودة الخاصة (Special Missing Values) في SAS

8.1 مفهوم القيم المفقودة المشفرة بالحروف الأبجدية (.A إلى .Z والرمز ._)

تتميز بيئة SAS التحليلية بخاصية متفردة نادراً ما تتوافر في الحزم الإحصائية الأخرى، وتتمثل في دعمها لما يُعرف بالقيم المفقودة الخاصة (Special Missing Values). صُممت هذه الخاصية المتقدمة لخدمة الأغراض المنهجية المعقدة في المسوح الإحصائية والتجارب السريرية والأبحاث الديموغرافية؛ حيث لا يكتفي الباحث برصد غياب القيمة فحسب، بل يسعى إلى تشفير وتوثيق سبب الغياب لتفسيره تحليلياً. يتيح النظام تمثيل 27 قيمة مفقودة رقمية خاصة تتألف من النقطة متبوعة بحرف من الحروف الأبجدية اللاتينية (من .A إلى .Z)، بالإضافة إلى رمز الشرطة التحتية (._).

تسمح هذه الرموز بتصنيف دقيق لفئات الفقدان المتنوعة؛ حيث يمكن للباحث تخصيص الرمز .R للدلالة على رفض المريض الإجابة (Refused)، والرمز .N للإشارة إلى عدم انطباق السؤال عليه (Not Applicable)، والرمز .D للتعبير عن ضياع العينة أو العجز عن القياس (Don’t Know)، والرمز .E لتوثيق أخطاء الإدخال المادي (Data Entry Error)، في حين تظل النقطة القياسية المفردة (.) مخصصة للغياب المجهول غير المفسر.

من الناحية الرياضية والترتيبية في خوارزميات الفرز، يتعامل نظام SAS مع هذه القيم المفقودة الخاصة وفق تسلسل رقمي متناهي في الصغر، حيث تُعتبر جميعها قيماً سالبة تصغر أي عدد حقيقي، وتترتب فيما بينها على النحو التالي: الرمز ._ هو القيمة الصغرى المطلقة في النظام، تليه النقطة القياسية المفردة (.)، ثم تتبعها القيم الأبجدية بالترتيب التسلسلي من .A وحتى القيمة .Z التي تعتبر كبرى القيم المفقودة (ولكنها تظل أصغر من أدنى رقم حقيقي مثل الصفر أو الأرقام السالبة). يتطلب هذا التسلسل الرياضي وعياً عميقاً عند كتابة المقارنات التفضيلية لتفادي أخطاء التصنيف الشرطي.

8.2 سلوك دوال الحذف عند مواجهة المفقودات الخاصة

عند الشروع في تطبيق خوارزميات الحذف والتنظيف البرمجي، يجب إدراك السلوك التشغيلي التلقائي للدوال الفاحصة حيال هذه الرموز الأبجدية المتخصصة. الدالة الشاملة CMISS، وكذلك الدالة الرقمية NMISS والدالة الفردية MISSING، تم تصميمها جميعاً لتتعامل مع أي قيمة مفقودة خاصة (من .A إلى .Z و ._) باعتبارها قيمة مفقودة مطلقة. هذا يعني أن استدعاء الأمر if cmiss(of _all_) then delete; سيقوم برصد هذه الحالات المشفرة فوراً واستبعاد السجل الحاوي لها دون أي تفريق بينها وبين النقطة العادية.

ومع ذلك، تفرض المتطلبات المنهجية في كثير من الأحيان ضرورة التمييز المعمق بين هذه المفقودات؛ كأن يرغب الباحث في حذف السجلات التي غاب فيها المتغير لأسباب غير معلومة، مع استبقاء السجلات المشفرة برمز “عدم الانطباق” .N لتحليلها في نموذج مستقل لكونها لا تعكس جهلاً بالمعلومة وإنما عدم ملاءمة منطقية لبند الدراسة. في هذه السيناريوهات، تصبح الدوال العامة عاجزة عن الوفاء بالغرض، ويتعين على المبرمج تجاوزها وبناء شروط مقارنة رقمية تفصيلية تستند إلى التسلسل الرياضي للقيم.

تتم صياغة هذا الاستبعاد الانتقائي الذكي عبر شروط صريحة تحدد الرموز المستهدفة بالاسم، كأن يُكتب: if Systolic_BP = . or Systolic_BP = .E then delete;. يضمن هذا التحديد البرمجي الصارم التخلص الحصري من الأخطاء التوثيقية والمجهولة، مع الإبقاء على المرضى الذين تم تشفير مفقوداتهم برموز نظامية أخرى لمواصلة فحص خصائصهم وتجنب بتر شريحة سكانية قد تحمل سمات ديموغرافية خاصة ومؤثرة في نتائج التحقيق الميداني.

8.3 الآثار المنهجية لحذف المفقودات المشفرة نوعياً

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

في المسوح الاجتماعية والاقتصادية، على سبيل المثال، يرتبط امتناع المشارك عن الإفصاح عن دخله الشهري أو توجهه الانتخابي بمتغيرات نفسية واجتماعية كامنة؛ أي أن الفقدان هنا يقع قطعاً ضمن تصنيف الفقدان غير العشوائي (Missing Not at Random – MNAR). في مثل هذه الظروف، يمثل الحذف الكامل للملاحظة انتهاكاً صارخاً لشرط MCAR، مما يقود حتماً إلى تحيز فج في تقديرات الدخل ومعدلات الفقر، فضلاً عن رسم صورة مشوهة كلياً عن الواقع الميداني للمجتمع المدروس.

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

9. التدقيق الإحصائي وتوثيق جودة البيانات بعد عملية الحذف

9.1 إجراء مقارنات توزيعية قبل وبعد التنقية باستخدام PROC FREQ

يمثل التدقيق الإحصائي مرحلة الحصانة المنهجية الأساسية التي تلي تنفيذ تعليمات الحذف البرمجي؛ فلا يجوز بأي حال من الأحوال الشروع في النمذجة المتقدمة دون التحقق التام من عدم تشوه التركيبة التوزيعية للعينة. يُعد الإجراء الإحصائي PROC FREQ الأداة المثالية في SAS لفحص جداول التكرار والمقارنة المتقاطعة للمتغيرات الفئوية والتصنيفية (Categorical Variables) قبل التصفية وبعدها، للتأكد من أن استبعاد الحالات المفقودة لم يتسبب في اجتثاث فئات ديموغرافية نادرة أو تغيير النسب المئوية للخصائص الأساسية للعينة.

يتم تنفيذ هذا التدقيق المنهجي عبر استدعاء إجراء التكرارات على الجدولين؛ الجدول المصدر غير المصفى وجدول البيانات النقية الجديد، مع مقارنة النسب المئوية للترددات. فإذا لوحظ، على سبيل المثال، أن نسبة الذكور إلى الإناث كانت متوازنة (50% إلى 50%) في المجموعة الخام، ثم تحولت بعد إزالة الصفوف المفقودة إلى (80% إلى 20%)، فإن هذا التباين الحاد يُطلق صافرة إنذار منهجية تؤكد أن فقدان البيانات لم يكن عشوائياً، بل تركزت الفجوات لدى الإناث، مما يجعل عينة الحالات الكاملة عينة متحيزة جندرياً لا تصلح لبناء استنتاجات عامة.

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

9.2 تقييم التغيرات في المقاييس الإحصائية الوصفية عبر PROC MEANS

تتكامل المقارنة التوزيعية للمتغيرات الفئوية مع تدقيق متعمق للمتغيرات الكمية والمستمرة، وذلك عبر توظيف الإجراء الإحصائي الشهير PROC MEANS. يهدف هذا الإجراء إلى رصد التغيرات الدقيقة التي تطرأ على مصفوفة الإحصاءات الوصفية المركزية ومقاييس التشتت؛ بما في ذلك المتوسط الحسابي (Mean)، والخطأ المعياري، والانحراف المعياري (Standard Deviation)، فضلاً عن تقييم مستويات الالتواء (Skewness) والتفرطح (Kurtosis)، وحدود القيم الصغرى والعظمى (Minimum and Maximum).

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

يوضح البرنامج الإحصائي التالي التطبيق العملي لاستخراج مصفوفة المؤشرات الوصفية للتحقق من ثبات المعالم الإحصائية للعينة:


title1 "المؤشرات الوصفية للمتغيرات الحيوية قبل وبعد التصفية";
proc means data=clinical_trials_raw n mean std min max skewness;
    var Age Systolic_BP;
run;
proc means data=clinical_trials_clean n mean std min max skewness;
    var Age Systolic_BP;
run;
title1;

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

9.3 إعداد تقارير التصفية وفق المعايير الأكاديمية (مثل إرشادات STROBE وAPA)

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

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

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

10. الأخطاء الشائعة ومخاطر التنفيذ عند حذف الصفوف المفقودة برمجياً

10.1 الخلط بين المقارنة الرقمية والمقارنة النصية في الشروط

يقع العديد من المبرمجين، لا سيما في المراحل التعليمية الأولى أو عند الانتقال من لغات برمجية أخرى، في أخطاء نحوية ومنطقية قاتلة نتيجة الخلط بين أساليب المقارنة للمتغيرات الرقمية وتلك المخصصة للمتغيرات الرمزية. إن استخدام صيغة الفحص الرقمي if Variable = . then delete; مع متغير نصي يمثل خطأً فادحاً في بيئة SAS؛ فالنظام في هذه الحالة يحاول قسرياً تفسير السلسلة النصية كرقم، مما يؤدي إلى فشل التقييم الشرطي، وامتلاء سجل العمليات برسائل التحذير من النوع (Numeric to Character Conversion)، وربما يتم تجاوز الشرط بالكامل والإبقاء على البيانات النصية المفقودة دون حذف.

على الجانب المقابل، يمثل فحص المتغيرات النصية باستخدام المساواة المجردة مع المسافة الفارغة if Variable = ' ' تحدياً خفياً ومصدراً للأخطاء الصامتة. ففي كثير من الأحيان، تحتوي حقول السجلات المدخلة من أنظمة الويب أو ملفات Excel الخارجية على مسافات بيضاء غير مرئية ناتجة عن الضغط على مفتاح المسافة أو استخدام حروف تحكم غير مطبوعة (مثل التاب Tab). هذه المساحات غير المرئية تمنع الشرط من التحقق؛ لأن السلسلة لم تعد فارغة تماماً من منظور النظام، مما يؤدي إلى نجاة السجل المشوه من مقصلة الحذف وتسلله إلى البيانات النظيفة.

لتفادي هذه المزالق الخطيرة، يجب على المبرمج ترسيخ ممارسات التهيئة النصية المسبقة، والاعتماد الحصري على الدوال المدمجة المتخصصة في تطهير السلاسل مثل STRIP و TRIM، والتي تقوم بقص وإزالة كافة المسافات الزائدة في أطراف الكلمات قبل الشروع في فحصها، أو اللجوء كخيار استراتيجي آمن إلى الدالة الشاملة MISSING أو CMISS التي تمتلك ذكاءً برمجياً داخلياً يعفي المحلل من القلق حيال طبيعة المتغير الهيكلية والمسافات الزائدة المحيطة به.

10.2 الحذف العرضي للبيانات جراء التقييم الخاطئ للمصفوفات

يمتد الخطر البرمجي عند استخدام تقنيات الحذف الشامل للملاحظات ليشمل ما يُعرف بالحذف العرضي غير المقصود للبيانات (Accidental Data Purging)، والذي يقع غالباً نتيجة التقييم الخاطئ للنطاقات أو التداخل غير المحسوب مع المتغيرات المؤقتة ومتغيرات النظام. فعندما يستخدم المطور تعبيرات مثل _ALL_ داخل الدالة CMISS بعد أن يكون قد قام بإنشاء مصفوفات مؤقتة (Temporary Arrays) أو متغيرات أعلام وسيطة (Flags) لم يتم تعيين قيم ابتدائية لها بعد، يقع المحظور؛ حيث يكتشف النظام أن هذه المتغيرات المساعدة فارغة، فيقوم بطرد الملاحظة السليمة كلياً من جدول الإخراج.

تتكرر هذه الكارثة البرمجية أيضاً عند استدعاء متغيرات النظام التلقائية، مثل متغير ترقيم الملاحظات _N_ أو متغيرات الأخطاء _ERROR_، أو عند استخدام خيارات الدمج المتقدمة التي تولد مؤشرات فرز مؤقتة مثل خيار IN=. إذا لم يُحدد نطاق الدالة بدقة متناهية ليقتصر فقط على المتغيرات المستهدفة بالدراسة، فإن أي خلل طفيف في قيم هذه المتغيرات الوسيطة سيفعّل جملة DELETE بصورة عشوائية، مما يترتب عليه استبعاد مجاميع واسعة من السجلات الكاملة وتآكل حجم العينة دون أن يدرك المحلل السبب الحقيقي وراء هذا الانهيار الحسابي.

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

10.3 تجاهل فحص سجل الأحداث والتعامل السطحي مع المخرجات

يعد تجاهل القراءة النقدية التحليلية لسجل العمليات (SAS Log) والاعتماد التبسيطي السطحي على المعاينة البصرية للمخرجات النهائية من أخطر الممارسات المهنية وأكثرها شيوعاً بين المحللين المبتدئين. يعتقد البعض خطأً أن عدم توقف البرنامج وظهور نافذة المخرجات (Results Window) يعني بالضرورة صحة وسلامة التنفيذ البرمجي، متناسين أن العديد من الأخطاء المنطقية القاتلة في SAS لا تصدر رسائل توقف (Errors)، بل تُسجل بهدوء في هيئة تحذيرات (WARNINGS) أو ملاحظات إجرائية (NOTES).

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

تفرض المعايير الاحترافية تطبيق بروتوكول التشغيل النظيف (Clean Run Execution)؛ والذي يتطلب مسح محتويات سجل الأحداث تماماً قبل التنفيذ، ثم تفحص نصوصه سطراً بسطر عقب التشغيل مباشرة، والبحث الممنهج عن الكلمات المفتاحية الحرجة مثل: uninitialized أو converted أو Invalid argument. كما يتعين توثيق الفارق الحسابي بين السجلات الداخلة والخارجة في مذكرة التحليل، وإقران ذلك بإجراءات فحص إحصائي وصفي تؤكد أن ما كُتب في مصفوفة النتائج يمثل الحقيقة الرياضية المنشودة لا نتاج أوهام الأكواد المعطوبة.

11. الحذف الكامل للصفوف مقابل الاستراتيجيات البديلة لمعالجة المفقودات

11.1 حدود ومحاذير أسلوب الحذف الكامل (Listwise Deletion)

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

تتفاقم هذه المشكلة بصورة حادة عند التعامل مع الدراسات الطولية (Longitudinal Studies) أو المسوح الميدانية الممتدة؛ فمع ازدياد عدد المتغيرات الخاضعة للنمذجة، يزداد الاحتمال التراكمي لاحتواء السجل على فجوة مفقودة في موقع ما، مما قد يقود إلى تآكل حجم العينة الإجمالي بنسب مرعبة قد تتجاوز 50% أو 70% من المشاركين الأصليين. هذا الانكماش الحاد لا يقتصر أثره على شل القوة الإحصائية للاختبارات ورفع هوامش الخطأ المعياري فحسب، بل ينسف الاستثمار المالي والبشري الهائل الذي بُذل في مرحلة جمع تلك المعطيات الميدانية المهدرة.

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

11.2 نظرة عامة على التعويض المتعدد (Multiple Imputation) عبر PROC MI

تجاوزت الحوسبة الإحصائية المتقدمة حدود الحذف الفيزيائي للبيانات عبر تطوير استراتيجيات رياضية تعويضية رصينة، ويأتي في طليعتها منهج التعويض المتعدد (Multiple Imputation – MI). تمثل هذه الاستراتيجية المعيار الذهبي الموصى به عالمياً للتعامل مع البيانات التي تعاني من الفقدان وفق آلية MAR؛ حيث تقوم فلسفتها على عدم التخلص من السجلات الناقصة، بل تقدير وتوليد قيم احتمالية بديلة تحل محل الفجوات المفقودة استناداً إلى مصفوفات العلاقات المتبادلة والانحدار التنبؤي المستمد من كافة المتغيرات المكتملة في العينة.

يوفر نظام SAS بنية تحتية مذهلة لتطبيق هذا النهج عبر الإجراء الإحصائي المتخصص PROC MI. تعمل هذه الأداة المتقدمة عبر ثلاث مراحل منهجية متكاملة؛ تبدأ بمرحلة التعويض (Imputation Phase)، حيث يتم توليد عدد من النسخ المستقلة لمجموعة البيانات (تتراوح عادة بين 5 إلى 20 نسخة كاملة أو أكثر)، تتطابق جميعها في القيم الأصلية السليمة، ولكنها تختلف طفيفاً في القيم المعوضة لتعكس حالة عدم اليقين الرياضي (Uncertainty) المحيطة بتقدير تلك الفجوات المجهولة.

تنتقل المعالجة بعد ذلك إلى مرحلة التحليل الفردي (Analysis Phase)، حيث يُنفذ النموذج الإحصائي المستهدف (كنموذج الانحدار عبر PROC REG) على كل مجموعة من الجداول المعوضة على حدة، ليتم في الختام استدعاء الإجراء النهائي المجمع PROC MIANALYZE. يقوم هذا الإجراء الرائد بدمج التقديرات ومعاملات الانحدار والأخطاء المعيارية المحسوبة عبر كافة النسخ في تقدير نهائي موحد وفق قواعد روبين التوافقية (Rubin’s Rules)، مما يتيح للباحث استغلال كامل حجم العينة الأصلي دون إسقاط أي سجل، والوصول إلى قوة إحصائية قصوى ومقدرات غير متحيزة محصنة رياضياً ضد تشوهات الحذف الآلي.

11.3 استراتيجيات التعويض الفردي والنمذجة المباشرة كبدائل منهجية

تتعدد الاستراتيجيات البديلة لحذف الصفوف لتشمل حزمة من الحلول الأخرى التي تختلف في مدى تعقيدها وموثوقيتها الرياضية. يأتي أسلوب التعويض الفردي (Single Imputation)، كاستبدال القيمة المفقودة بالمتوسط الحسابي (Mean Substitution) أو الوسيط، كأحد الحلول التاريخية السريعة والبدائية. ورغم أن هذا الخيار يحافظ على حجم العينة ظاهرياً ويسهل تطبيقه عبر خطوة بيانات يسيرة، إلا أن الإحصائيين يحذرون بشدة من استخدامه في الدراسات النمذجية؛ نظراً لأنه يؤدي إلى تقليص اصطناعي مشوه في تباين المتغير (Variance Deflation)، وتضخيم وهمي لمعاملات الارتباط وقيم الدلالة الإحصائية، مما يجعله خياراً مرفوضاً في الأبحاث الرصينة.

على النقيض من التعويض الفردي التبسيطي، تبرز استراتيجية النمذجة المباشرة المعتمدة على تقدير الأرجحية العظمى للبيانات الكاملة (Full Information Maximum Likelihood – FIML) كبديل متطور وفائق القوة يغني الباحث تماماً عن خطوة حذف السجلات أو تعويضها مسبقاً. في هذا النهج، تتولى الخوارزميات التحليلية في إجراءات مثل PROC CALIS احتساب دالة الأرجحية الرياضية لكل ملاحظة استناداً إلى المتغيرات المتاحة فيها فعلياً دون الحاجة إلى إسقاط الصف، مما يسمح بتقدير معالم النموذج الكلية بأعلى دقة ممكنة وتحت افتراضات MAR المرنة.

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

12. أفضل الممارسات البرمجية وتحسين كفاءة التنفيذ في البيئات المتقدمة

12.1 استخدام عبارة WHERE لتصفية البيانات في مرحلة القراءة الأولية

تمثل الكفاءة الزمنية وإدارة استهلاك الموارد التحدي الحقيقي للمطورين عند العمل مع قواعد البيانات المؤسسية العملاقة متزايدة التعقيد. في هذا السياق، يبرز فارق جوهري في بنية هندسة البرمجيات بين استخدام جملة الشرط التقليدية IF وأمر التصفية المسبقة WHERE لحذف الصفوف ذات القيم المفقودة. إن هذا الاختلاف، رغم بساطته المظهرية في كتابة الكود، ينعكس بشكل جذري على آلية عمل محرك SAS وطريقة إدارته للذاكرة المؤقتة ووحدة المعالجة المركزية.

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

يوضح المثال البرمجي التالي كيفية توظيف عبارة WHERE كخيار تصفية مسبق عالي الكفاءة يضمن سرعة التنفيذ القصوى:


data clinical_trials_optimized;
    set clinical_trials_raw (where=(
        Age is not missing and
        Systolic_BP is not missing and
        Diagnosis ne '' and
        Gender ne ''
    ));
run;

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

12.2 كتابة نصوص ماكرو (SAS Macros) معيارية لإعادة الاستخدام

تتطلب البيئات الإنتاجية والمشاريع البحثية المعقدة متعددة المراحل الترفع عن كتابة الأكواد الصلبة المحدودة (Hard-coded Scripts)، والتوجه نحو بناء أدوات برمجية ديناميكية ومعيارية يمكن إعادة استخدامها وتعميمها عبر تدفقات العمل المختلفة. توفر لغة ماكرو نظام التحليل الإحصائي (SAS Macro Facility) الإطار البرمجي المثالي لتحقيق هذه الأتمتة المتقدمة؛ حيث تتيح صياغة برامج ماكرو قادرة على استقبال أسماء الجداول وقوائم المتغيرات كمدخلات متغيرة وتطبيق قواعد التصفية وحساب الفواقد تلقائياً.

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

تجسد الشفرة البرمجية المتقدمة التالية تصميماً لماكرو معياري احترافي لتطهير البيانات وتوثيق مخرجات الاستبعاد بصورة آلية متكاملة:


%macro Remove_Missing_Rows(input_data=, output_data=, var_list=);
    %local initial_count final_count deleted_count;

    /* حساب عدد السجلات الأولي */
    data _null_;
        set &input_data. nobs=total_obs;
        call symputx('initial_count', total_obs);
        stop;
    run;

    /* تنفيذ الحذف المعتمد على المتغيرات المحددة */
    data &output_data.;
        set &input_data.;
        if cmiss(of &var_list.) then delete;
    run;

    /* حساب عدد السجلات النهائي والمحذوف */
    data _null_;
        set &output_data. nobs=valid_obs;
        call symputx('final_count', valid_obs);
        stop;
    run;

    %let deleted_count = %eval(&initial_count. - &final_count.);

    /* طباعة تقرير التوثيق الإحصائي في السجل */
    %put ===================================================;
    %put [تقرير تطهير البيانات المعياري];
    %put الجدول المدخل: &input_data. | عدد الملاحظات الأولي: &initial_count.;
    %put الجدول المصفى: &output_data. | عدد الملاحظات المستبقاة: &final_count.;
    %put إجمالي الصفوف المحذوفة لاحتوائها على مفقودات: &deleted_count.;
    %put ===================================================;
%mend Remove_Missing_Rows;

/* استدعاء تجريبي للماكرو المطور */
%Remove_Missing_Rows(
    input_data=clinical_trials_raw,
    output_data=clinical_trials_macro_clean,
    var_list=_all_
);

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

12.3 إدارة الأداء وتقليل عمليات الإدخال والإخراج (I/O Optimization)

تعتبر عمليات الإدخال والإخراج من وسائط التخزين (Disk I/O) عنق الزجاجة الرئيسي الذي يلتهم الوقت وموارد الخوادم في بيئات معالجة البيانات الضخمة في SAS. لتحقيق أقصى درجات الكفاءة التشغيلية عند تنفيذ عمليات التصفية وحذف الصفوف، يجب على مهندس البيانات تطبيق حزمة متكاملة من التقنيات المحسنة التي تهدف إلى تقليص الاحتكاك مع وسائط التخزين وتفادي تراكم الملفات المؤقتة غير الضرورية في مكتبة العمل الافتراضية.

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

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

خاتمة

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

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

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

المراجع

  • Allison, P. D. (2001). Missing Data. SAGE Publications, Inc. https://doi.org/10.4135/9781412985079
  • Cody, R. (2018). Cody’s Data Cleaning Techniques Using SAS, Third Edition. SAS Institute Inc.
  • Delwiche, L. D., & Slaughter, S. J. (2019). The Little SAS Book: A Primer, Sixth Edition. SAS Institute Inc.
  • Enders, C. K. (2022). Applied Missing Data Analysis, Second Edition. The Guilford Press.
  • Little, R. J. A., & Rubin, D. B. (2019). Statistical Analysis with Missing Data, Third Edition. John Wiley & Sons, Inc. https://doi.org/10.1002/9781119482865
  • Rubin, D. B. (1976). Inference and missing data. Biometrika, 63(3), 581–592. https://doi.org/10.1093/biomet/63.3.581
  • SAS Institute Inc. (2023). SAS(R) 9.4 Functions and CALL Routines: Reference, Fifth Edition. SAS Institute Inc. https://documentation.sas.com
  • SAS Institute Inc. (2023). SAS(R) 9.4 SQL Procedure User’s Guide, Fourth Edition. SAS Institute Inc.
  • Schafer, J. L. (1997). Analysis of Incomplete Multivariate Data. Chapman and Hall/CRC. https://doi.org/10.1201/9781439821862
  • Vandenbroucke, J. P., von Elm, E., Altman, D. G., Gøtzsche, P. C., Mulrow, C. D., Pocock, S. J., Poole, C., Schlesselman, J. J., & Egger, M. (2007). Strengthening the Reporting of Observational Studies in Epidemiology (STROBE): Explanation and elaboration. PLOS Medicine, 4(10), e297. https://doi.org/10.1371/journal.pmed.0040297

تقييم هذا المحتوى

0.0 / 5 0 تقييمات

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

looti, M. (2026, سبتمبر 11). كيفية إزالة الصفوف ذات القيم المفقودة في SAS. عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-remove-rows-with-missing-values-in-sas/
looti, Mohammed. “كيفية إزالة الصفوف ذات القيم المفقودة في SAS.” عرب سايكلوجي, 11 سبتمبر 2026, https://arabpsychology.com/statistics/how-to-remove-rows-with-missing-values-in-sas/.
looti, Mohammed. “كيفية إزالة الصفوف ذات القيم المفقودة في SAS.” عرب سايكلوجي. سبتمبر 11, 2026. https://arabpsychology.com/statistics/how-to-remove-rows-with-missing-values-in-sas/.