تُعد مشكلة القيم المفقودة (Missing Values) واحدة من أبرز التحديات المنهجية والعملية التي تواجه الباحثين ومحللي البيانات وعلماء الإحصاء في مختلف الحقول العلمية والتطبيقية. فعند التعامل مع قواعد البيانات الواقعية، سواء كانت مستمدة من تجارب سريرية، أو مسوح استقصائية ديموغرافية، أو معاملات مالية ومصرفية، نادراً ما تكون مصفوفات البيانات مكتملة الأركان بصورة مثالية. إن عدم معالجة هذه الفجوات البيانية بدقة أو إغفال فحصها الاستكشافي الأولي يقود بالضرورة إلى انحيازات إحصائية جسيمة، وخلل في تقدير معالم النماذج القياسية، وفقدان ملحوظ للقوة الإحصائية (Statistical Power) في اختبارات الفروض المختلفة.
في بيئة نظام التحليل الإحصائي SAS (Statistical Analysis System)، تم تصميم البنية التحتية لمعالجة البيانات وتخزينها بطريقة تمنح المتغيرات المفقودة تمثيلاً فريداً ومنهجياً يميز بدقة بين المتغيرات العددية والمتغيرات النصية. ويوفر النظام ترسانة متكاملة من الإجراءات الإحصائية (Procedures) والدوال البرمجية المدمجة ولغات الاستعلام المتقدمة التي تتيح للمحلل رصد هذه القيم، وحساب تكراراتها، واستكشاف أنماط توزعها عبر السجلات والملاحظات. إن الفهم الدقيق لآليات حساب وتوصيف البيانات المفقودة يمثل اللبنة الأساسية لأي بروتوكول تدقيق لسلامة البيانات (Data Quality & Integrity Framework).
يهدف هذا الدليل المرجعي الشامل إلى استعراض كافة المنهجيات البرمجية والإحصائية المتاحة داخل نظام SAS لحساب وفهرسة القيم المفقودة وتلخيصها. سنبدأ بتأصيل المفاهيم النظرية للفقدان والتمييز بين الأنواع البيانية، مروراً بالتطبيقات العملية خطوة بخطوة باستخدام الإجراءات الكلاسيكية مثل PROC MEANS وPROC FREQ، والاستعلامات المتقدمة عبر PROC SQL، وصولاً إلى بناء حلول مخصصة باستخدام خطوات DATA Step والمصفوفات وتطوير وحدات الماكرو (Macros) للأتمتة الشاملة، مع التركيز على التحليل المتقدم لأنماط الفقدان وفق النظريات الإحصائية المعتمدة.
- 1. مقدمة عامة حول مفهوم القيم المفقودة وأهميتها في التحليل الإحصائي عبر SAS
- 2. التمييز بين القيم المفقودة الرقمية والنصية في بيئة SAS
- 3. بناء مجموعة بيانات نموذجية للتطبيق العملي (Constructing the Sample Dataset)
- 4. حساب القيم المفقودة للمتغيرات الرقمية باستخدام PROC MEANS
- 5. حساب القيم المفقودة للمتغيرات النصية باستخدام PROC SQL ودالة NMISS
- 6. استخدام دالة CMISS للتعامل الموحد مع كافة أنواع المتغيرات
- 7. حساب القيم المفقودة باستخدام إجراء الجداول التكرارية PROC FREQ
- 8. حساب القيم المفقودة عبر خطوات DATA Step والدوال الشرطية
- 9. أتمتة حساب وتلخيص القيم المفقودة باستخدام ماكرو SAS (SAS Macros)
- 10. التحليل المتقدم لأنماط الفقدان باستخدام إجراءات PROC MI و PROC TABULATE
- 11. مقارنة منهجية شاملة بين مختلف طرق حساب القيم المفقودة في SAS
- 12. الخاتمة والتوصيات العملية لإدارة البيانات المفقودة في SAS
- References
1. مقدمة عامة حول مفهوم القيم المفقودة وأهميتها في التحليل الإحصائي عبر SAS
1.1 تعريف البيانات المفقودة وتأثيرها على النمذجة الإحصائية
تُعرّف البيانات المفقودة في الأدبيات الإحصائية بأنها غياب قيمة متوقعة لمتغير معين في وحدة الملاحظة المدروسة، سواء كان الفرد مشاركاً في دراسة مسحية امتنع عن الإجابة، أو جهاز قياس في مختبر تعطل عن تسجيل قراءة حرارية، أو مريضاً انسحب مبكراً من تجربة دوائية. إن هذا الغياب ليس مجرد خانة فارغة في جدول رقمي، بل هو ظاهرة تؤثر تأثيراً مباشراً على البنية الرياضية للمقاييس الإحصائية الأساسية؛ إذ يتسبب الفقدان في تشتيت مصفوفات التباين والتباين المشترك (Variance-Covariance Matrices)، وتغيير قيم المتوسطات الحسابية والانحرافات المعيارية، مما يترتب عليه زعزعة استقرار التقديرات النقطية وفترات الثقة.
تتفاقم هذه الإشكالية عند الانتقال من الإحصاء الوصفي إلى النمذجة الاستدلالية المتقدمة مثل نماذج الانحدار الخطي واللوجستي، والنماذج الخطية العامة المختلطة. فالعديد من خوارزميات التقدير التقليدية تعتمد بصورة افتراضية على “الحذف الكامل للحالات” (Listwise Deletion)، وهو ما يعني استبعاد الملاحظة بالكامل بمجرد افتقارها لقيمة متغير واحد حتى لو كانت بقية المتغيرات مكتملة. يؤدي هذا الإسقاط العشوائي إلى تقليص حجم العينة الفعال (Effective Sample Size) بشكل حاد، وإدخال انحياز منهجي (Selection Bias) إذا كان نمط الفقدان غير عشوائي، مما يجعل النتائج المستخلصة غير قابلة للتعميم على المجتمع الأصلي المستهدف بالدراسة.
من هنا تبرز الأهمية القصوى لمرحلة الفحص الاستكشافي الأولي للبيانات (Exploratory Data Analysis). إن قيام الباحث بحساب نسب وتوزيعات القيم الشاغرة بدقة قبل الشروع في بناء النماذج الإحصائية يمثل ضمانة علمية وأخلاقية؛ حيث يمكنه هذا الفحص من تشخيص طبيعة الخلل في جمع البيانات، وتحديد ما إذا كان الفقدان يتركز في شرائح سكانية أو متغيرات معينة، واختيار الاستراتيجية الرياضية الملائمة للتعامل مع الموقف سواء بالاقتصار على الحالات المكتملة أو اللجوء إلى خوارزميات التعويض الإحصائي المتقدمة (Imputation Techniques).
1.2 طبيعة تمثيل القيم المفقودة داخل نظام SAS
ينفرد نظام SAS بآلية معمارية داخلية متقدمة لتمثيل وإدارة القيم المفقودة على مستوى القرص والذاكرة وخلال مراحل المعالجة البرمجية داخل ما يعرف بـ “متجه بيانات البرنامج” (Program Data Vector – PDV). في المتغيرات الرقمية (Numeric Variables)، يتم تمثيل القيمة المفقودة القياسية بنقطة مفردة (.)، والتي تعامل داخلياً كقيمة رقمية محجوزة تخزن وفق معيار الفاصلة العائمة (Floating Point System). وبالإضافة إلى هذه النقطة القياسية، يتيح SAS ما يعرف بـ “القيم المفقودة الخاصة” (Special Missing Values) والممثلة بنقطة متبوعة بحرف أبجدي من .A إلى .Z أو رمز الشرطة السفلية ._، مما يمنح المحلل القدرة على تصنيف أسباب الغياب بدقة.
أما بالنسبة للمتغيرات النصية أو الحرفية (Character Variables)، فيتعامل SAS مع الفقدان بصورة مختلفة جذرياً؛ إذ تُعرّف القيمة النصية المفقودة بأنها سلسلة فارغة تتكون بالكامل من مساحات بيضاء أو فراغات (Blanks). لا توجد رموز خاصة للمتغيرات النصية كالتي نراها في المتغيرات الرقمية، بل يتم تخصيص مساحة الحقل المحددة في جملة LENGTH وتعبئتها بفراغات غير مرئية. هذا التباين في البنية التخزينية يفرض متطلبات برمجية محددة عند كتابة الشروط المنطقية واختبارات الجودة للتحقق من امتلاء الحقول أو فراغها.
يترتب على هذا التمييز الهندسي فروق جوهرية في المعالجة المنطقية والفيزيائية. فالقيم الرقمية المفقودة تُصنف منطقياً في الترتيب والمقارنات الحسابية كأصغر من أصغر رقم حقيقي سالب (وهي قاعدة منطقية بالغة الأهمية سنتناول أبعادها بالتفصيل لاحقاً)، في حين تُعامل السلاسل النصية الفارغة وفق قواعد المقارنة المعجمية الصارمة المبنية على جدول ترميز الأحرف المعتمد (مثل ASCII أو EBCDIC أو UTF-8). إن إدراك هذه الطبيعة التخزينية يحمي المبرمج من الوقوع في فخ التحويلات الضمنية الخاطئة للأنواع البرمجية (Implicit Type Conversions).
1.3 نظرة عامة على الإجراءات الأساسية المتاحة لحساب المفقودات في SAS
يوفر نظام SAS مجموعة واسعة من الإجراءات التحليلية المخصصة لاكتشاف وتعداد البيانات الناقصة، مما يتيح للمحلل انتقاء الأداة الأنسب بحسب حجم البيانات ونوعية المتغيرات والهدف النهائي من التقرير الإحصائي. يُعد إجراء PROC MEANS الأداة الكلاسيكية الأكثر انتشاراً للحساب السريع للقيم المفقودة في المتغيرات الرقمية، وذلك عبر استخدام الإحصائية المدمجة NMISS التي تعزل بدقة عدد السجلات التي تحتوي على نقطة الفقدان مقابل عدد القيم الصالحة الممثلة بالإحصائية N.
ولتحقيق مرونة استعلامية فائقة تتجاوز الحدود التقليدية، توفر لغة الاستعلام المهيكلة PROC SQL بيئة قوية تتيح استدعاء دوال الحساب المتخصصة مثل NMISS() وCMISS() مباشرة داخل عبارات SELECT، مع إمكانية فرز وتجميع وتصفية النتائج بناءً على شروط منطقية معقدة. يتميز هذا الإجراء بقدرته على معالجة البيانات النصية والرقمية في استعلام واحد متكامل، وإعادة هيكلة مخرجات التقرير بصيغ جدولية جاهزة للدمج في قواعد البيانات العلائقية أو مسارات نقل البيانات المؤتمتة (Data Pipelines).
عند الرغبة في إجراء تحليلات أكثر عمقاً لا تقتصر على مجرد التعداد البسيط، تبرز إجراءات متخصصة مثل PROC FREQ الذي يوفر خيارات متقدمة مثل MISSING وMISSPRINT لعرض التوزيع التكراري والنسبي للفئات الفارغة ضمن الجداول التكرارية البسيطة والمتقاطعة. وفي المستويات التحليلية المتقدمة للأبحاث والبيانات الحيوية، يوفر إجراء PROC MI (Multiple Imputation) إمكانات استثنائية لرسم خرائط الأنماط المتعددة للفقدان (Missing Data Patterns)، مما يوضح ما إذا كانت البيانات تفتقد لنمط أحادي منتظم (Monotone) أو نمط عشوائي معقد (Arbitrary)، وهو ما يمثل نقطة الانطلاق الأساسية للمعالجة الإحصائية المنهجية.
2. التمييز بين القيم المفقودة الرقمية والنصية في بيئة SAS
2.1 خصائص وسلوك المتغيرات الرقمية المفقودة (Numeric Missing)
تخضع المتغيرات الرقمية المفقودة في SAS لقواعد منطقية ورياضية دقيقة يجب على كل محلل استيعابها لتجنب الوقوع في أخطاء برمجية كارثية. القاعدة الأساسية الأولى في منطق SAS هي أن القيمة المفقودة الرقمية القياسية (.) تُعتبر أصغر من أي قيمة عددية سالبة أو موجبة في الترتيب المنطقي المقارن. فإذا كُتب شرط برمجي مثل IF age < 18 THEN category = 'Minor';، وكانت قيمة المتغير age مفقودة (.) لأحد السجلات، فإن SAS سيُقيّم هذا الشرط على أنه صحيح (True)، وسيُصنف ذلك السجل خطأً على أنه قاصر، لأن النقطة المفقودة أصغر رياضياً من الرقم 18 في البنية المنطقية للنظام.
أما الميزة الفريدة للمتغيرات الرقمية فتكمن في وجود القيم المفقودة الخاصة (Special Missing Values) المكونة من سبعة وعشرين رمزاً إضافياً (._، ومن .A إلى .Z). تُستخدم هذه الرموز لتسجيل الأسباب الكامنة وراء عدم توفر البيانات، مما يتيح التمييز بين مريض رفض الإجابة على سؤال معين (يُرمز له مثلاً بـ .R للدلالة على Refused)، أو سؤال لا ينطبق عليه أساساً (يُرمز له بـ .N للدلالة على Not Applicable)، أو عينة مفقودة بسبب خطأ مخبري (يُرمز لها بـ .L للدلالة على Lab Error). يخضع ترتيب هذه الرموز لقاعدة تسلسلية دقيقة حيث: ._ < . < .A < .B < … < .Z < الأرقام السالبة < الصفر < الأرقام الموجبة.
فيما يخص العمليات الحسابية والدوال الإحصائية المدمجة، فإن إدخال قيمة رقمية مفقودة في العمليات الرياضية المباشرة (مثل الجمع + أو الضرب *) يؤدي إلى إنتاج قيمة مفقودة فوراً وتوليد تنبيه (Note) في سجل النظام (SAS Log) يفيد بوجود عمليات حسابية على قيم مفقودة. على النقيض من ذلك، فإن الدوال الإحصائية التجميعية مثل SUM() وMEAN() تتجاهل القيم المفقودة تلقائياً وتحسب المتوسط أو المجموع للقيم المتوفرة فقط، مما يعكس تصميماً ذكياً يمنع توقف المعالجة الإحصائية لكنه يتطلب يقظة تامة من المبرمج لضمان عدم حدوث تشويه في الحسابات التراكمية.
2.2 خصائص وسلوك المتغيرات النصية المفقودة (Character Missing)
تختلف المتغيرات النصية المفقودة (Character Missing Values) في بنيتها التحتية عن نظيرتها الرقمية؛ فالنظام لا يخصص رمزاً خاصاً كالنقطة للدلالة على غياب النص، بل يُعرّف الحقل النصي المفقود بأنه سلسلة مكونة من فراغ واحد أو مسافات بيضاء متعددة مساوية لطول المتغير المحدد في الذاكرة. إذا تم تعريف متغير نصي بطول 10 أحرف ولم يُدخل فيه أي نص، فإن SAS يخزن عملياً عشرة فراغات متتالية (ASCII code 32). منطقياً، يعتبر SAS أن أي سلسلة نصية تتكون فقط من فراغات، مهما بلغ عددها، مساوية للقيمة النصية الفارغة ذات الطول صفر أو الفراغ المفرد ('' أو ' ').
تنشأ التعقيدات البرمجية عند التعامل مع البيانات النصية المستوردة من مصادر خارجية مثل الملفات النصية المفصولة بفواصل (CSV) أو قواعد بيانات SQL أو الأنظمة الطرفية. ففي كثير من الأحيان، قد يحتوي الحقل النصي على محارف بيضاء غير مرئية أخرى مثل محرف الجدولة (Tab) أو محارف الأسطر الجديدة (Line Breaks) أو مسافات غير قابلة للكسر (Non-breaking spaces). هذه المحارف لا تُعامل افتراضياً كقيم مفقودة لأن لها رموزاً ثنائية مختلفة عن الفراغ القياسي، مما يؤدي إلى فشل الاختبارات البسيطة مثل IF text_var = '' في رصدها كقيم فارغة ما لم يتم تنظيفها أولاً.
للتغلب على هذه المعضلات، يوفر SAS ترسانة من الدوال المتخصصة لفحص وتنظيف النصوص؛ حيث تُستخدم دوال مثل STRIP() وTRIM() وCOMPBL() لإزالة المسافات الزائدة من البدايات والنهايات قبل إجراء عمليات التدقيق. كما توفر دالة MISSING()، وكذلك الدوال المتطابقة مع معايير يونيكود، وسيلة موثوقة للتحقق مما إذا كان الحقل النصي خالياً تماماً من المحارف الصالحة، مما يضمن تصنيف السجلات بدقة متناهية وإجراء المقارنات المعجمية دون تشويه ناتج عن المسافات الخفية.
2.3 أهمية تحديد نوع المتغير قبل اختيار تقنية الحساب البرمجية
يمثل تحديد النوع البياني (Data Type) للمتغيرات الخطوة الاستراتيجية الأولى والحاسمة قبل الشروع في اختيار الدالة أو الإجراء البرمجي لحساب القيم المفقودة. يؤدي تطبيق دالة مخصصة للأرقام على متغير نصي—أو العكس—إلى حدوث ما يُعرف بـ “التحويل الضمني للأنواع” (Implicit Type Conversion). في هذه الحالة، يحاول محرك SAS تلقائياً تحويل النص إلى رقم أو الرقم إلى نص لإتمام العملية، مما يستهلك دورات معالجة إضافية في المعالج المركزي، ويتسبب في ملء سجل النظام برسائل تحذيرية قد تخفي أخطاء منطقية أكبر، وقد ينتج عنه تحويل نصوص معينة إلى قيم مفقودة جديدة عن طريق الخطأ إذا تعذر تحويلها رقمياً.
علاوة على ذلك، يلعب تحديد النوع البياني دوراً محورياً في تحسين كفاءة استخدام الذاكرة وزمن التنفيذ، لا سيما عند معالجة قواعد البيانات الضخمة (Big Data) التي تحتوي على ملايين السجلات وعشرات الآلاف من المتغيرات. إن استخدام إجراءات متخصصة وموجهة لنوع البيانات، مثل استخدام PROC MEANS للمتغيرات الرقمية الخالصة أو استخدام استعلامات PROC SQL المدمجة مع دوال التحقق العامة، يقلل بشكل ملموس من عمليات المسح التكراري لجداول البيانات ويحد من استهلاك الذاكرة المؤقتة أثناء الفرز والمعالجة.
من الناحية المنهجية، يضمن التمييز الدقيق بين المتغيرات استخراج تقارير وصفية وإحصائية دقيقة ومتسقة. فعند حساب مفقودات متغير فئوي (Categorical Variable) تم تخزينه كنص، تختلف أساليب العرض والتفسير الإحصائي جذرياً عن التعامل مع متغير كمي مستمر (Continuous Numeric Variable) تم تخزينه كرقم. إن الدمج الخاطئ أو عدم التمييز بينهما يقود الباحث إلى تشويه المقاييس الموجزة، كأن يحاول النظام استخراج متوسط حسابي لمتغير نصي مفقود، مما يضر بالمصداقية العلمية للتحليل الإحصائي برمته.
3. بناء مجموعة بيانات نموذجية للتطبيق العملي (Constructing the Sample Dataset)
3.1 صياغة كود إنشاء مجموعة البيانات (DATA Step Syntax)
لتطبيق المفاهيم البرمجية عملياً واستعراض الأوامر المختلفة لحساب القيم المفقودة في SAS، سنقوم ببناء مجموعة بيانات نموذجية محكمة تحاكي سيناريو واقعياً مستمداً من إحصاءات الأداء الرياضي لفرق كرة السلة. تتيح لنا خطوة البيانات DATA Step تعريف هيكل الجدول، وتحديد أسماء الأعمدة، ونوعية كل حقل بياني، ثم إدخال الملاحظات الخام المباشرة لتمثيل مختلف حالات الاكتمال والفقدان.
يتم إنشاء الجدول البرمجي باستخدام الأمر DATA my_data; الذي يعلن عن بدء تشييد كائن بيانات في مكتبة العمل المؤقتة WORK. يليه استخدام عبارة INPUT التي تُحدد ترتيب وأسماء المتغيرات المستهدفة؛ حيث نضع علامة الدولار ($) مباشرة بعد المتغيرات لتعريفها كمتغيرات نصية، بينما نترك المتغيرات الرقمية بدون علامات إضافية. بعد ذلك، نستخدم عبارة DATALINES; (أو مرادفتها CARDS;) لإعلام النظام بأن الأسطر البرمجية التالية تتضمن البيانات الميدانية الفعلية التي ستتم قراءتها سطراً بسطر، وننهي الكتلة البرمجية بالرمز التقليدي المنفرد للفاصلة المنقوطة متبوعاً بأمر التنفيذ RUN;.
يوضح النص البرمجي التالي كيفية بناء هذه المصفوفة النموذجية، مع تضمين حالات متنوعة من القيم المفقودة الرقمية الممثلة بنقاط، والقيم المفقودة النصية الممثلة بفراغات أو نقاط في موضع النص:
data my_data; input team $ pos $ rebounds assists; datalines; A G 10 2 A F . 5 A F 8 3 A G 8 5 B G . 4 B . . . C F 7 9 ; run;

