كيفية حساب المتوسط المتحرك في SAS
يحتل تحليل السلاسل الزمنية (Time Series Analysis) مكانة مركزية في الإحصاء التطبيقي وعلوم البيانات، إذ يتيح للباحثين والمحللين فهم الأنماط الكامنة خلف التقلبات السطحية للبيانات ورصد الاتجاهات العامة المتغيرة مع مرور الوقت. من بين الأدوات الإحصائية الأكثر استخداماً وشيوعاً في هذا المجال، يبرز المتوسط المتحرك (Moving Average) كتقنية كلاسيكية لكنها فائقة الفاعلية في معالجة الإشارات الرقمية، وتنعيم البيانات، وفصل المكونات العشوائية أو ما يعرف بالضوضاء الإحصائية (White Noise) عن المسار العام (Underlying Trend). وتتضاعف أهمية هذه التقنية عند تطبيقها ضمن منظومات برمجية رائدة تتمتع بالدقة والموثوقية العالية في معالجة البيانات الضخمة، مثل نظام التحليل الإحصائي SAS (Statistical Analysis System).
تكمن قوة برنامج SAS في قدرته الفائقة على التعامل مع الحسابات المعقدة والمتسلسلة عبر حزم برمجية متخصصة صُممت لتلبي احتياجات الباحثين في مختلف الحقول العلمية، بدءاً من الاقتصاد والتمويل، وصولاً إلى القياس النفسي والعلوم السلوكية والطب الحيوي. ويتيح SAS أدوات متعددة لحساب وتطويع المتوسطات المتحركة، تتراوح بين الإجراءات الجاهزة فائقة الكفاءة مثل إجراء PROC EXPAND التابع لحزمة SAS/ETS، واستخدام خطوات معالجة البيانات اليدوية والمخصصة مثل DATA Step المقترنة بدوال الإزاحة المتسلسلة (LAG Functions)، فضلاً عن استعلامات لغة الاستعلام الهيكلية PROC SQL. يقدم هذا الدليل المرجعي الشامل تفصيلاً معمقاً لكيفية تطبيق وتطوير وحساب المتوسطات المتحركة بأنماطها كافة داخل بيئة SAS، مع التركيز على الأسس الرياضية، والاستراتيجيات البرمجية المتقدمة، وحل المشكلات التطبيقية المعقدة.
يهدف هذا المقال إلى تقديم مرجع أكاديمي وتطبيقي متكامل لا يكتفي بعرض الأكواد البرمجية فحسب، بل يغوص في العمق النظري والمنهجي لكل خيار برمجي، موضحاً الفروق الدقيقة بين النوافذ الزمنية المختلفة، وكيفية معالجة القيم المفقودة والحدود الطرفية، وتطبيق التحليلات على البيانات المجمعة والمقاطع الطولية. وسواء كنت باحثاً تسعى لتنعيم قياسات نفسية متكررة أو محللاً إحصائياً يستهدف استخراج الاتجاهات الاقتصادية والتنبؤ بها، فإن هذا الدليل سيزودك بالمعرفة التقنية والمنهجية الدقيقة لتطويع إمكانات SAS الإحصائية بأعلى درجات الكفاءة والموثوقية العلمية.
- 1. مقدمة نظرية ومفاهيمية حول المتوسط المتحرك وأهميته الإحصائية
- 2. البيئة البرمجية لنظام SAS وتحليل السلاسل الزمنية
- 3. استكشاف إجراء PROC EXPAND في SAS وأساسياته
- 4. إعداد وهيكلة البيانات قبل حساب المتوسط المتحرك
- 5. التطبيق العملي: حساب المتوسط المتحرك البسيط (SMA) لـ 3 فترات
- 6. تخصيص حجم النافذة الزمنية (Window Size) والتحكم في المعلمات
- 7. معالجة القيم المفقودة والحدود الطرفية في PROC EXPAND
- 8. حساب المتوسطات المتحركة المتقدمة: المرجحة والأسية في SAS
- 9. طرق بديلة: حساب المتوسط المتحرك باستخدام DATA Step ودوال LAG
- 10. حساب المتوسطات المتحركة للبيانات المجمعة (By-Group Processing)
- 11. التمثيل البصري للمتوسطات المتحركة باستخدام PROC SGPLOT
- 12. استكشاف الأخطاء الشائعة والتحقق من الجودة وأفضل الممارسات
- خاتمة شاملة
- References
1. مقدمة نظرية ومفاهيمية حول المتوسط المتحرك وأهميته الإحصائية
1.1 تعريف المتوسط المتحرك (Moving Average) في التحليل الإحصائي
يُعرَّف المتوسط المتحرك في الأدبيات الإحصائية بأنه تقنية رياضية متتابعة تُستخدم لإعادة حساب المعدل الحسابي لسلسلة من البيانات عبر فترات زمنية متعاقبة ومحددة سلفاً تُعرف باسم “النافذة الزمنية” (Time Window) أو فترة التنعيم (Smoothing Period). وخلافاً للمتوسط الحسابي العام للبيانات، والذي يختزل السلسلة الزمنية بأكملها في قيمة عددية واحدة ثابتة لا تتغير بتغير الزمن، فإن المتوسط المتحرك يُنتج سلسلة زمنية جديدة ديناميكية تتغير قيمها مع كل نقطة زمنية جديدة، مما يعكس السلوك الموضعي واللحظي للسلسلة الأصلية.
من الناحية الرياضية الصارمة، إذا كانت لدينا سلسلة زمنية مكونة من مشاهدات مرتبة ترتيباً زمنياً تصاعدياً: X1, X2, …, Xt، فإن المتوسط المتحرك البسيط ذو النافذة الزمنية ذات الطول n عند النقطة الزمنية t يُحسب وفق المعادلة التالية:
SMAt = (1 / n) × ∑i=0n-1 Xt-i = (Xt + Xt-1 + … + Xt-n+1) / n
تتجلى الوظيفة الجوهرية للمتوسط المتحرك في عملية تُعرف بـ “مرشح الترددات المنخفضة” (Low-pass Filter) في معالجة الإشارات، حيث يعمل على إخماد التموجات والتقلبات قصيرة الأجل ذات التردد العالي، والتي تنشأ عادة عن أخطاء القياس أو الصدفة العشوائية، في حين يسمح بمرور التغيرات طويلة الأجل ذات التردد المنخفض والتي تمثل الاتجاه العام الأساسي للظاهرة قيد الدراسة. وتؤدي هذه العملية إلى تقليل التباين الإجمالي للسلسلة بمقدار يتناسب طردياً مع حجم النافذة؛ إذ ينخفض تباين المتوسط المتحرك البسيط بمقدار 1/n مقارنة بتباين السلسلة الأصلية في حال استقلال المشاهدات وتوزيعها المتماثل.
يلعب تحديد حجم النافذة الزمنية n دوراً حاسماً في ضبط حساسية المؤشر الإحصائي؛ فكلما كانت قيمة n صغيرة (مثل n = 3)، كان المتوسط المتحرك عالي الحساسية والاستجابة للتغيرات اللحظية الحديثة، ولكنه يحتفظ بجزء غير قليل من الضوضاء العشوائية. وعلى العكس من ذلك، كلما كانت قيمة n كبيرة (مثل n = 20 أو أكثر)، زادت درجة التنعيم وانخفضت الضوضاء إلى حدودها الدنيا، ولكن على حساب حدوث “تأخر زمني” (Time Lag أو Phase Shift)، حيث يتأخر المنحنى المنعم في عكس نقاط الانعطاف والتحولات الهيكلية الحقيقية في السلسلة الزمنية الأصلية.
1.2 تطبيقات المتوسط المتحرك في البيانات النفسية والسلوكية
تمتد تطبيقات المتوسط المتحرك لتتجاوز الأسواق المالية والتحليلات الاقتصادية إلى العلوم الإنسانية والاجتماعية، لاسيما في القياس النفسي (Psychometrics) والأبحاث السلوكية المعاصرة. مع انتشار منهجيات التقييم اللحظي البيئي (Ecological Momentary Assessment – EMA) وجمع البيانات المكثفة طولياً عبر الأجهزة الذكية والمستشعرات القابلة للارتداء، أصبح الباحثون يواجهون سلاسل زمنية نفسية تتسم بالتذبذب الحاد على مدار الساعة أو اليوم الواحد، نتيجة تفاعلات الفرد اللحظية مع المحفزات البيئية العابرة.
يساعد تطبيق المتوسط المتحرك على تنعيم هذه التذبذبات اليومية لرصد التغيرات المزاجية الحقيقية والممتدة، مثل تتبع المسار الأسبوعي لأعراض الاكتئاب، أو مستويات القلق التراكمي، أو جودة النوم. على سبيل المثال، قد يُسجل المريض تقلبات حادة في مقياس الحالة المزاجية بسبب حدث يومي عارض كازدحام مروري، وهو ما يمثل تذبذباً عشوائياً قصير الأمد؛ يساعد المتوسط المتحرك على تنقية هذا المؤشر واستخراج الاتجاه الحقيقي للمسار العلاجي للمريض، مما يوفر للمعالجين النفسيين صورة دقيقة حول فعالية التدخلات العلاجية السلوكية والمعرفية.
علاوة على ذلك، يُعد المتوسط المتحرك أداة لا غنى عنها في الدراسات التتبعية الفردية (Single-Case Experimental Designs) والتحليلات الطولية للنمو، حيث يسهم في عزل التأثيرات الموسمية أو الدورية (مثل تغير مستويات النشاط السلوكي بين أيام عطلة نهاية الأسبوع وأيام العمل) عن الاتجاه العام للنمو أو التدهور السلوكي. ويتيح ذلك للباحثين في علم النفس الإكلينيكي وعلم النفس العصبي تقييم أثر التدخلات بأسلوب إحصائي موضوعي يحد من الانحياز الناتج عن التقييمات اللحظية المنفردة.
1.3 الأنماط المختلفة للمتوسطات المتحركة
لا يقتصر مفهوم المتوسط المتحرك على الصيغة البسيطة التقليدية، بل يمتد ليشمل عدة نماذج رياضية تتمايز في طريقة تخصيص الأوزان النسبية للمشاهدات ضمن النافذة الزمنية الواحدة. تتفرع هذه الأنماط إلى ثلاثة أشكال رئيسية تشكل الركائز الأساسية للتحليل الزمني:
- المتوسط المتحرك البسيط (Simple Moving Average – SMA): يعتمد هذا النموذج على مبدأ التساوي المطلق، حيث يمنح جميع المشاهدات الواقعة ضمن النافذة الزمنية n أوزاناً متكافئة تماماً تساوي 1/n. يتميز ببساطته الحسابية وسهولة تفسيره المنطقي، غير أن عيبه الأبرز يكمن في تأثره المتكافئ بالمشاهدات القديمة والحديثة، بالإضافة إلى ظاهرة “قفزة الخروج” (Drop-off Effect)، حيث يتغير المتوسط فجأة بمجرد خروج قيمة شاذة قديمة من حدود النافذة، حتى وإن لم يطرأ أي تغيير جديد على البيانات الحالية.
- المتوسط المتحرك المرجح (Weighted Moving Average – WMA): يتجاوز هذا النموذج عيب التساوي عبر تخصيص أوزان ترجيحية متباينة للمشاهدات، بحيث تحصل البيانات الأحدث زمنياً على أوزان أعلى مقارنة بالبيانات الأقدم. يتم حساب الوزن عادة بتسلسل خطي حسابي (مثلاً، إذا كانت n = 3، تأخذ المشاهدات الأوزان 1 و 2 و 3 على التوالي، ثم تُقسم النتيجة على مجموع الأوزان 1+2+3 = 6). يمنح هذا النمط استجابة أسرع للتحولات الحديثة ويقلل من التأخر الزمني الملحوظ في المتوسط البسيط.
- المتوسط المتحرك الأسي (Exponential Moving Average – EMA): يمثل أحد أكثر النماذج تطوراً، حيث تتناقص أوزان المشاهدات السابقة هندسياً (أسياً) مع الرجوع إلى الخلف في الزمن بدلاً من التناقص الخطي. ويعتمد على دالة اضمحلال أسي يتحكم بها معامل تنعيم يُعرف بـ α (Alpha)، حيث 0 < α ≤ 1. يتميز المتوسط الأسي بعدم استبعاده لأي مشاهدة تاريخية بالكامل؛ بل تظل كل المشاهدات السابقة مؤثرة بنسب تتضاءل مقتربة من الصفر، مما يجعله فائق الاستجابة للتغيرات الحالية ودقيقاً للغاية في النمذجة الاقتصادية والتنبؤ الرياضي السريع.

2. البيئة البرمجية لنظام SAS وتحليل السلاسل الزمنية
2.1 بنية برمجية SAS وقدراتها في المعالجة الإحصائية المتقدمة
يتميز نظام SAS ببنية معمارية فريدة تجعله المعيار الذهبي في المؤسسات الأكاديمية والمختبرات السريرية والمنظمات المالية الكبرى. تكمن هذه القوة في قدرته الفائقة على معالجة السجلات الضخمة (Big Data) دون استهلاك مفرط للذاكرة العشوائية (RAM)، وذلك بفضل آلية معالجة السجلات الفردية المتسلسلة (Record-by-Record Processing) في خطوة البيانات، والقدرة على التعامل مع مصفوفات البيانات الزمنية متعددة الأبعاد عبر محركات بيانات متطورة تدعم التحليل الموازي والحوسبة عالية الأداء.
في سياق تحليل السلاسل الزمنية، يوفر SAS حزمة متخصصة بالغة التطور تُعرف باسم SAS/ETS (Econometrics and Time Series). تتضمن هذه الحزمة ترسانة من الإجراءات المتخصصة مثل PROC ARIMA، وPROC AUTOREG، وPROC MODEL، بالإضافة إلى إجراء المعالجة والتوسيع الزمني الرائد PROC EXPAND. تتيح هذه الإجراءات للمحلل تطبيق تحويلات رياضية معقدة، واكتشاف الأنماط الموسمية، وضبط الترددات الزمنية، وحساب المتوسطات المتحركة والتنعيم التوافقي بكفاءة وسرعة استثنائيتين تتفوقان على البرمجة اليدوية التقليدية.
تتكامل البنية البرمجية لـ SAS عبر مستويين رئيسيين: الإجراءات الإحصائية الجاهزة (Procedures – PROCs) والخطوات البرمجية المخصصة (DATA Steps). يوفر استخدام الإجراءات الجاهزة كوداً مختصراً ومحسناً خوارزمياً للتعامل مع العمليات المعيارية مثل حساب المتوسطات المتحركة المرجحة والمركزية، بينما تتيح خطوة البيانات مرونة برمجية مطلقة تمكن المطور من تخصيص الشروط المنطقية، وبناء مصفوفات الذاكرة المؤقتة، وتطبيق خوارزميات مخصصة تتكيف مع الحالات الشاذة وغير النمطية في البيانات.
2.2 متطلبات إعداد بيئة العمل والمتغيرات الأساسية
قبل الشروع في كتابة أوامر حساب المتوسط المتحرك في SAS، يجب على الباحث التأكد من جاهزية بيئة العمل وتوافق المتغيرات الهيكلية مع المتطلبات الصارمة لتحليل السلاسل الزمنية. أولى هذه الخطوات تتمثل في التحقق من ترخيص وتثبيت وحدة SAS/ETS ضمن البيئة البرمجية عبر تنفيذ أمر الفحص التالي:
proc setinit;
run;
يُظهر تقرير المخرجات قائمة الحزم المرخصة؛ وفي حال عدم توفر SAS/ETS، لن يتمكن الباحث من استدعاء PROC EXPAND، وسيتعين عليه الاعتماد على خطوات DATA Step أو PROC SQL كبدائل برمجية أساسية كما سنوضح لاحقاً في هذا الدليل.
علاوة على ذلك، يتطلب التعامل مع السلاسل الزمنية في SAS فهماً دقيقاً لكيفية إدارة جداول العمل المؤقتة (Work Datasets) والجداول الدائمة (Permanent Datasets). تُحفظ البيانات افتراضياً في المكتبة المؤقتة WORK والتي تُفرغ تلقائياً بمجرد إغلاق جلسة العمل، بينما يُفضل في المشاريع البحثية الكبرى ربط السلاسل بمكتبة دائمة عبر أمر LIBNAME لضمان الحفاظ على السجلات ومخرجات التحليل التكراري.
من الناحية الهيكلية، يجب أن تتضمن مجموعة البيانات متغيرين أساسيين على الأقل: متغير كمي متصل يمثل القياس المراد تنعيمه (مثل درجة القلق أو سعر الإغلاق)، ومتغير زمني فريد يمثل الترتيب التاريخي الدقيق للمشاهدات. يتطلب SAS أن يكون المتغير الزمني معرفاً بصيغة رقمية مدعومة بتنسيقات التواريخ القياسية (SAS Date/Time Formats) مثل DATE9. أو DATETIME20. لضمان معالجة الفترات الزمنية وتجنب القراءات الخاطئة للتسلسل.
3. استكشاف إجراء PROC EXPAND في SAS وأساسياته
3.1 التعريف بإجراء PROC EXPAND والوظائف المركزية له
يُعد إجراء PROC EXPAND أحد أقوى وأدق الإجراءات الإحصائية المضمنة في مكتبة SAS/ETS، حيث صُمم أساساً للتعامل مع السلاسل الزمنية عبر ثلاثة محاور رئيسية: تحويل تردد السلاسل الزمنية (مثل تحويل البيانات من تردد شهري إلى أسبوعي عبر الاستيفاء الخطي أو التكعيبي، أو من يومي إلى شهري عبر التجميع)، واستكمال البيانات المفقودة باستخدام خوارزميات الاستيفاء الرياضي (Spline Interpolation)، وتطبيق التحويلات الزمنية المتتابعة (Transitional Transformations).
تكمن الميزة الاستثنائية لإجراء PROC EXPAND في توفيره لمحرك تحويلي متقدم يُعرف بـ TRANSFORMATION أو CONVERT، والذي يتيح حساب طيف واسع من الإحصاءات المتحركة (Moving Statistics) دون الحاجة لكتابة حلقات تكرارية (Loops) معقدة أو استخدام مصفوفات برمجية شاقة. يدعم الإجراء حساب المتوسطات المتحركة البسيطة، والمرجحة، والتراكمية، والانحرافات المعيارية المتحركة، والوسيط المتحرك، وقيم التغير التراكمي في خطوة تنفيذية واحدة تتسم بالكفاءة الحاسوبية العالية حتى مع ملايين السجلات.
كما يتفوق PROC EXPAND على بدائل البرمجة اليدوية في قدرته الآلية على إدارة فترات التهيئة الأولى للسلسلة (Lead-in Observations)، وحساب التنعيم المتمركز حول النقطة، والتعامل المنهجي مع الحالات الحدية، مما يقلل احتمالية وقوع الأخطاء المنطقية أو الحسابية التي قد تنتج عن الحسابات البرمجية اليدوية في خطوة البيانات.
3.2 البنية النحوية الأساسية (Syntax) لإجراء PROC EXPAND
تتميز البنية النحوية لإجراء PROC EXPAND بالوضوح والتركيز الرياضي، حيث تعتمد على تحديد جدول المدخلات والمخرجات، متبوعاً بتحديد طريقة المعالجة والتحويل المطلوب. تتخذ الصياغة المعيارية الأساسية الشكل التالي:
proc expand data=Input_Dataset out=Output_Dataset method=none;
id Time_Variable;
convert Target_Variable = Transformed_Variable / transout=(movave 3);
run;
عند تفكيك هذه الجملة البرمجية إلى عناصرها الوظيفية، نجد التالي:
DATA=وOUT=: تحدد جملةDATA=الجدول المصدر المراد تحليله، بينما تحددOUT=اسم جدول المخرجات الجديد الذي سيحتوي على المتغيرات الأصلية مضافاً إليها المتغيرات المنعمة والمشتقة حديثاً.METHOD=NONE: يُعد هذا الخيار أحد أهم المعلمات الحسابية في الإجراء؛ فالوضع الافتراضي لـPROC EXPANDهو تطبيق الاستيفاء التكعيبي (Cubic Spline) لملء الفراغات أو تعديل التردد الزمني. وعند تحديدMETHOD=NONE، فإننا نأمر النظام صراحة بتعطيل أي استيفاء أو استكمال رياضي آلي، والاكتفاء فقط بالقيم الحقيقية الموجودة في السلسلة وحساب التحويلات المطلوبة مباشرة عليها.- جملة
CONVERTومعاملTRANSOUT: تمثل جملةCONVERTالنواة التنفيذية للتحويل؛ حيث نحدد المتغير الأصلي المراد حسابه على يسار إشارة التساوي، واسم المتغير الجديد الناتج على يمينها. ويُستخدم خيار/ TRANSOUT=لتحديد نوع العملية الإحصائية المتحركة؛ حيث تشيرmovave nإلى حساب المتوسط المتحرك البسيط (Moving Average) بنافذة زمنية طولها n.
3.3 جملة المعرف ID وعلاقتها بترتيب السلسلة الزمنية
تلعب جملة ID دوراً محورياً لا غنى عنه داخل إجراء PROC EXPAND، إذ تحدد المتغير الزمني الذي يضبط الإحداثيات التاريخية والتسلسل الزمني الدقيق للبيانات. يقرأ الإجراء متغير الـ ID للتحقق من اتساق الفواصل الزمنية والتأكد من عدم وجود تضارب أو قفزات غير مبررة في تدفق الوقت.
يشترط SAS توفر مجموعة من المعايير الصارمة في متغير المعرف الزمني، من أبرزها:
- الترتيب التصاعدي الصارم: يجب أن تكون السلسلة مرتبة ترتيباً زمنياً تصاعدياً متواصلاً قبل استدعاء الإجراء، بحيث تكون المشاهدة t1 سابقة لـ t2 وهكذا. أي خلل في الترتيب سيؤدي إلى توقف التنفيذ وظهور رسالة خطأ صريحة في سجل النظام (SAS Log).
- فرادة القيم الزمنية: لا يسمح
PROC EXPANDبتكرار نفس القيمة الزمنية ضمن نفس السلسلة الواحدة (ما لم يتم استخدام معالجة المجموعاتBY)، نظراً لأن التحويلات تعتمد على تسلسل زمني أحادي البعد. - التوافق مع تنسيقات SAS الزمنية: يُفضل أن يكون المتغير الزمني معززاً بتنسيق قياسي يحدد الفاصل الزمني الدوري، مثل التنسيقات اليومية (
INTERVAL=DAY) أو الشهرية (INTERVAL=MONTH) أو السنوية، لتمكين الإجراء من التحقق الذاتي من انتظام السلسلة وكشف الفجوات الزمنية المفقودة بصورة آلية.
4. إعداد وهيكلة البيانات قبل حساب المتوسط المتحرك
4.1 إنشاء مجموعة البيانات الأولية باستخدام DATA Step
لتطبيق المفاهيم النظرية على بيئة عمل تطبيقية واقعية، سنقوم ببناء مجموعة بيانات تجريبية تحاكي قياساً سلوكياً ونفسياً متكرراً، يمثل رصد مستويات القلق أو الاستجابة السلوكية عبر 10 نقاط زمنية متعاقبة. نستخدم خطوة DATA Step مع كتلة إدخال البيانات المباشرة DATALINES لبناء هذا الجدول النموذجي:
/* إنشاء مجموعة بيانات تجريبية للتحليل الزمني */
data Work.Behavioral_Tracking;
input Time_Point Response_Score;
datalines;
1 7
2 12
3 14
4 18
5 15
6 20
7 19
8 24
9 22
10 26
;
run;
في هذا الجدول، يمثل المتغير Time_Point الترتيب الزمني للملاحظات السلوكية (من النقطة 1 إلى 10)، بينما يعبر المتغير Response_Score عن الدرجة الكمية المسجلة في كل جلسة قياس. بعد تشغيل هذا الكود، يقوم محرك SAS بإنشاء الجدول في الذاكرة المؤقتة WORK، ويقوم ببناء قاموس المتغيرات ومصفوفة السجلات.
للتحقق من سلامة البنية الهيكلية للجدول والتأكد من تحديد أنواع المتغيرات (عددية/رقمية) بشكل صحيح، يُنصح دائماً باستدعاء إجراء الفحص الهيكلي PROC CONTENTS:
proc contents data=Work.Behavioral_Tracking;
run;
يضمن هذا الإجراء التأكد من أن المتغير الزمني ومتغير القياس تم تعريفهما كمتغيرات عددية (Numeric)، وهو شرط إلزامي لإجراء العمليات الحسابية والتحويلات الإحصائية في خطوات التحليل اللاحقة.
4.2 التحقق من ترتيب البيانات وتنظيفها
تتطلب خوارزميات السلاسل الزمنية أن تكون البيانات خالية تماماً من العشوائية في الترتيب، حيث إن أي اضطراب في تسلسل السجلات سيؤدي إلى حساب متوسطات متحركة لقيم لا تنتمي لنفس النافذة الزمنية الحقيقية. لضمان هذا الترتيب الصارم، نستخدم إجراء الفرز القياسي PROC SORT:
/* ضمان الترتيب التصاعدي الصارم للبيانات */
proc sort data=Work.Behavioral_Tracking out=Work.Behavioral_Sorted;
by Time_Point;
run;
يؤدي هذا الإجراء وظيفتين أساسيتين: أولاً، إعادة ترتيب الصفوف وفقاً للمتغير الزمني Time_Point من الأصغر إلى الأكبر؛ وثانياً، كشف أي تكرارات غير مقصودة في قيم المتغير الزمني في حال تفعيل خيار NODUPKEY عند الحاجة لحذف التكرارات.
عقب إتمام الفرز، يُفضل طباعة السجلات إلى شاشة المخرجات باستخدام إجراء PROC PRINT لمعاينة البيانات بالعين المجردة والتأكد من اكتمال القيم وتناسقها قبل البدء في حساب المتوسط المتحرك:
proc print data=Work.Behavioral_Sorted noobs;
run;
يعرض هذا الأمر جدولاً منسقاً بالقيم العشر، خالياً من أرقام المشاهدات التلقائية بفضل الخيار noobs، مما يؤكد جاهزية مصفوفة البيانات للدخول في المعالجة الإحصائية عبر PROC EXPAND.
5. التطبيق العملي: حساب المتوسط المتحرك البسيط (SMA) لـ 3 فترات
5.1 كتابة وتنفيذ شفرة PROC EXPAND
نصل الآن إلى مرحلة التطبيق الإحصائي المباشر، حيث سنقوم بحساب المتوسط المتحرك البسيط لنافذة زمنية تتكون من 3 فترات (n = 3) للمتغير السلوكي Response_Score. سنقوم بإنشاء متغير جديد يحمل الاسم Score_SMA3 ونخزن النتيجة في جدول مخرجات جديد يحمل اسم Work.Behavioral_SMA_Results عبر الشفرة التالية:
/* حساب المتوسط المتحرك البسيط لـ 3 فترات */
proc expand data=Work.Behavioral_Sorted
out=Work.Behavioral_SMA_Results
method=none;
id Time_Point;
convert Response_Score = Score_SMA3 / transout=(movave 3);
run;
عند تنفيذ هذه الشفرة، يقوم محرك PROC EXPAND بقراءة البيانات المتسلسلة وفقاً للمعرف Time_Point. بفضل الأمر method=none، يتم تجاوز أي خوارزميات لملء الفراغات أو التقدير التكعيبي، وتنتقل السلسلة مباشرة إلى دالة التحويل transout=(movave 3)، والتي تقوم بتمرير نافذة منزلقة بطول 3 مشاهدات متتالية على طول السجل التاريخي، وحساب المتوسط الحسابي لكل موضع بصورة متتابعة.