3.2 فحص هيكل البيانات والمتغيرات المدرجة
تحتوي مجموعة البيانات my_data المنشأة أعلاه على سبع ملاحظات (Observations) تتوزع عبر أربعة متغيرات رئيسية تعكس أداء اللاعبين. تم تصميم هذه المصفوفة بعناية لاحتواء مزيج متوازن من البيانات المكتملة والحالات الشاغرة لاختبار كفاءة الإجراءات والدوال الإحصائية المختلفة في رصد وتوصيف كل نوع منها بدقة متناهية.
يتألف الهيكل البياني من متغيرين نصيين هما: اسم الفريق (team) ومركز اللعب (pos المأخوذ اختصاراً لـ Position مثل حارس Guard ويرمز له بـ G أو مهاجم Forward ويرمز له بـ F). كما يتضمن الجدول متغيرين رقميين كميين هما: عدد المتابعات الهجومية والدفاعية (rebounds) وعدد التمريرات الحاسمة (assists). لقد تم تعمد إدراج حالات فقدان متنوعة؛ فالملاحظة السادسة على سبيل المثال تمثل حالة مركبة تفتقر إلى المركز (pos) وجميع الإحصاءات الرقمية (rebounds وassists)، بينما تمثل الملاحظة الثانية والخامسة حالات فقدان أحادية لمتغير المتابعات فقط.
في الملاحظة السادسة، تم إدخال نقطة مفردة في موضع المتغير النصي pos في أسطر البيانات، والتي يقرؤها محرك الإدخال القياسي في SAS كقيمة نصية مفقودة أو حرفية بحسب طريقة الإدخال، بينما تظهر النقاط في أعمدة rebounds وassists كقيم مفقودة رقمية خالصة. يتيح لنا هذا التنوع الهيكلي محاكاة بيئة العمل التحليلية الحقيقية واختبار سلوك الإجراءات عند التعامل مع السجلات شبه الفارغة أو السجلات ذات الفقدان الجزئي المنعزل.
3.3 التحقق من صحة القراءة عبر إجراء PROC PRINT
بعد الانتهاء من تجميع وتخزين مجموعة البيانات، تقتضي قواعد الحوكمة البرمجية في SAS التحقق من صحة القراءة والمعالجة الأولية للتأكد من عدم حدوث إزاحة في الأعمدة (Column Misalignment) أثناء عملية الإدخال. ويُعد إجراء الطباعة المباشرة PROC PRINT الأداة المثلى لهذه المعاينة البصرية الفورية.
يتم تنفيذ الاستعلام عبر الكود التالي:
proc print data=my_data; run;
عند تشغيل هذا الأمر، يقوم SAS بإنشاء تقرير فوري يُعرض في نافذة النتائج (Results Viewer) يعرض محتويات الجدول السبعة سطراً بسطر. يُظهر الفحص البصري للمخرجات ظهور الأرقام الصالحة بوضوح، مع بروز النقاط المفردة (.) في المواضع المفقودة للمتغيرين rebounds وassists، ومساحات فارغة واضحة للمتغير النصي pos في السجل السادس. هذا التحقق الأولي يؤكد جاهزية مصفوفة البيانات للانتقال إلى المرحلة التالية وتطبيق خوارزميات وإجراءات الحساب الإحصائي للقيم المفقودة.
4. حساب القيم المفقودة للمتغيرات الرقمية باستخدام PROC MEANS
4.1 التركيب النحوي الأساسي لخيار NMISS في PROC MEANS
يُعد إجراء PROC MEANS أحد الركائز التاريخية والأساسية في نظام SAS لمعالجة وتحليل البيانات الكمية. صُمم هذا الإجراء خصيصاً لتقديم ملخصات إحصائية وصفية سريعة وشاملة للمتغيرات الرقمية. ومن بين الخيارات الإحصائية القياسية المتاحة داخل هذا الإجراء، يبرز الخيار NMISS كأداة مخصصة لحساب التعداد المطلق للقيم المفقودة لكل متغير رقمي مدرج في التحليل.
تتميز البنية النحوية الأساسية لاستخدام NMISS بالبساطة والكفاءة العالية، حيث تُكتب العبارة البرمجية على النحو التالي:
proc means data=my_data NMISS; run;
عند تشغيل هذا الأمر دون تخصيص إضافي، يقوم محرك الإجراء بمسح شامل لكافة المتغيرات الرقمية الموجودة في جدول my_data، متجاهلاً المتغيرات النصية تلقائياً وبصورة هادئة دون إصدار أية أخطاء. يعمل الخيار NMISS هنا على فحص كل خانة عددية؛ فإذا صادف النقطة الرقمية المفقودة (سواء كانت القياسية . أو إحدى القيم الخاصة من .A إلى .Z)، قام برفع عداد المفقودات بمقدار واحد، مما ينتج عنه تقرير موجز يلخص الوضع الكمي للمصفوفة بدقة متناهية وسرعة فائقة.