5.2 التفسير الرياضي لمخرجات الجدول
لفهم الآلية الداخلية الدقيقة التي ينفذها SAS، يجب تتبع العمليات الحسابية خطوة بخطوة ومقارنتها بالحساب اليدوي، لاسيما في الفترات الأولى التي تُعرف بـ “فترة التهيئة” أو النوافذ الجزئية:
- النقطة الزمنية الأولى (t = 1): القيمة الأصلية هي 7. نظراً لعدم توفر مشاهدات سابقة، يتعامل SAS مع هذه النقطة كنافذة جزئية أحادية، فيكون المتوسط: 7 / 1 = 7.0000.
- النقطة الزمنية الثانية (t = 2): القيمة الحالية هي 12 والقيمة السابقة هي 7. تتكون النافذة الجزئية من نقطتين، ويُحسب المتوسط كالتالي: (7 + 12) / 2 = 19 / 2 = 9.5000.
- النقطة الزمنية الثالثة (t = 3): القيمة الحالية هي 14، وتكتمل هنا النافذة الزمنية الكاملة المحددة بـ 3 نقاط (7، 12، 14). يُحسب المتوسط الحسابي التام كالتالي:
(7 + 12 + 14) / 3 = 33 / 3 = 11.0000
- النقطة الزمنية الرابعة (t = 4): القيمة الحالية هي 18. تنزلق النافذة خطوة واحدة إلى الأمام؛ تخرج القيمة الأولى (7) من نطاق الحساب، وتدخل القيمة الجديدة (18) مع القيمتين السابقتين (12، 14). يُحسب المتوسط كالتالي:
(12 + 14 + 18) / 3 = 44 / 3 = 14.6667
- النقطة الزمنية الخامسة (t = 5): القيمة الحالية هي 15. تنزلق النافذة لتشمل القيم (14، 18، 15):
(14 + 18 + 15) / 3 = 47 / 3 = 15.6667
تستمر هذه الآلية الانزلاقية بدقة متناهية حتى نهاية السلسلة عند النقطة العاشرة، حيث يعكس كل رقم ناتج متوسط النقطة الحالية مضافاً إليها النقطتان السابقتان مباشرة، مما يضمن سلاسة المنحنى وتناغم التغيرات.
5.3 استعراض النتائج وتحليل الجدول النهائي
لعرض الجدول النهائي ومقارنة السلسلة الخام الأصلية بالسلسلة المنعمة، نقوم بتنفيذ إجراء PROC PRINT مع إضافة جملة تنسيق FORMAT لضبط المنازل العشرية وتسهيل القراءة والمقارنة:
/* طباعة النتائج النهائية بتنسيق رقمي منضبط */
proc print data=Work.Behavioral_SMA_Results noobs;
var Time_Point Response_Score Score_SMA3;
format Score_SMA3 8.2;
run;
تظهر المخرجات في شاشة تقارير SAS وفق الهيكل الإحصائي الموضح في الجدول التالي:
| النقطة الزمنية (Time_Point) | الدرجة الأصلية (Response_Score) | المتوسط المتحرك لـ 3 فترات (Score_SMA3) | طبيعة الحساب والنافذة |
|---|---|---|---|
| 1 | 7 | 7.00 | نافذة جزئية (نقطة واحدة) |
| 2 | 12 | 9.50 | نافذة جزئية (نقطتان) |
| 3 | 14 | 11.00 | نافذة تامة (3 نقاط: 7+12+14) |
| 4 | 18 | 14.67 | نافذة تامة (3 نقاط: 12+14+18) |
| 5 | 15 | 15.67 | نافذة تامة (3 نقاط: 14+18+15) |
| 6 | 20 | 17.67 | نافذة تامة (3 نقاط: 18+15+20) |
| 7 | 19 | 18.00 | نافذة تامة (3 نقاط: 15+20+19) |
| 8 | 24 | 21.00 | نافذة تامة (3 نقاط: 20+19+24) |
| 9 | 22 | 21.67 | نافذة تامة (3 نقاط: 19+24+22) |
| 10 | 26 | 24.00 | نافذة تامة (3 نقاط: 24+22+26) |
يوضح التحليل الإحصائي المقارن للجدول كيف نجح المتوسط المتحرك في إزالة “الحدب والتذبذبات اللحظية”؛ فعلى سبيل المثال، عند الانتقال من النقطة 4 (القيمة 18) إلى النقطة 5 (القيمة 15)، هبطت الدرجة الأصلية بمقدار 3 درجات كاملة، ولكن المتوسط المتحرك واصل مساره الصاعد التدريجي (من 14.67 إلى 15.67)، عاكساً المسار العام التصاعدي للسلسلة الإجمالية دون التأثر بالانخفاض العارض المؤقت.
6. تخصيص حجم النافذة الزمنية (Window Size) والتحكم في المعلمات
6.1 تأثير اختيار طول الفترة (n) على تشخيص السلسلة الزمنية
يُمثل اختيار طول النافذة الزمنية n المعضلة المنهجية الأساسية في تحليل التنعيم الزمني؛ إذ يفرض هذا الاختيار موازنة حتمية بين دقة التنعيم الإحصائي وسرعة استجابة المؤشر للتحولات الحقيقية، وهو ما يُعرف في الأدبيات الإحصائية بـ “مفاضلة التحيز والتباين” (Bias-Variance Tradeoff).
عند اختيار نافذة زمنية قصيرة (مثل n = 2 أو n = 3)، يكون المتوسط المتحرك قليل التحيز وشديد الاقتراب من المشاهدات الفعلية، مما يجعله قادراً على التقاط نقاط التحول السلوكية أو الاتجاهات اللحظية بدقة وسرعة عاليتين. ومع ذلك، يؤدي قصر النافذة إلى بقاء جزء كبير من التباين العشوائي والضوضاء، مما قد يضلل الباحث ويوحي بوجود تغيرات جوهرية هي في الحقيقة مجرد تذبذبات عشوائية.
في المقابل، يؤدي اختيار نافذة زمنية طويلة (مثل n = 7 أو n = 10 أو أكثر) إلى تنعيم فائق للمنحنى وإلغاء تام للضوضاء العشوائية، مما يبرز الاتجاه الهيكلي طويل الأجل بوضوح استثنائي. ولكن العيب الجوهري هنا يتمثل في حدوث “تأخر زمني مفرط” (Lag Phase)؛ حيث يتأخر المنحنى المنعم بعدة فترات زمنية عن رصد الانعطافات الحقيقية في المسار، فضلاً عن فقدان المعلومات التفصيلية حول التغيرات الدورية قصيرة الأجل وتسطيح القمم والقيعان الحقيقية في البيانات.
6.2 حساب متوسطات متحركة متعددة في خطوة واحدة
تتمثل إحدى أقوى مزايا إجراء PROC EXPAND في إمكانية توليد عدة متوسطات متحركة بنوافذ زمنية مختلفة ضمن نفس الخطوة التنفيذية الواحدة، مما يوفر على الباحث تكرار الأكواد ويتيح المقارنة المباشرة بين مستويات التنعيم المختلفة. يمكن صياغة ذلك عبر تضمين عدة جمل CONVERT متتابعة كما يلي:
/* حساب متوسطات متحركة متعددة بنوافذ 3 و 5 و 7 فترات */
proc expand data=Work.Behavioral_Sorted
out=Work.Behavioral_Multi_MA
method=none;
id Time_Point;
convert Response_Score = SMA_3 / transout=(movave 3);
convert Response_Score = SMA_5 / transout=(movave 5);
convert Response_Score = SMA_7 / transout=(movave 7);
run;
تُنتج هذه الشفرة جدول بيانات يحتوي على ثلاثة متغيرات جديدة (SMA_3 و SMA_5 و SMA_7). يتبع هذا الأسلوب المنهجي المعتمد في التحليل الفني والإحصائي لمراقبة “تقاطعات المتوسطات المتحركة” (Moving Average Crossovers)؛ فعندما يتقاطع المتوسط السريع (SMA_3) صعوداً مع المتوسط البطيء (SMA_7)، يُعد ذلك مؤشراً إحصائياً قوياً على حدوث تحول إيجابي وتسارع هيكلي صاعد في مسار الظاهرة المدروسة.
7. معالجة القيم المفقودة والحدود الطرفية في PROC EXPAND
7.1 إدارة القيم المفقودة (Missing Values) أثناء التنعيم
تُمثل البيانات المفقودة (Missing Data) تحدياً شائعاً في السلاسل الزمنية، لاسيما في الدراسات الطولية والعلوم النفسية حيث يتغيب بعض المشاركين عن تسجيل الاستجابات في جلسات معينة. يتعامل إجراء PROC EXPAND مع القيم المفقودة (الممثلة برمز النقطة . في SAS) بمرونة فائقة تعتمد على المعلمات المحددة مسبقاً.
عند تحديد METHOD=NONE مع دالة movave، يتعامل SAS مع النافذة الحسابية التي تحتوي على قيمة مفقودة عبر استبعاد تلك القيمة من حساب المتوسط وتقليص المقام الحسابي (Denominator) بعدد القيم الفعلية المتاحة ضمن تلك النافذة. على سبيل المثال، إذا كانت النافذة المحددة بطول 3 نقاط تحتوي على القيم (10، . ، 14)، فإن المتوسط المحسوب سيكون (10 + 14) / 2 = 12 بدلاً من توليد قيمة مفقودة، مما يحافظ على استمرارية المنحنى دون انقطاع، ما لم تكن جميع قيم النافذة مفقودة بالكامل.
إذا رغب الباحث في تطبيق استراتيجية مغايرة، مثل ملء واستكمال القيم المفقودة أولاً قبل حساب المتوسط المتحرك، يمكنه تغيير خيار المعالجة إلى الاستيفاء الخطي METHOD=JOIN أو الاستيفاء التكعيبي METHOD=SPLINE، مما يجعل الإجراء يقوم بتقدير القيمة المفقودة رياضياً بناءً على النقاط المجاورة ثم إدخالها في حسابات المتوسط المتحرك اللاحقة.
7.2 معالجة المشكلات الطرفية (Endpoint / Lead-in Effects)
تُعرف المشكلات الطرفية (Boundary Effects) بأنها التشوهات أو الصعوبات الحسابية التي تنشأ عند بدايات ونهايات السلسلة الزمنية نتيجة عدم اكتمال النافذة الحسابية المنزلقة. في حالة المتوسط المتحرك البسيط ذو النافذة n، لا تتوفر المشاهدات السابقة الكافية لأول n-1 مشاهدات في بداية السلسلة.
يتبنى إجراء PROC EXPAND افتراضياً نهج “النوافذ الجزئية المتوسعة” (Partial Expanding Windows) في بدايات السلسلة؛ حيث يقوم بحساب المتوسط للنقطة الأولى بناءً على قيمتها المفردة، وللنقطة الثانية بناءً على النقطتين المتاحتين، وهكذا حتى نصل إلى النقطة n حيث تكتمل النافذة الحسابية. يتميز هذا النهج بالحفاظ على نفس حجم العينة ومنع فقدان أي صفوف من مجموعة البيانات الأصلية.
ومع ذلك، يجب على الباحث إدراك أن التباين الإحصائي للمتوسطات المحسوبة في أول n-1 مشاهدات يكون أعلى من تباين باقي المشاهدات المستقرة، نظراً لأنها محسوبة على عدد نقاط أقل. وفي الدراسات الإحصائية الصارمة التي تتطلب ثبات التباين عبر كامل السلسلة، يمكن للباحث تصفية هذه الفترات الأولى أو استبعادها من التحليلات الاستدلالية اللاحقة لضمان دقة الاستنتاجات العلمية.
8. حساب المتوسطات المتحركة المتقدمة: المرجحة والأسية في SAS
8.1 حساب المتوسط المتحرك المرجح (WMA) في PROC EXPAND
يتيح إجراء PROC EXPAND إمكانية تطبيق المتوسط المتحرك المرجح بدقة بالغة عبر استخدام الدالة المتقدمة movwgt ضمن خيار transout. تتيح هذه الدالة للمستخدم تحديد مصفوفة أوزان عددية دقيقة تُخصص لكل موضع داخل النافذة المنزلقة، مما يمنح مرونة مطلقة في تفضيل المشاهدات الحديثة على المشاهدات الأقدم.
تتم صياغة كود المتوسط المرجح لنافذة مكونة من 3 نقاط بأوزان ترجيحية تصاعدية (1، 2، 3) وفق الشكل التالي:
/* حساب المتوسط المتحرك المرجح بأوزان 1، 2، 3 */
proc expand data=Work.Behavioral_Sorted
out=Work.Behavioral_WMA
method=none;
id Time_Point;
convert Response_Score = Score_WMA3 / transout=(movwgt 1 2 3);
run;
من الناحية الحسابية، عندما يصل الإجراء إلى النقطة الزمنية t، فإنه يضرب المشاهدة Xt-2 في الوزن 1، والمشاهدة Xt-1 في الوزن 2، والمشاهدة الحالية Xt في الوزن 3، ثم يقسم المجموع على إجمالي الأوزان (1 + 2 + 3 = 6) وفق المعادلة:
WMAt = (1 × Xt-2 + 2 × Xt-1 + 3 × Xt) / 6
يقلل هذا النمط المرجح من ظاهرة التأخر الزمني بشكل ملحوظ مقارنة بالمتوسط البسيط، مما يجعله الخيار الأمثل للباحثين الراغبين في تنعيم البيانات مع الحفاظ على سرعة رصد التغيرات السلوكية أو الحيوية المفاجئة.
8.2 حساب المتوسط المتحرك الأسي (EMA) والتنعيم الأسي
يُعد التنعيم الأسي (Exponential Smoothing) الخوارزمية الأكثر انتشاراً في التنبؤ الرياضي قصير الأجل. بخلاف المتوسطات المحدودة بنافذة ثابتة، يقوم المتوسط الأسي بتحديث القيمة المنعمة السابقة بإضافة جزء نسبي من خطأ التنبؤ الحالي، وفق المعادلة التكرارية:
EMAt = α × Xt + (1 – α) × EMAt-1
حيث يمثل α (معامل التنعيم – Smoothing Constant) وزناً يقع بين 0 و 1. كلما اقتربت قيمة α من 1، زاد وزن المشاهدة الحالية وزادت استجابة المؤشر للتغيرات اللحظية، وكلما اقتربت من 0، زاد وزن السجل التاريخي السابق وازدادت درجة التنعيم.
في SAS، يمكن تطبيق المتوسط المتحرك الأسي عبر إجراء PROC EXPAND باستخدام دالة ewma وتحديد قيمة معامل التنعيم مباشرة كمعلمة حسابية:
/* حساب المتوسط المتحرك الأسي بمعامل تنعيم ألفا = 0.3 */
proc expand data=Work.Behavioral_Sorted
out=Work.Behavioral_EMA
method=none;
id Time_Point;
convert Response_Score = Score_EMA / transout=(ewma 0.3);
run;
تضمن هذه الصياغة الأنيقة توليد منحنى تنعيمي مستمر يتفادى مشاكل قفزات الخروج، ويمنح الباحثين في القياس النفسي والسلوكي أداة مستقرة رياضياً لنمذجة التحولات المزاجية والسلوكية التدريجية عبر الزمن.
8.3 المتوسطات المتحركة المركزية (Centered Moving Averages)
في حين تعتمد المتوسطات المتحركة السابقة على النوافذ الرجعية (Backward-Looking) التي تستند إلى الماضي والحاضر فقط لتمكين التنبؤ اللحظي، فإن التحليل التاريخي الاسترجاعي (Retrospective Analysis) وفصل المكونات الموسمية يستلزمان استخدام المتوسط المتحرك المتمركز (Centered Moving Average).
يحسب المتوسط المتمركز المعدل الحسابي لنقاط متناظرة تقع قبل النقطة الحالية وبعدها بالتساوي. على سبيل المثال، في نافذة مركزية طولها 3 فترات (n = 3)، يُحسب متوسط النقطة t بالمعادلة:
CMAt = (Xt-1 + Xt + Xt+1) / 3
تتمثل الميزة الرياضية للمتوسط المتمركز في انعدام التأخر الزمني (Zero Phase Shift) تماماً؛ فالمنحنى المنعم يتطابق زمنياً وبدقة متناهية مع قمم وقيعان السلسلة الأصلية دون أي زحزحة لليمين أو اليسار. في SAS، يمكن تطبيق ذلك بسهولة بإضافة الكلمة المفتاحية CENTER إلى معامل التحويل:
/* حساب المتوسط المتحرك المتمركز لـ 3 فترات */
proc expand data=Work.Behavioral_Sorted
out=Work.Behavioral_CMA
method=none;
id Time_Point;
convert Response_Score = Score_CMA3 / transout=(movave 3 center);
run;
يجدر بالذكر أن المتوسط المتمركز، رغم دقته التناظرية الفائقة، لا يمكن استخدامه في التنبؤ اللحظي بالزمن الحقيقي (Real-Time Forecasting)، نظراً لاعتماده على مشاهدات مستقبلية لم تقع بعد عند النقطة الحالية.
9. طرق بديلة: حساب المتوسط المتحرك باستخدام DATA Step ودوال LAG
9.1 بناء خوارزمية المتوسط المتحرك عبر دالة LAG في DATA Step
في بعض البيئات البرمجية التي تفتقر لترخيص حزمة SAS/ETS المتخصصة، أو عند الحاجة لتطبيق شروط منطقية بالغة التعقيد أثناء القراءة، يمثل استخدام خطوة البيانات (DATA Step) مع دوال الإزاحة المتسلسلة (LAG Functions) البديل البرمجي الأكثر قوة ومرونة في بيئة SAS Base القياسية.
تقوم دالة LAG1(X) بإرجاع قيمة المتغير X من الصف السابق مباشرة، بينما ترجع LAG2(X) قيمته من الصفين السابقين، وهكذا. لحساب متوسط متحرك لـ 3 فترات، يمكننا كتابة الكود البرمجي الشامل التالي مع ضبط فترات البداية باستخدام متغير العداد التلقائي _N_ والدالة الإحصائية MEAN:
/* حساب المتوسط المتحرك يدوياً باستخدام DATA Step ودالة LAG */
data Work.Behavioral_Lag_MA;
set Work.Behavioral_Sorted;
/* جلب المشاهدات السابقة */
Lag1_Score = lag1(Response_Score);
Lag2_Score = lag2(Response_Score);
/* حساب المتوسط المتحرك مع معالجة النوافذ الجزئية الأولى */
if _N_ = 1 then Score_SMA3_Manual = Response_Score;
else if _N_ = 2 then Score_SMA3_Manual = mean(Response_Score, Lag1_Score);
else Score_SMA3_Manual = mean(Response_Score, Lag1_Score, Lag2_Score);
/* تنسيق المتغير الناتج وإسقاط متغيرات الإزاحة المؤقتة */
format Score_SMA3_Manual 8.2;
drop Lag1_Score Lag2_Score;
run;
تعتمد هذه الخوارزمية على حقيقة أن دالة MEAN في SAS تتجاهل القيم المفقودة تلقائياً وتحسب المتوسط بناءً على عدد القيم الرقمية الفعلية المتوفرة في القائمة، مما يحاكي بدقة السلوك الرياضي لـ PROC EXPAND في معالجة النوافذ الجزئية والبيانات المفقودة.
9.2 المقارنة المنهجية بين PROC EXPAND وخطوة DATA Step
للاختيار الواعي بين استخدام الإجراء الجاهز PROC EXPAND وكتابة الشيفرة المخصصة عبر DATA Step، يوضح الجدول المقارن التالي أبرز الفروق الجوهرية والتشغيلية بين الطريقتين:
| وجه المقارنة | إجراء PROC EXPAND | خطوة DATA Step ودوال LAG |
|---|---|---|
| المتطلبات والترخيص | يتطلب ترخيص حزمة SAS/ETS | يعمل على أي بيئة SAS Base قياسية |
| حجم وسهولة الكود | كود فائق الاختصار والوضوح | يتطلب كتابة أسطر شرطية وإدارية متعددة |
| المرونة المنطقية | مقيدة بالدوال الإحصائية المدمجة بالإجراء | مرونة غير محدودة لتضمين شروط مخصصة |
| المتوسطات المتمركزة (CMA) | مدمجة ومدعومة بكلمة مفتاحية واحدة (CENTER) | معقدة برمجياً وتتطلب قراءة مستقبلية (LEAD) |
| الكفاءة مع البيانات الضخمة | محسن خوارزمياً وموجه للمصفوفات الكبرى | يعتمد على كفاءة كتابة المبرمج وإدارة الذاكرة |
يخلص هذا التحليل إلى أن PROC EXPAND هو الخيار المفضل دائماً للمشاريع التحليلية القياسية لسرعته وموثوقيته الاستثنائية، في حين يظل DATA Step السلاح الأقوى في يد الإحصائي عند بناء نماذج مخصصة تتطلب تفريعاً شرطياً معقداً.
10. حساب المتوسطات المتحركة للبيانات المجمعة (By-Group Processing)
10.1 تطبيق المتوسط المتحرك عبر مجموعات فرعية (BY Statement)
في معظم التطبيقات السريرية والتجريبية، لا تقتصر البيانات على سلسلة زمنية لفرد واحد أو متغير تجريبي واحد، بل تمتد لتشمل مئات أو آلاف المشاركين عبر تصميم المقاطع الطولية المتكررة (Panel Data / Longitudinal Data). في هذه الحالات، يجب حساب المتوسط المتحرك لكل مشارك بشكل منعزل ومستقل تماماً، لمنع تداخل أواخر مشاهدات المشارك الأول مع بدايات مشاهدات المشارك الثاني.
يدعم إجراء PROC EXPAND هذه الهيكلية بسلاسة فائقة عبر جملة BY. لضمان التنفيذ الصحيح، يجب أولاً فرز البيانات وفقاً للمتغير التجميعي (مثل Subject_ID) يليه المتغير الزمني، ثم استدعاء الإجراء كما في المثال التالي:
/* فرز البيانات الطولية لعدة مشاركين */
proc sort data=Work.Multi_Subject_Data out=Work.Multi_Subject_Sorted;
by Subject_ID Time_Point;
run;
/* حساب المتوسط المتحرك لكل مشارك على حدة */
proc expand data=Work.Multi_Subject_Sorted
out=Work.Multi_Subject_SMA
method=none;
by Subject_ID;
id Time_Point;
convert Score = Score_SMA3 / transout=(movave 3);
run;
عند تضمين جملة by Subject_ID;، يقوم محرك SAS بإعادة تصفير النافذة الحسابية وتعيين فترات التهيئة تلقائياً مع بداية سجلات كل مشارك جديد، مما يضمن الاستقلال التام والدقة الإحصائية المطلقة لكل وحدة تجريبية على حدة.
10.2 حساب المتوسطات المتحركة للمجموعات باستخدام PROC SQL
تمثل لغة الاستعلام الهيكلية المدمجة في SAS عبر إجراء PROC SQL منهجية برمجية متقدمة بديلة، تحظى بشعبية واسعة بين مهندسي البيانات ومحللي قواعد البيانات المعتادين على معايير ANSI SQL. يمكن حساب المتوسط المتحرك المنزلق عبر تقنية “الربط الذاتي الشرطي” (Conditional Self-Join) بين نسختين من نفس الجدول:
/* حساب المتوسط المتحرك لـ 3 فترات باستخدام PROC SQL */
proc sql;
create table Work.SQL_Moving_Averages as
select
a.Subject_ID,
a.Time_Point,
a.Score,
avg(b.Score) as Score_SMA3 format=8.2
from
Work.Multi_Subject_Sorted as a
left join
Work.Multi_Subject_Sorted as b
on
a.Subject_ID = b.Subject_ID and
b.Time_Point between (a.Time_Point – 2) and a.Time_Point
group by
a.Subject_ID,
a.Time_Point,
a.Score
order by
a.Subject_ID,
a.Time_Point;
quit;
تقوم هذه الشيفرة بربط كل سجل في الجدول (a) بالسجلات السابقة له في الجدول (b) التي تقع ضمن الفاصل الزمني من (t – 2) إلى t، ثم تطبق دالة التجميع avg() لحساب المتوسط. تتميز هذه الطريقة بمرونتها وقدرتها على التعامل مع الفجوات الزمنية غير المنتظمة، غير أنها تتطلب استهلاكاً أعلى لموارد المعالجة (CPU) مقارنة بـ PROC EXPAND عند التعامل مع الجداول التي تضم ملايين السجلات.
11. التمثيل البصري للمتوسطات المتحركة باستخدام PROC SGPLOT
11.1 رسم السلسلة الأصلية مع خط المتوسط المتحرك المنعم
يُعد التمثيل البصري (Data Visualization) الركيزة الأساسية لتفسير نتائج التنعيم الزمني وتوضيح أثر المتوسط المتحرك في إبراز الاتجاه العام للبيانات. يوفر إجراء الرسوم الإحصائية المتقدم PROC SGPLOT في SAS إمكانات بيانية متطورة لإنتاج مخططات عالية الجودة جاهزة للنشر العلمي.
يمكننا تركيب السلسلة الأصلية الخام مع منحنى المتوسط المتحرك المنعم لـ 3 فترات في رسم بياني موحد واحترافي باستخدام الشفرة التالية:
/* رسم السلسلة الأصلية مع المتوسط المتحرك */
proc sgplot data=Work.Behavioral_SMA_Results;
title “مسار القياس السلوكي مع المتوسط المتحرك لـ 3 فترات”;
/* رسم البيانات الأصلية كخط متقطع مع نقاط دائرية */
series x=Time_Point y=Response_Score /
lineattrs=(pattern=dash color=cx7f8c8d thickness=1.5)
markers markerattrs=(symbol=circlefilled color=cx34495e size=7)
legendlabel=”الدرجة الأصلية (الخام)”;
/* رسم المتوسط المتحرك كخط متصل بارز */
series x=Time_Point y=Score_SMA3 /
lineattrs=(pattern=solid color=cxe74c3c thickness=2.5)
legendlabel=”المتوسط المتحرك (SMA 3)”;
/* تحسين المحاور وإضافة شبكة القياس */
xaxis label=”النقطة الزمنية (الجلسات المتعاقبة)” grid values=(1 to 10 by 1);
yaxis label=”درجة الاستجابة السلوكية” grid;
run;
يُبرز هذا المخطط التباين البصري الواضح بين تذبذب النقاط الخام والمسار الانسيابي المتصل للمتوسط المتحرك، مما يسهل على متخذ القرار أو الباحث استيعاب المسار العام للسلوك دون التشتت بالتقلبات اليومية اللحظية.

11.2 رسم مقارن لمستويات تنعيم متعددة
لتوضيح أثر توسيع النافذة الزمنية بصرياً، يمكن كتابة كود بياني متقدم يدمج عدة منحنيات تنعيم (مثل SMA3 و SMA5 و SMA7) في لوحة مقارنة واحدة، مع تخصيص الألوان وسمك الخطوط لضمان الوضوح التام:
/* رسم مقارن لعدة نوافذ تنعيم زمنية مختلفة */
proc sgplot data=Work.Behavioral_Multi_MA;
title “مقارنة مستويات التنعيم الزمني بنوافذ مختلفة (3 و 5 و 7 فترات)”;
series x=Time_Point y=Response_Score /
lineattrs=(color=cxb2bec3 pattern=shortdash thickness=1)
markers markerattrs=(symbol=circle color=cx636e72)
legendlabel=”البيانات الأصلية”;
series x=Time_Point y=SMA_3 /
lineattrs=(color=cx0984e3 thickness=2)
legendlabel=”نافذة قصيرة (SMA 3)”;
series x=Time_Point y=SMA_5 /
lineattrs=(color=cx00b894 thickness=2)
legendlabel=”نافذة متوسطة (SMA 5)”;
series x=Time_Point y=SMA_7 /
lineattrs=(color=cxd63031 thickness=2.5)
legendlabel=”نافذة طويلة (SMA 7)”;
xaxis label=”الجدول الزمني للقياس” grid values=(1 to 10 by 1);
yaxis label=”الاستجابة المحسوبة” grid;
keylegend / position=bottom across=2;
run;
يكشف هذا الرسم المقارن بوضوح التدرج في سلوك المنحنيات؛ حيث يظهر منحنى SMA_3 قريباً ومستجيباً للبيانات الأصلية، في حين يظهر منحنى SMA_7 كخط أكثر استقامة ونعومة يعكس الاتجاه العام الاستراتيجي، موضحاً بدقة مفهوم التأخر الزمني وزيادة التنعيم.
12. استكشاف الأخطاء الشائعة والتحقق من الجودة وأفضل الممارسات
12.1 تحليل وتصحيح الأخطاء البرمجية الشائعة في SAS
أثناء كتابة وتنفيذ أوامر حساب المتوسطات المتحركة في SAS، قد يواجه الباحثون والمحللون مجموعة من الأخطاء والتحذيرات الشائعة في سجل النظام (SAS Log). يستعرض التحليل التالي أبرز هذه المشكلات وحلولها الجذرية:
- خطأ غياب الحزمة الإحصائية (
ERROR: Procedure EXPAND not found):
السبب: عدم توفر ترخيص وحدة SAS/ETS في بيئة العمل الحالية.
الحل المنهجي: التحقق عبرPROC SETINIT، وفي حال عدم توفر الترخيص، يجب الانتقال فوراً إلى الحلول البديلة المعتمدة علىDATA StepودوالLAGأو استعلاماتPROC SQLكما فُصّل في الأقسام السابقة. - خطأ ترتيب السلسلة (
ERROR: The data set is not sorted in ascending order):
السبب: تمرير مجموعة بيانات غير مرتبة أو مرتبة تنازلياً إلى إجراءPROC EXPANDمع جملةID.
الحل المنهجي: تشغيل إجراءPROC SORTبصورة إلزامية مسبقة لفرز البيانات تصاعدياً وفقاً للمتغير الزمني ومتغير المجموعاتBYإن وجد. - تحذير الفواصل الزمنية غير المنتظمة (
WARNING: The observations are not equally spaced):
السبب: وجود فجوات زمنية أو قفزات غير متساوية بين التواريخ في متغير المعرف الزمني.
الحل المنهجي: إذا كان الهدف هو التنعيم الحسابي المباشر للسجلات كما هي، يكفي التأكد من تضمين خيارMETHOD=NONEلتجاهل رسائل الاستيفاء، أو استخدام استعلاماتPROC SQLالمحددة بنطاقات زمنية محددة.
12.2 معايير التحقق من الجودة الإحصائية والتوثيق الأكاديمي
لضمان أعلى معايير الجودة الإحصائية وقابلية إعادة الإنتاج العلمي (Reproducibility) في الأبحاث والتقارير المنشورة، ينبغي اتباع حزمة من أفضل الممارسات المنهجية:
- التدقيق اليدوي العشوائي (Spot Checking): إجراء اختبارات حسابية يدوية لعينات عشوائية من السجلات ومقارنتها بنتائج البرنامج للتحقق من سلامة الأكواد، لاسيما عند فترات البداية ومواضع القيم المفقودة.
- توثيق خيارات التنعيم في التقارير العلمية: عند كتابة منهجية البحث في الأوراق الأكاديمية، يجب الإفصاح الكامل عن نوع المتوسط المتحرك المستخدم (بسيط، مرجح، أسي، أو متمركز)، وطول النافذة الزمنية n، ومبررات اختيارها، وكيفية معالجة المشكلات الطرفية والقيم المفقودة.
- هيكلة وتوثيق الأكواد البرمجية: إضافة تعليقات تفصيلية (Comments) داخل شفرات SAS توضح الغرض من كل معامل وخيار تحويلي، وحفظ الأكواد في بيئات إدارة النسخ (Version Control) لضمان الشفافية العلمية وإمكانية مراجعة التحليلات مستقبلاً.
خاتمة شاملة
يمثل المتوسط المتحرك أداة تحليلية لا غنى عنها في ترسانة الإحصائي ومحلل البيانات، لما يوفره من قدرة استثنائية على كشف الاتجاهات الجوهرية وتصفية الضوضاء العشوائية في السلاسل الزمنية والبيانات السلوكية والطبية المعقدة. وقد أثبتت بيئة SAS، من خلال حزمة SAS/ETS وإجراء PROC EXPAND المتخصص، تفوقاً منقطع النظير في تقديم حلول مرنة، فائقة الدقة والسرعة لحساب المتوسطات المتحركة بأنماطها المختلفة البسيطة والمرجحة والأسية والمركزية.
كما بين هذا الدليل، فإن نجاح التحليل الإحصائي لا يعتمد فقط على كتابة الكود البرمجي، بل يتطلب فهماً نظرياً عميقاً لمفاضلة التحيز والتباين عند اختيار حجم النافذة الزمنية، وحسن إدارة البيانات المفقودة والمشكلات الطرفية، والاستفادة من قوة المعالجة المجمعة عبر BY-Group. ومن خلال دمج هذه المهارات التحليلية مع التمثيل البصري عالي الجودة عبر PROC SGPLOT، يصبح الباحث قادراً على تحويل السلاسل الزمنية الخام المضطربة إلى رؤى علمية دقيقة تدعم اتخاذ القرارات الرشيدة وتسهم في إثراء الأبحاث الأكاديمية والتطبيقية بأعلى معايير الرصانة الإحصائية.
References
- Box, G. E., Jenkins, G. M., Reinsel, G. C., & Ljung, G. M. (2015). Time series analysis: Forecasting and control (5th ed.). John Wiley & Sons. https://doi.org/10.1002/9781118619193
- Brockwell, P. J., & Davis, R. A. (2016). Introduction to time series and forecasting (3rd ed.). Springer. https://doi.org/10.1007/978-3-319-29854-2
- Hyndman, R. J., & Athanasopoulos, G. (2021). Forecasting: Principles and practice (3rd ed.). OTexts. https://otexts.com/fpp3/
- SAS Institute Inc. (2023). SAS/ETS user’s guide: The EXPAND procedure. SAS Institute Inc. https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/etsug/etsug_expand_overview.htm
- Shumway, R. H., & Stoffer, D. S. (2017). Time series analysis and its applications: With R examples (4th ed.). Springer. https://doi.org/10.1007/978-3-319-52452-8