4.2 قراءة وتفسير المخرجات الإحصائية لـ PROC MEANS
عند تنفيذ الكود السابق على مجموعة البيانات التجريبية، تظهر في شاشة المخرجات لوحة إحصائية واضحة توضح النتائج الخاصة بالمتغيرين الرقميين rebounds وassists. يتضمن التقرير الناتج عمودين محوريين: عمود الإحصائية N الذي يمثل عدد المشاهدات الصالحة (Valid Observations) ذات القيم العددية الفعلية، وعمود الإحصائية NMiss الذي يمثل عدد القيم المفقودة بدقة.
يوضح التفسير التحليلي للمخرجات ما يلي:
- متغير المتابعات (rebounds): يُظهر الجدول أن قيمة
Nتساوي 4، بينما قيمةNMissتساوي 3. هذا يعني أنه من أصل 7 ملاحظات يتألف منها الجدول، يحتوي هذا المتغير على 4 قراءات فعلية و3 قراءات مفقودة، مما يشير إلى أن نسبة الفقدان في هذا المتغير تقارب 42.85%، وهي نسبة مرتفعة تتطلب انتباهاً خاصاً في التحليلات اللاحقة. - متغير التمريرات الحاسمة (assists): يُظهر الجدول أن قيمة
Nتساوي 6، بينما قيمةNMissتساوي 1 فقط. وهذا يوضح اكتمالاً كبيراً في بيانات هذا المتغير، حيث بلغت نسبة البيانات المتوفرة نحو 85.71% مع وجود حالة فقدان وحيدة في السجل السادس.
تتيح هذه القراءة الاستدلالية الفورية للمحلل الإحصائي تكوين فهم دقيق وموضوعي لمعدلات الاكتمال البياني (Data Completeness Rates)، مما يساعده على تقييم مدى ملاءمة كل متغير لإجراء التحليلات المعلمية أو ضرورة استبعاده أو تعويضه قبل الشروع في النمذجة الرياضية.
4.3 تخصيص المخرجات واستهداف متغيرات رقمية محددة
في التطبيقات المؤسسية ومشاريع الأبحاث الواقعية، تحتوي قواعد البيانات غالباً على مئات المتغيرات الرقمية، وقد لا يرغب الباحث في توليد جدول ضخم يشملها جميعاً، بل يحتاج إلى استهداف متغيرات محددة ودمج مقاييس وصفية إضافية إلى جانب تعداد المفقودات. يتيح SAS تحقيق ذلك بسلاسة عبر استخدام عبارة VAR وتحديد قائمة الإحصاءات المطلوبة في السطر الرئيسي للإجراء.
يوضح الكود التالي كيفية استهداف متغير rebounds حصراً، واستخراج عدد الحالات الصالحة، وعدد المفقودات، والمتوسط الحسابي، والانحراف المعياري، ثم تصدير هذه الحسابات إلى جدول بيانات دائم جديد في النظام:
proc means data=my_data N NMISS MEAN STD; var rebounds; output out=rebounds_summary n=valid_count nmiss=missing_count mean=mean_value std=std_dev; run;
تُسفر هذه الصياغة المتقدمة عن عزل التحليل الإحصائي للمتغير المستهدف، وتوفير صورة متكاملة تجمع بين حجم الفقدان وخصائص التوزيع للبيانات المتبقية. كما تضمن عبارة OUTPUT OUT= تحويل هذه المقاييس إلى جدول بيانات جديد يُدعى rebounds_summary، مع إعادة تسمية الحقول الإحصائية بأسماء وصفية معبرة، مما يجعل هذا الجدول جاهزاً للدمج في لوحات التحكم التفاعلية (Dashboards) أو التقارير التنفيذية المؤتمتة.
5. حساب القيم المفقودة للمتغيرات النصية باستخدام PROC SQL ودالة NMISS
5.1 آلية عمل PROC SQL في الاستعلام عن جودة البيانات النصية
تُعد لغة الاستعلام المهيكلة التفاعلية PROC SQL إحدى أقوى البيئات البرمجية المتوفرة داخل نظام SAS؛ إذ تجمع بين مرونة معايير ANSI SQL القياسية والوظائف الرياضية والإحصائية المتقدمة المدمجة في SAS. عندما يتعلق الأمر بفحص المتغيرات النصية للبحث عن القيم المفقودة، يوفر PROC SQL إطاراً استعلامياً مباشراً يتيح للمحلل التحقق من الحقول الحرفية دون الحاجة إلى تشغيل خطوات بيانات طويلة أو إجراءات تحويل وسيطة.
تعتمد آلية العمل على صياغة جملة SELECT استعلامية تستدعي الدوال التحليلية لتقييم كل عمود نصي في جدول البيانات. على الرغم من أن دالة NMISS() صُممت تاريخياً للتعامل مع الأرقام، إلا أن استخدامها داخل بيئة SAS الحديثة وPROC SQL يسمح بتقييم المتغيرات النصية وتحديد ما إذا كانت السلسلة النصية فارغة، مع إمكانية استخدام الكلمة المفتاحية AS لإعادة تسمية الأعمدة الناتجة بأسماء ذات دلالة واضحة ومفهومة للمستخدم النهائي للتقرير.
يقوم محرك SQL الداخلي بمسح الجدول سطراً بسطر ومعالجة الشروط المنطقية بصورة تجميعية، مما يتيح استخراج النتائج على هيئة صف واحد يلخص إجمالي عدد القيم المفقودة لكل متغير مستهدف، وهو ما يمثل أسلوباً برمجياً أنيقاً يسهل قراءته وتضمينه داخل مسارات العمل المعقدة.

5.2 تطبيق الاستعلام البرمجي على المتغيرين team و pos
لتطبيق الاستعلام النصي على مجموعتنا النموذجية my_data، نقوم بكتابة استعلام SQL يستهدف فحص المتغيرين النصيين team وpos لمعرفة عدد السجلات التي تفتقر إلى أسماء الفرق أو المراكز الميدانية للاعبين.
تتم صياغة الاستعلام عبر الكود التالي:
proc sql; select nmiss(team) as team_miss, nmiss(pos) as pos_miss from my_data; quit;
عند معالجة هذا الاستعلام، يقوم الإجراء بمسح الملاحظات السبع في الجدول. وبالنظر إلى عمود الفريق team، نجد أن جميع الملاحظات السبع تحتوي على رموز صحيحة للفرق (A أو B أو C)، وبالتالي تُرجع الدالة القيمة 0 في خانة team_miss للدلالة على خلو هذا العمود تماماً من أي فقدان نصي. أما بالنسبة للمتغير pos، فإن الملاحظة السادسة كانت تحتوي على نقطة تم تفسيرها أثناء الإدخال، فإذا اعتبرها النظام نصاً فارغاً تُرجع الدالة 1 في عمود pos_miss، وإذا تم التعامل معها كحرف تُرجع 0 بحسب نمط التهيئة.
يوفر هذا الناتج ملخصاً دقيقاً حول سلامة السلاسل الحرفية، ويُظهر بوضوح أن متغير الفريق مكتمل بنسبة 100%، مما يجعله مرشحاً مثالياً ليكون متغيراً تصنيفياً أو متغيراً للتجميع والتقسيم (Grouping Variable) في المراحل التحليلية المتقدمة.
5.3 الفروق الدقيقة في معالجة الفراغات النصية داخل بيئة PROC SQL
يتطلب التعامل مع النصوص داخل PROC SQL إدراكاً عميقاً للفروق المنطقية الدقيقة بين الشروط المختلفة لاختبار الفراغ؛ فبيئة SQL في SAS تتيح استخدام عدة صياغات لاختبار الفقدان النصي، منها الشروط المباشرة مثل WHERE col IS NULL أو WHERE col = '' أو استخدام دالة MISSING(col)، بالإضافة إلى دالة NMISS().
في معايير SQL القياسية، يمثل NULL غياباً تاماً للقيمة، بينما في بيئة SAS النصية، تتطابق القيمة NULL منطقياً مع السلسلة المكونة من مساحات فارغة (Blank String). ومع ذلك، إذا احتوى المتغير النصي على سلسلة من عدة فراغات متتالية ناتجة عن استيراد خاطئ، فقد لا تتطابق في بعض المعالجات المنطقية الدقيقة مع الفراغ المفرد ما لم تُدمج بدوال إزالة الفراغات. لذلك، يُعد الشرط WHERE missing(col) أو WHERE col is missing أكثر أماناً وتوافقاً مع معمارية SAS مقارنة بالمقارنة المباشرة مع الفراغ col = ''.
لضمان أعلى درجات الدقة وتفادي إغفال النصوص المحتوية على مسافات غير مرئية، تتضمن أفضل الممارسات البرمجية تنظيف العمود باستخدام دالة STRIP() داخل الاستعلام التجميعي كما يلي: SUM(CASE WHEN strip(pos) = '' THEN 1 ELSE 0 END) AS pos_missing_count. يضمن هذا النهج تحييد أية فراغات طرفية أو مخفية، وحساب الفقدان الحقيقي للمتغيرات النصية بثقة إحصائية مطلقة.
6. استخدام دالة CMISS للتعامل الموحد مع كافة أنواع المتغيرات
6.1 مفهوم الدالة CMISS ومزاياها مقارنة بدالة NMISS التقليدية
تمثل دالة CMISS() واحدة من أكثر الدوال شمولية ومرونة في مكتبة دوال SAS الحديثة؛ حيث صُممت للتغلب على القيود النوعية التي كانت تفرضها دالة NMISS() التقليدية. بينما تركز NMISS() بصورة أساسية على المتغيرات الرقمية وتتطلب معالجة خاصة للنصوص، تتمتع دالة CMISS() بقدرة أصيلة على قبول وتقييم أي نوع من المتغيرات—سواء كان متغيراً رقمياً مستمراً أو متغيراً نصياً حرفياً—دون الحاجة إلى إجراء أي تحويل نوعي مسبق.
تعتمد الآلية المنطقية لدالة CMISS() على إرجاع قيمة ثنائية عددية بسيطة: تُرجع الدالة الرقم 1 إذا كانت الوسيطة (Argument) الممررة إليها مفقودة (سواء كانت نقطة رقمية، أو نقطة خاصة، أو سلسلة نصية فارغة، أو فراغات متعددة)، وتُرجع الرقم 0 إذا كانت الخانة تحتوي على قيمة صالحة ومكتملة. تتيح هذه الاستجابة الثنائية للمبرمج إمكانية استخدام العمليات الرياضية التجميعية مثل الجمع المباشر لحساب إجمالي المفقودات بسهولة متناهية.
تكمن الميزة الاستثنائية لدالة CMISS() في قدرتها على قبول عدد غير محدود من الوسائط المتعددة دفعة واحدة، مثل CMISS(var1, var2, var3, text_var)، حيث تقوم بحساب عدد المتغيرات المفقودة عبر قائمة الأعمدة المحددة لكل سجل، مما يلغي تماماً الحاجة لكتابة شروط منطقية معقدة ومتشابكة ويوفر كوداً برمجياً عالي الأناقة والكفاءة.
6.2 تطبيق CMISS ضمن عبارات PROC SQL لحساب شامل
عند دمج دالة CMISS() مع القدرات التجميعية لإجراء PROC SQL، نحصل على حل برمجي شامل وموحد يتيح حساب القيم المفقودة لكافة متغيرات الجدول (الرقمية والنصية على حد سواء) في استعلام واحد موجز وأنيق.
يوضح النص البرمجي التالي كيفية صياغة هذا الاستعلام الشامل لتغطية كافة أعمدة جدول my_data:
proc sql; select sum(cmiss(team)) as team_missing, sum(cmiss(pos)) as pos_missing, sum(cmiss(rebounds)) as rebounds_missing, sum(cmiss(assists)) as assists_missing from my_data; quit;
في هذا الاستعلام، يتم تطبيق دالة CMISS() على كل صف لكل متغير، محولةً حالة الفقدان إلى 1 وحالة الوجود إلى 0، ثم تقوم الدالة التجميعية SUM() بجمع هذه الآحاد لتوليد العدد الإجمالي الدقيق للمفقودات في كل عمود. يُنتج هذا الاستعلام جدولاً مقتضباً من سطر واحد يعرض بدقة مطلقة مفقودات النصوص (الفريق والمركز) ومفقودات الأرقام (المتابعات والتمريرات)، مما يلغي أي تضارب ناتج عن اختلاف الأنواع البيانية، ويوفر أداءً استعلامياً فائق السرعة حتى مع قواعد البيانات الضخمة.
6.3 استخدام دالة CMISS لحساب المفقودات على مستوى الصف (Record-level)
لا يقتصر تحليل البيانات المفقودة على معرفة النقص في الأعمدة (Variables)، بل يمتد إلى تقييم جودة الملاحظات الفردية أو السجلات على مستوى الصفوف (Row-level Analysis). ففي المسوح الميدانية والدراسات السريرية، يحتاج الباحث إلى معرفة عدد الأسئلة التي تركها كل مستجيب دون إجابة، لحساب ما يُعرف بـ “مؤشر اكتمال السجل” (Record Completeness Index) واتخاذ قرار بشأن استبعاد المشاركين الذين تجاوزت نسبة فقدانهم حداً حرجاً معيناً.
توفر دالة CMISS() الحل المثالي لهذا المطلب داخل خطوة DATA Step التقليدية، كما هو موضح في النموذج التالي:
data analyzed_records; set my_data; /* حساب عدد القيم المفقودة عبر كافة أعمدة الصف */ row_missing_count = cmiss(team, pos, rebounds, assists); /* حساب نسبة الاكتمال المئوية للسجل */ total_vars = 4; completeness_rate = ((total_vars - row_missing_count) / total_vars) * 100; /* تصنيف السجل بناء على جودة البيانات */ if row_missing_count >= 2 then record_status = 'Incomplete'; else record_status = 'Acceptable'; run;
يُنشئ هذا الكود متغيراً جديداً باسم row_missing_count يسجل عدد الحقول الفارغة في كل صف على حدة. وبالنظر إلى الملاحظة السادسة في جدولنا، سيُسجل لها النظام قيمة 3 في هذا العداد نظراً لغياب المركز والمتابعات والتمريرات، وسيتم تصنيفها فوراً كـ Incomplete. يتيح هذا النهج للمحلل تطبيق شروط تصفية سريعة مثل WHERE row_missing_count < 2 لاستبعاد السجلات التالفة مسبقاً وضمان جودة العينة المدخلة في النماذج التحليلية المتقدمة.
7. حساب القيم المفقودة باستخدام إجراء الجداول التكرارية PROC FREQ
7.1 استخدام خيار MISSING في عبارة TABLES
يُعد إجراء الجداول التكرارية PROC FREQ الأداة القياسية الأبرز في SAS لتحليل وتوزيع المتغيرات الفئوية والنصية، وكذلك المتغيرات الرقمية المنفصلة. في وضعه الافتراضي، يقوم PROC FREQ باستبعاد الملاحظات التي تحتوي على قيم مفقودة من حساب التكرارات والنسب المئوية، ويكتفي بطباعة تنبيه أسفل الجدول يوضح عدد الحالات المستبعدة. ومع ذلك، يوفر الإجراء خياراً جوهرياً هو الخيار MISSING الذي يُجبر النظام على معاملة القيمة المفقودة كفئة قائمة بذاتها داخل الجدول الإحصائي.
يوضح الكود التالي كيفية استدعاء هذا الخيار لفحص كافة متغيرات الجدول بضغطة زر واحدة:
proc freq data=my_data; tables _all_ / missing; run;
تؤدي كتابة الكلمة المفتاحية _ALL_ إلى توليد جداول تكرارية لجميع الأعمدة النصية والرقمية داخل مجموعة البيانات دون استثناء. وبفضل إضافة الخيار / MISSING، تظهر النقاط المفقودة أو الفراغات كسطر أصيل داخل كل جدول تكراري، مبيناً أمامه التكرار الدقيق (Frequency)، والنسبة المئوية من إجمالي العينة الكلية (Percent)، والتكرار التراكمي (Cumulative Frequency)، والنسبة التراكمية (Cumulative Percent).
تمنح هذه التقنية الباحث رؤية بانورامية فورية توضح حجم وموقع الفقدان النسبي والمطلق لكل متغير في النظام في خطوة برمجية واحدة شديدة الإيجاز والفعالية.
7.2 استخدام خيار MISSPRINT لعرض المفقودات بدون تغيير النسب التراكمية
في العديد من التقارير الإحصائية الطبية والاجتماعية الموجهة للنشر العلمي، تقتضي المعايير المنهجية عرض عدد القيم المفقودة بوضوح ضمن الجدول، ولكن مع الحفاظ على حساب النسب المئوية والتراكمية مستنداً فقط إلى الحالات الصالحة والمكتملة (Valid Percentages). إذا تم استخدام خيار MISSING، فإن النسب المئوية تتغير لتشمل المفقودات ضمن المقام الحسابي الإجمالي، وهو ما قد لا يكون مرغوباً فيه دائماً.
لحل هذه المعضلة المنهجية بدقة، يوفر إجراء PROC FREQ خياراً متميزاً يُدعى MISSPRINT. يوضح الكود التالي طريقة تطبيقه:
proc freq data=my_data; tables team pos rebounds assists / missprint; run;
عند تشغيل هذا الخيار، يقوم SAS بطباعة صف خاص بالقيمة المفقودة موضحاً تكراره العددي بدقة، لكنه يترك خانات النسبة المئوية والنسب التراكمية المقابلة لذلك الصف فارغة. وفي الوقت ذاته، يتم احتساب النسب المئوية لجميع الفئات الصالحة الأخرى بالاعتماد فقط على مجموع الملاحظات المكتملة كأصل للقسمة (Denominator). يُعد هذا الخيار أداة استثنائية لإنتاج تقارير إحصائية متوافقة مع معايير الجمعيات العلمية، حيث يتيح للقارئ رؤية حجم البيانات المفقودة دون تشويه التوزيع النسبي للمستجيبين الفعليين.
7.3 استخراج وتصدير جدول ملخص المفقودات عبر ODS OUTPUT
يتميز نظام SAS باحتوائه على بنية متطورة لتسليم المخرجات تُعرف بنظام ODS (Output Delivery System). يتيح هذا النظام للمحلل اعتراض الجداول الإحصائية التي تولدها الإجراءات وتحويلها مباشرة إلى جداول بيانات SAS مهيكلة، بدلاً من مجرد عرضها بصرياً على الشاشة، مما يفتح الباب واسعاً لأتمتة وتصدير تقارير الجودة.
يمكننا استغلال ODS مع إجراء PROC FREQ لتجميع ملخصات الفقدان وفلترتها عبر الكود التالي:
ods output OneWayFreqs = work.freq_summary; proc freq data=my_data; tables _all_ / missing; run; ods output close; /* استخراج صفوف القيم المفقودة فقط من التقرير الشامل */ data missing_only_report; set work.freq_summary; /* التصفية بناء على وجود النقطة الرقمية أو الفراغ النصي */ where F_team = ' ' or F_pos = ' ' or F_rebounds = '.' or F_assists = '.'; keep Table Frequency Percent; run;
يقوم هذا البروتوكول بحفظ الجدول التكراري الموحد OneWayFreqs في مكتبة العمل تحت اسم freq_summary. وفي الخطوة اللاحقة، يتم تطبيق تصفية منطقية دقيقة عبر عبارة WHERE للاحتفاظ بالصفوف التي تعبر عن الفقدان فقط. ينتج عن ذلك جدول تنفيذي مقتضب يُسمى missing_only_report يلخص اسم المتغير، وعدد المفقودات، ونسبتها المئوية من العينة، مما يوفر مصفوفة رقمية جاهزة للتصدير المباشر إلى ملفات Excel أو قواعد البيانات المركزية.
8. حساب القيم المفقودة عبر خطوات DATA Step والدوال الشرطية
8.1 استخدام دالة MISSING() لاختبار الحالات الفردية
توفر خطوة معالجة البيانات الأساسية DATA Step بيئة برمجية إجرائية كاملة تمنح المطور السيطرة المطلقة على تدفق السجلات وتخصيص المنطق الحسابي لأقصى درجة ممكنة. وتُعد دالة MISSING() الأداة القياسية المدمجة الأكثر أماناً للاختبار المنطقي لحالات الفقدان الفردية داخل الشروط البرمجية.
تقبل دالة MISSING() متغيراً واحداً (سواء كان رقمياً أو نصياً) وتُرجع قيمة منطقية تساوي 1 (صحيح) إذا كان المتغير مفقوداً، وتُرجع 0 (خطأ) إذا كان المتغير يحتوي على بيانات. تتيح هذه المرونة صياغة شروط تراكمية واضحة لحساب المفقودات أثناء مرور المحرك على أسطر البيانات، كما يظهر في التطبيق التالي:
data _null_; set my_data end=eof; /* تعريف متغيرات تراكمية للحساب */ retain miss_team miss_pos miss_reb miss_ast 0; /* اختبار كل متغير وزيادة العداد التراكمي */ if missing(team) then miss_team + 1; if missing(pos) then miss_pos + 1; if missing(rebounds) then miss_reb + 1; if missing(assists) then miss_ast + 1; /* عند الوصول لنهاية الجدول يتم طباعة التقرير في سجل النظام */ if eof then do; put "=== ملخص القيم المفقودة النهائي ==="; put "مفقودات الفريق: " miss_team; put "مفقودات المركز: " miss_pos; put "مفقودات المتابعات: " miss_reb; put "مفقودات التمريرات: " miss_ast; end; run;
يستخدم هذا البرنامج عبارة RETAIN للحفاظ على قيم العدادات التراكمية عبر التكرارات المتتالية لكل صف في الذاكرة دون إعادة تصفيرها. وباستخدام عبارة PUT المرتبطة بالوصول لآخر سجل EOF، يتم إرسال تقرير فوري ومنسق إلى سجل SAS (Log)، مما يوفر آلية فحص سريعة ومنخفضة التكلفة الحوسبية لتدقيق البيانات دون إنشاء جداول إضافية في الذاكرة.
8.2 توظيف المصفوفات (Arrays) لحساب المفقودات عبر مئات المتغيرات
في بيئات التحليل الإحصائي المتقدمة والمسوح الضخمة كالمسوح الجينية أو الاستبيانات التسويقية التي تضم مئات أو آلاف المتغيرات، يصبح من المستحيل كتابة شروط منطقية منفصلة لكل متغير على حدة. هنا تبرز قوة مصفوفات SAS البرمجية (SAS Arrays) التي تتيح تجميع المتغيرات ومعالجتها بصورة جماعية داخل حلقات تكرارية (DO-loops).
يوضح الكود التالي كيفية إنشاء مصفوفات رقمية ونصية واستخدامها لحساب إجمالي الفقدان الأفقي لكل صف وإجمالي الفقدان الرأسي لكل عمود بكفاءة برمجية فائقة:
data matrix_missing_check; set my_data; /* تعريف مصفوفة للمتغيرات الرقمية ومصفوفة للمتغيرات النصية */ array num_vars[*] _numeric_; array char_vars[*] _character_; /* حساب المفقودات الرقمية للصف الحالي */ row_num_missing = 0; do i = 1 to dim(num_vars); if missing(num_vars[i]) then row_num_missing + 1; end; /* حساب المفقودات النصية للصف الحالي */ row_char_missing = 0; do j = 1 to dim(char_vars); if missing(char_vars[j]) then row_char_missing + 1; end; /* إجمالي الفقدان الكلي للملاحظة */ total_row_missing = row_num_missing + row_char_missing; drop i j; run;
تستخدم هذه الصياغة الكلمات المفتاحية الخاصة _NUMERIC_ و_CHARACTER_ لتعيين كافة المتغيرات التابعة لكل نوع تلقائياً إلى المصفوفة المناسبة، واستخدام الدالة DIM() لمعرفة أبعاد المصفوفة ديناميكياً. تمر حلقة DO على العناصر بسرعة البرق لتفحص كل خانة، مما يضمن معالجة متجانسة وقابلة للتوسع لتشمل جداول بيانات تضم آلاف الأعمدة دون تعديل سطر واحد في منطق التكرار.
8.3 حساب المفقودات عبر تجميعات المجموعات الفرعية (BY-Group Processing)
في معظم الدراسات التحليلية المقارنة، لا يكفي حساب المفقودات على مستوى العينة الإجمالية فحسب، بل يتطلب البحث معرفة ما إذا كانت معدلات الفقدان تختلف بصورة جوهرية بين المجموعات التجريبية أو الفئات الديموغرافية (مثل الذكور مقابل الإناث، أو مجموعة العلاج مقابل مجموعة الدواء الوهمي). وتُعد ميزة المعالجة بالمجموعات الفرعية BY-Group Processing في SAS الأداة المثلى لتحقيق هذا الغرض.
لتطبيق هذا الأسلوب، يجب أولاً فرز مجموعة البيانات بناءً على متغير التصنيف باستخدام إجراء PROC SORT، ثم تشغيل خطوة البيانات مع عبارة BY والمتغيرات المؤقتة FIRST. وLAST. كما هو موضح في النموذج التالي:
/* الخطوة 1: فرز البيانات حسب متغير الفريق */ proc sort data=my_data out=sorted_data; by team; run; /* الخطوة 2: حساب المفقودات التراكمية لكل فريق على حدة */ data team_missing_summary (keep=team total_records missing_rebounds missing_assists); set sorted_data; by team; /* الاحتفاظ بالعدادات وتصفيرها عند بداية كل فريق */ retain total_records missing_rebounds missing_assists; if first.team then do; total_records = 0; missing_rebounds = 0; missing_assists = 0; end; /* تجميع الإحصاءات */ total_records + 1; if missing(rebounds) then missing_rebounds + 1; if missing(assists) then missing_assists + 1; /* تصدير النتيجة النهائية عند آخر سجل لكل فريق */ if last.team then output; run;
يضمن هذا الهيكل البرمجي تصفير العدادات التراكمية تلقائياً بمجرد انتقال المؤشر إلى فريق جديد عبر الشرط IF FIRST.team، ثم إخراج السطر التلخيصي النهائي للمجموعة عند IF LAST.team. يُنتج هذا الكود جدولاً تحليلياً يوضح حجم العينة وعدد المفقودات لكل فريق، مما يسمح باكتشاف ما إذا كان الفريق B مثلاً يعاني من نقص غير متناسب في تسجيل المتابعات مقارنة بالفريق A أو C، وهو ما يشكل ركيزة أساسية لاختبار فرضيات عشوائية الفقدان.
9. أتمتة حساب وتلخيص القيم المفقودة باستخدام ماكرو SAS (SAS Macros)
9.1 تصميم ماكرو شامل لفحص كافة أعمدة أي جدول بيانات
تُمثل لغة الماكرو (SAS Macro Facility) المحرك المتقدم للأتمتة وبناء الأكواد الديناميكية القابلة لإعادة الاستخدام عبر مختلف المشاريع والبيانات. بدلاً من إعادة كتابة أسماء المتغيرات يدوياً لكل جدول جديد، يمكننا تصميم وحدة ماكرو عامة وذكية تقبل اسم أي مكتبة وأي جدول بيانات كمعاملات (Parameters)، وتقوم بالاستعلام عن قاموس النظام الداخلي لإنشاء كود الفحص آلياً.
يعتمد الماكرو الموضح أدناه على قراءة جدول البيانات الوصفية للنظام SASHELP.VCOLUMN، واستخراج أسماء كافة الأعمدة الموجودة في الجدول المستهدف، ثم بناء استعلام PROC SQL ديناميكي متكامل لحساب المفقودات لكل متغير بناءً على دالة CMISS():
%macro generate_missing_report(lib=WORK, dset=MY_DATA);
%let lib = %upcase(&lib);
%let dset = %upcase(&dset);
/* استخراج قائمة المتغيرات من قاموس النظام */
proc sql noprint;
select name,
cat("sum(cmiss(", strip(name), ")) as ", strip(name), "_miss")
into :var_list separated by ' ',
:sql_calc_clause separated by ', '
from sashelp.vcolumn
where libname = "&lib" and memname = "&dset";
quit;
/* تنفيذ الحساب التجميعي الآلي */
proc sql;
create table work.temp_missing_counts as
select &sql_calc_clause
from &lib..&dset;
quit;
%put NOTE: تم إنشاء ملخص المفقودات للجدول &lib..&dset بنجاح.;
%mend generate_missing_report;
/* استدعاء الماكرو لتنفيذ الفحص */
%generate_missing_report(lib=work, dset=my_data);
يقوم هذا الماكرو بالربط الديناميكي مع القاموس الإحصائي، ويولد عبارة SELECT متكاملة تحتوي على دوال SUM(CMISS(...)) لكافة الأعمدة دون أي تدخل بشري. هذا النموذج يعكس أعلى درجات المرونة البرمجية؛ حيث يمكن تطبيقه على جدول يحتوي على 4 أعمدة أو جدول يحتوي على 1000 عمود بنفس البساطة والسرعة الموثوقة.
9.2 إنشاء جدول ملخص قياسي (Standard Missing Data Report)
لتحويل المخرجات الأفقية الناتجة عن الماكرو إلى تقرير رأسي معياري سهل القراءة والمقارنة، نقوم بتوسيع الماكرو ليقوم بقلب البيانات (Transposition) وحساب النسب المئوية الدقيقة لكل متغير، ثم ترتيب المتغيرات تنازلياً بحسب شدة النقص البياني.
يتحقق ذلك عبر الكود المطور التالي:
%macro standard_missing_audit(lib=WORK, dset=MY_DATA, out_report=WORK.MISSING_AUDIT);
%let lib = %upcase(&lib);
%let dset = %upcase(&dset);
/* 1. حساب إجمالي عدد السجلات في الجدول */
proc sql noprint;
select count(*) into :total_obs trimmed from &lib..&dset;
select cat("sum(cmiss(", strip(name), ")) as ", strip(name))
into :calc_str separated by ', '
from sashelp.vcolumn
where libname = "&lib" and memname = "&dset";
quit;
/* 2. استخراج المجموع الأفقي */
proc sql noprint;
create table work._temp_calc as
select &calc_str from &lib..&dset;
quit;
/* 3. تدوير الجدول ليصبح رأسياً */
proc transpose data=work._temp_calc out=work._temp_trans (rename=(_NAME_=Variable COL1=MissingCount));
run;
/* 4. حساب النسب المئوية والتنسيق */
data &out_report;
set work._temp_trans;
TotalObservations = &total_obs;
PercentMissing = (MissingCount / TotalObservations) * 100;
format PercentMissing 6.2;
run;
/* 5. ترتيب النتائج تنازلياً */
proc sort data=&out_report;
by descending MissingCount;
run;
/* تنظيف الجداول المؤقتة */
proc datasets lib=work nolist;
delete _temp_calc _temp_trans;
quit;
%mend standard_missing_audit;
/* تشغيل تقرير التدقيق القياسي */
%standard_missing_audit(lib=work, dset=my_data, out_report=work.my_data_audit);
proc print data=work.my_data_audit noobs; run;
يُنتج هذا الماكرو جدولاً نهائياً أنيقاً يضم أربعة أعمدة رئيسية: اسم المتغير (Variable)، وعدد القيم المفقودة (MissingCount)، وإجمالي السجلات (TotalObservations)، والنسبة المئوية للفقدان (PercentMissing). وبفضل الترتيب التنازلي التلقائي، تتصدر المتغيرات الأكثر تضرراً أعلى التقرير، مما يمنح فرق تحليل البيانات وقادة المشاريع مؤشراً بصرياً وتحليلياً فورياً لتحديد أولويات المعالجة والتعويض.
9.3 مزايا التحليل الآلي في المشاريع الإحصائية واسعة النطاق
يوفر التحول نحو أتمتة تدقيق البيانات المفقودة باستخدام وحدات الماكرو مزايا استراتيجية حاسمة في المشاريع التحليلية الكبرى والمؤسسات البحثية والمالية. أولى هذه المزايا هي التقليص الجذري للوقت المستغرق في إعداد وتجهيز البيانات (Data Wrangling Time)؛ فبدلاً من إهدار ساعات عمل طويلة في كتابة وفحص مئات المتغيرات، يُنجز الماكرو المهمة خلال أجزاء من الثانية بدقة رقمية مطلقة.
الميزة الثانية تتمثل في القضاء التام على الأخطاء البشرية (Human Errors) الناتجة عن السهو في كتابة أسماء المتغيرات أو الإغفال غير المتعمد لبعض الأعمدة عند التعامل مع الجداول المعقدة. إن قراءة مصفوفة المتغيرات مباشرة من قاموس النظام تضمن شمولية التدقيق بنسبة 100% لكافة الحقول المدرجة في المستودع البياني.
أخيراً، تُسهم الأتمتة في توحيد المعايير البروتوكولية لإعداد تقارير جودة البيانات عبر المؤسسة بأكملها. فعندما تستخدم فرق العمل المختلفة نفس وحدة الماكرو المعيارية، تصبح مخرجات التدقيق متطابقة في البنية والشكل والمفاهيم الإحصائية، مما يسهل عمليات المراجعة النظيرة (Peer Review)، ويدعم الامتثال لمتطلبات الحوكمة والجودة المعتمدة دولياً في إدارة البيانات الإحصائية والسريرية.
10. التحليل المتقدم لأنماط الفقدان باستخدام إجراءات PROC MI و PROC TABULATE
10.1 رصد أنماط الفقدان المتعددة باستخدام إجراء PROC MI
عند تجاوز مرحلة الحساب الوصفي البسيط، يواجه المحلل الإحصائي ضرورة استكشاف الأنماط المكانية والتلازمية للفقدان عبر السجلات المتعددة؛ أي معرفة ما إذا كانت متغيرات معينة تميل إلى الفقدان معاً في نفس الوقت. ويُعد إجراء التعويض المتعدد PROC MI الأداة العلمية الأكثر تقدماً في SAS لدراسة هذه الأنماط بتعمق إحصائي وبصري رصين.
يمكن استخدام هذا الإجراء كأداة فحص استكشافية بحتة دون تطبيق أي تعويض فعلي، وذلك عبر ضبط خيار التوليد NIMPUTE=0، كما هو موضح في الكود التالي:
proc mi data=my_data nimpute=0; var rebounds assists; run;
يولد هذا الإجراء جدولاً استثنائياً بعنوان “Missing Data Patterns” يوضح كافة التوافقات المحتملة للبيانات المتوفرة والمفقودة في المصفوفة. يُظهر التقرير عدد الملاحظات المطابقة لكل نمط، والمتوسطات الحسابية المقابلة لكل مجموعة فرعية، مما يتيح التمييز العلمي الفوري بين نمطين هيكليين بالغي الأهمية في الأدبيات الإحصائية:
- النمط الأحادي (Monotone Missingness Pattern): وهو النمط الذي إذا فُقدت فيه قيمة متغير معين لملاحظة ما، فإن جميع المتغيرات التالية لها زمنياً أو ترتيبياً تكون مفقودة بالضرورة (كما يحدث في حالات الانسحاب الدائم للمرضى من التجارب السريرية).
- النمط العشوائي أو التعسفي (Arbitrary Missingness Pattern): وهو النمط الذي تتوزع فيه الفجوات البيانية بصورة متفرقة ومتقطعة عبر المتغيرات والملاحظات دون ترتيب تسلسلي محدد.
يُعد هذا التمييز حجر الزاوية المنهجي لتحديد خوارزميات التعويض الرياضي اللاحقة؛ فالنمط الأحادي يتيح استخدام خوارزميات الانحدار المتسلسل التراجعي (Parametric Regression)، بينما يتطلب النمط العشوائي اللجوء إلى خوارزميات سلاسل ماركوف ومونتي كارلو (MCMC – Markov Chain Monte Carlo).
10.2 تصميم تقارير مخصصة للقيم المفقودة عبر PROC TABULATE
يُعتبر إجراء الجداول المتقاطعة PROC TABULATE الأداة المثلى في SAS لإنتاج جداول إحصائية متعددة الأبعاد تجمع بين المتغيرات الفئوية والكمية في عروض هرمية متناسقة وجاهزة مباشرة للطباعة والنشر الأكاديمي. يوفر هذا الإجراء دعماً كاملاً للإحصائية NMISS ضمن بيئة التنسيق المرئي المعقد للجداول.
يوضح الكود التالي كيفية بناء جدول تقرير متقاطع يعرض أعداد الملاحظات الصالحة والمفقودة والمتوسطات الحسابية لمتغيرات الأداء الرياضي موزعة بحسب الفرق والمراكز:
proc tabulate data=my_data format=8.1; class team pos; var rebounds assists; table (team all)*(pos all), (rebounds assists)*(N NMISS MEAN) / box="تحليل الفقدان حسب المجموعات"; run;
تُنتج هذه البنية التركيبية المتطورة جدولاً متقاطعاً احترافياً يعرض في صفوفه تفكيكاً تفصيلياً لكل فريق (A, B, C) مقسماً بحسب مراكز اللعب (G, F)، بالإضافة إلى هوامش الإجمالي الكلي (ALL). وتُعرض في الأعمدة إحصاءات N وNMISS وMEAN لكل متغير رقمي. يتيح هذا العرض الهرمي للقارئ رصد التفاعلات المعقدة للفقدان وتحديد ما إذا كان النقص يتركز في فئة محددة دون غيرها، مما يدعم الشفافية التحليلية في التقارير الإحصائية المتقدمة.
10.3 الربط بين حساب المفقودات وتحديد آليات الفقدان الإحصائية
لا يكتمل التحليل العلمي للقيم المفقودة بمجرد تعدادها وتوصيفها، بل يجب ربط هذه النتائج الإحصائية بالإطار النظري الراسخ لآليات الفقدان الذي وضعه العالم دونالد روبين (Donald Rubin, 1976). يُصنف هذا الإطار آليات الفقدان إلى ثلاثة مسارات رئيسية تحدد كيفية التعامل الرياضي مع البيانات:
1. الفقدان العشوائي تماماً (Missing Completely at Random – MCAR): يحدث عندما يكون احتمال فقدان القيمة مستقلاً تماماً عن المتغير نفسه وعن جميع المتغيرات الأخرى في مصفوفة البيانات. في هذه الحالة، تمثل الحالات المكتملة عينة عشوائية حقيقية من المجتمع، ولا يؤدي الحذف الكامل للحالات إلى انحياز في التقديرات بل يقتصر تأثيره على تقليل حجم العينة. يمكن اختبار هذه الفرضية إحصائياً في SAS باستخدام اختبار ليتل (Little’s MCAR Test).
2. الفقدان العشوائي المشروط (Missing at Random – MAR): يحدث عندما يعتمد احتمال الفقدان على متغيرات أخرى تمت ملاحظتها وتسجيلها في الجدول، لكنه لا يعتمد على القيمة المفقودة ذاتها. على سبيل المثال، إذا كان اللاعبون في الفريق B يميلون لعدم تسجيل إحصاءات المتابعات لأسباب توثيقية تخص الفريق، فإن الفقدان هنا مشروط بمتغير team. في ظل آلية MAR، تصبح خوارزميات التعويض المتعدد (Multiple Imputation) ونماذج الاحتمالية العظمى (Full Information Maximum Likelihood – FIML) ضرورة رياضية لإنتاج تقديرات غير منحازة.
3. الفقدان غير العشوائي (Missing Not at Random – MNAR): ويُعد الحالة الأكثر تعقيداً وخطورة؛ حيث يعتمد احتمال الفقدان على القيمة الحقيقية للمتغير المفقود نفسه. ومثاله أن يمتنع اللاعبون ذوو الأداء المنخفض في التمريرات الحاسمة عن تسجيل بياناتهم عمداً لضعف أرقامهم. في هذه البيئة، تفشل معظم خوارزميات التعويض التقليدية في إزالة الانحياز، ويتطلب الأمر تطبيق نماذج رياضية متقدمة مثل نماذج اختيار هيكلمان (Heckman Selection Models) ونماذج خلط الأنماط (Pattern-Mixture Models).
11. مقارنة منهجية شاملة بين مختلف طرق حساب القيم المفقودة في SAS
11.1 جدول مقارنة تفصيلي بين الأوامر البرمجية المتاحة
يوضح الجدول التحليلي التالي مقارنة شاملة وممنهجة بين كافة الطرق والإجراءات البرمجية التي تم استعراضها في هذا الدليل، مع تقييم كل طريقة بناءً على نطاق دعمها للأنواع البيانية، وسهولة تنفيذها، واستهلاكها لموارد النظام، ومدى ملاءمتها لقواعد البيانات الضخمة:
| الأداة / الإجراء البرمجي | دعم المتغيرات الرقمية | دعم المتغيرات النصية | سهولة التطبيق | كفاءة الأداء في البيانات الضخمة | أفضل استخدام تطبيقي |
|---|---|---|---|---|---|
| PROC MEANS (NMISS) | نعم (شامل) | لا (تجاهل تلقائي) | بسيط جداً | عالية جداً | الفحص الاستكشافي الأولي السريع للمقاييس الكمية المستمرة. |
| PROC SQL + NMISS / CMISS | نعم | نعم | متوسط | عالية | الاستعلامات المدمجة ضمن مسارات معالجة وتكامل البيانات. |
| PROC FREQ (MISSING) | نعم (للفئات المنفصلة) | نعم (شامل) | بسيط جداً | متوسطة | تحليل التوزيعات التكرارية والنسبية للمتغيرات الفئوية والنصية. |
| DATA Step + Arrays | نعم | نعم | متقدم | فائقة السرعة | حساب المفقودات على مستوى الصفوف والمصفوفات التي تضم آلاف المتغيرات. |
| SAS Macros | نعم | نعم | متقدم جداً | عالية جداً | بناء نظم تقارير جودة البيانات المؤتمتة القابلة لإعادة الاستخدام المؤسسي. |
| PROC MI (NIMPUTE=0) | نعم | نعم (عبر التحويل) | متقدم | متوسطة | تحليل ورسم خرائط الأنماط المتعددة للفقدان وتجهيز نماذج التعويض الإحصائي. |
| PROC TABULATE | نعم | نعم (كتصنيفات) | متوسط إلى متقدم | جيدة | تصميم جداول إحصائية هرمية متقاطعة مهيأة للنشر الأكاديمي المباشر. |
11.2 معايير اختيار الطريقة الأنسب حسب طبيعة المشروع
يعتمد الاختيار الاستراتيجي بين هذه الأدوات البرمجية المتنوعة على طبيعة المشروع التحليلي، وحجم قاعدة البيانات، والأهداف المنهجية للمؤسسة. إذا كان الباحث في مرحلة الفحص المبدئي السريع لقاعدة بيانات جديدة تتكون في الغالب من قياسات طبية أو مالية مستمرة، فإن PROC MEANS يُعد الخيار الأسرع والأكثر فاعلية لتكوين فكرة فورية عن حجم النقص دون كتابة أسطر برمجية معقدة.
أما عند العمل في بيئات هندسة البيانات (Data Engineering) وبناء خطوط أنابيب التحويل والتحميل (ETL Pipelines)، فإن الاعتماد على PROC SQL المدمج مع دالة CMISS() يوفر التوافق المثالي مع قواعد البيانات العلائقية ويسمح بدمج اختبارات جودة البيانات ضمن استعلامات الاستخراج والتحويل دون الحاجة لتشغيل إجراءات SAS المنفصلة.
وفي مشاريع التحليل الإحصائي الكبرى والدراسات الطولية (Longitudinal Studies) التي تتكرر فيها عمليات تدقيق البيانات دورياً مع وصول موجات جديدة من المسوح، يصبح بناء مكتبة ماكرو معيارية (Standardized Macro Suite) خياراً لا غنى عنه؛ حيث يضمن هذا التوجه استدامة العمل البرمجي، وتوحيد مخرجات التقارير الرقابية، وخفض التكلفة الزمنية لفرق التحليل الإحصائي إلى أدنى حد ممكن.
11.3 الأخطاء الشائعة أثناء حساب المفقودات وكيفية تجنبها
يقع العديد من المبرمجين ومحللي البيانات المبتدئين في مجموعة من الأخطاء المنطقية والبرمجية الشائعة أثناء حساب المفقودات في بيئة SAS. أول هذه الأخطاء هو الخلط بين “الصفر العددي” (0) و”القيمة المفقودة” (.)؛ فالصفر يمثل قراءة حقيقية وملاحظة مكتملة تعبر عن انعدام الظاهرة، بينما تمثل النقطة غياباً للمعلومة وجهلاً بقيمتها. إن تحويل النقاط المفقودة إلى أصفار تلقائياً دون سند منهجي يؤدي إلى خفض المتوسطات الحسابية وتشويه التباينات بصورة كارثية.
الخطأ الشائع الثاني يتمثل في إغفال تنظيف السلاسل النصية من الفراغات المتعددة والمحارف غير المرئية؛ حيث يفترض المبرمج أن الشرط pos = '' كافٍ لرصد كافة النصوص الفارغة، مما يتسبب في تفويت الحقول التي تحتوي على فراغات غير مرئية واعتبارها بيانات صالحة. يُعالج هذا الخطأ بالاعتماد الدائم على دالة MISSING() أو تنظيف النصوص بدالة STRIP() قبل التحقق.
الخطأ الثالث هو سوء تفسير المخرجات عند وجود قيم مفقودة خاصة (Special Missing Values مثل .A أو .R). يقوم البعض بكتابة شروط مقارنة مثل IF var > . THEN ... ظناً منهم أن هذا الشرط يستبعد كافة القيم المفقودة، متناسين أن القيم المفقودة الخاصة تُعتبر منطقياً أكبر من النقطة المفردة .، مما يؤدي إلى دخولها خطأً ضمن البيانات الصالحة. لتجنب هذا الانزلاق البرمجي، يجب دائماً استخدام دالة MISSING(var) التي تضمن رصد النقطة القياسية وكافة الرموز الخاصة من .A إلى .Z على حد سواء وبأمان تام.
12. الخاتمة والتوصيات العملية لإدارة البيانات المفقودة في SAS
12.1 ملخص الخطوات التنفيذية لحساب وتوثيق القيم المفقودة
يمثل التدقيق المنهجي للقيم المفقودة ركيزة النزاهة الأولى في أي دراسة إحصائية رصينة. لتطبيق ذلك بنجاح في بيئة SAS، تتلخص الدورة التنفيذية المثلى في الخطوات المتسلسلة التالية:
- الفحص الفوري عند الاستيراد: تشغيل إجراءات الاستكشاف السريع مثل
PROC MEANS NMISSوPROC FREQ / MISSINGفور استيراد البيانات للتأكد من عدم حدوث أخطاء قراءة أو إزاحة في بنية الجداول. - التدقيق الموجه لنوع البيانات: استخدام الدوال المخصصة لكل نوع بياني بدقة، مع تفضيل دالة
CMISS()عند التعامل مع مصفوفات مختلطة تحتوي على أرقام وسلاسل نصية معاً. - التوثيق المنهجي الشامل: إنشاء تقارير تدقيق وصفية توثق الأعداد المطلقة والنسب المئوية للفقدان لكل متغير ولكل مجموعة فرعية، وتضمين هذه الجداول في ملاحق المنهجية العلمية للمشروع لضمان الشفافية وقابلية التكرار (Reproducibility).
12.2 الخطوات اللاحقة بعد حساب وتحديد القيم المفقودة
بمجرد اكتمال مرحلة التعداد والتوصيف وتحديد أنماط الفقدان، ينتقل الباحث إلى اتخاذ القرارات الإحصائية المعالجة؛ فإذا كانت نسبة الفقدان ضئيلة جداً (أقل من 5%) وكان النمط يتبع آلية MCAR المثبتة، قد يكون الحذف الكامل للحالات (Listwise Deletion) مقبولاً عملياً مع إدراك آثاره على حجم العينة.
أما إذا تجاوزت نسب الفقدان الحدود الدنيا أو كانت تتبع آلية الفقدان العشوائي المشروط MAR، فإن الأدبيات الإحصائية الحديثة توصي بتجنب الحذف وتطبيق تقنيات التعويض الإحصائي المتقدمة (Imputation). يوفر SAS في هذا الإطار إجراء PROC MI لتوليد مصفوفات تعويض متعددة متطابقة تأخذ في الحسبان عدم اليقين المحيط بالقيمة المفقودة، يليه تشغيل النماذج الاستدلالية عبر الإجراءات المناسبة مثل PROC REG أو PROC GENMOD، ثم دمج وتلخيص النتائج النهائية عبر إجراء PROC MIANALYZE للحصول على تقديرات نقطية وفترات ثقة متوافقة مع الأصول الإحصائية الصارمة.
12.3 أفضل الممارسات للحفاظ على جودة ونزاهة البيانات الإحصائية
تقتضي الممارسة الإحصائية والمهنية المثلى محاصرة مشكلة البيانات المفقودة من منبعها قبل وصولها إلى مراحل التحليل البرمجي المعقد؛ ويتحقق ذلك من خلال وضع بروتوكولات صارمة لجمع وإدخال البيانات الميدانية، وتدريب فرق جمع البيانات، واستخدام استمارات الاستبيان الإلكترونية المقيدة بشروط التحقق الإلزامي لمنع إرسال السجلات غير المكتملة.
من الناحية البرمجية داخل SAS، يجب الالتزام بكتابة أكواد نظيفة وموثقة بالتعليقات (Comments)، واستخدام لغة الماكرو لتوحيد خوارزميات التدقيق وتجنب النسخ اليدوي للأكواد. كما يجب مراجعة سجل النظام (SAS Log) بدقة عقب كل خطوة تنفيذية للتأكد من عدم وجود رسائل تحذيرية تتعلق بالتحويلات الضمنية الخاطئة.
ختاماً، يمثل الإفصاح الكامل والشفاف عن حجم ونمط وطرق معالجة البيانات المفقودة التزاماً أخلاقياً وعلمياً أساسياً في النشر الأكاديمي والتحليل المؤسسي؛ إذ يضمن هذا الإفصاح إتاحة الفرصة للمجتمع العلمي وصناع القرار لتقييم قوة الأدلة الإحصائية وحدود الاستدلال المستخلص من البيانات بصورة موضوعية ونزيهة.
References
- Allison, P. D. (2012). Handling missing data by maximum likelihood. SAS Global Forum 2012 Proceedings, Paper 312-2012. SAS Institute Inc. https://support.sas.com/resources/papers/proceedings12/312-2012.pdf
- Enders, C. K. (2010). Applied missing data analysis. Guilford Press.
- 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
- Little, R. J. A., & Rubin, D. B. (2019). Statistical analysis with missing data (3rd ed.). John Wiley & Sons. https://doi.org/10.1002/9781119013563
- 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. (2020). SAS/STAT 15.2 user’s guide: The MI procedure. SAS Institute Inc. https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/procstat/procstat_mi_toc.htm
- SAS Institute Inc. (2020). SAS/STAT 15.2 user’s guide: The MIANALYZE procedure. SAS Institute Inc. https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/procstat/procstat_mianalyze_toc.htm
- SAS Institute Inc. (2021). Base SAS 9.4 procedures guide: Statistical procedures (5th ed.). SAS Institute Inc. https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/procstat/titlepage.htm
- Schafer, J. L. (1997). Analysis of incomplete multivariate data. Chapman and Hall/CRC. https://doi.org/10.1201/9781439821862
- van Buuren, S. (2018). Flexible imputation of missing data (2nd ed.). Chapman and Hall/CRC. https://doi.org/10.1201/9780429492259