يمثل تحليل السلاسل الزمنية أحد الركائز الجوهرية في الإحصاء التطبيقي، وتعلم الآلة، والقياس النفسي والاقتصادي، حيث تسعى النماذج الرياضية إلى تفكيك الأنماط التاريخية واستشراف المسارات المستقبلية للظواهر المعقدة. ومع ذلك، فإن القيمة التنبؤية والصدق الإحصائي لأي نموذج قياسي يظلان رهينين بمدى استيفاء الافتراضات الصارمة المتعلقة ببواقي التقدير (Model Residuals). وفي صلب هذه الافتراضات، تبرز ضرورة خلو البواقي من أي ارتباط ذاتي متبقٍ، مما يعني تحولها إلى عملية عشوائية نقية تُعرف إحصائياً باسم “الضجيج الأبيض” (White Noise).
يُعد اختبار ليونغ-بوكس (Ljung-Box Test) الأداة التشخيصية الأكثر انتشاراً واعتمادية في الأدبيات الإحصائية الحديثة لتقييم فرضية الاستقلالية التسلسلية للمشاهدات أو البواقي عبر فترات إبطاء زمنية متعددة مجتمعة. ونظراً لأهمية هذا الفحص في دورة بناء النماذج، تقدم لغة بايثون عبر مكتباتها المتقدمة مثل Statsmodels بنية برمجية قوية لتنفيذ هذا الاختبار، وتفسير نتائجه بدقة متناهية، والتحقق من جودة النماذج القياسية قبل اعتمادها في اتخاذ القرارات أو التنبؤ العلمي.
يهدف هذا الدليل الشامل والمفصل إلى تقديم مرجع أكاديمي وتطبيقي متكامل لاختبار ليونغ-بوكس في بيئة بايثون؛ بدءاً من التأصيل النظري والرياضي للاختبار، مروراً بتشريح الدوال البرمجية وضبط المعاملات الحساسة مثل درجات الحرية وفترات الإبطاء، وصولاً إلى مقارنته بالاختبارات البديلة وتطبيقه على دراسات حالة واقعية في القياس السلوكي والنفسي والاقتصادي. يقدم هذا المقال فهماً عميقاً يجمع بين الصرامة الرياضية والممارسة البرمجية الاحترافية لتجنب المزالق التحليلية الشائعة.
- 1. مقدمة نظرية حول اختبار ليونغ-بوكس (Ljung-Box Test) في تحليل السلاسل الزمنية
- 2. الفرضيات الإحصائية والأسس الرياضية لاختبار ليونغ-بوكس
- 3. إعداد وتجهيز بيئة العمل البرمجية في بايثون (Python Environment)
- 4. التشريح البرمجي لدالة acorr_ljungbox ومعاملاتها (Parameters)
- 5. التطبيق العملي الأساسي: فحص الارتباط الذاتي لسلسلة زمنية
- 6. تحديد وتخصيص عدد فترات الإبطاء (Lags) واستراتيجيات الاختيار
- 7. تفسير المخرجات الإحصائية وقيمة الاحتمالية (P-Value Interpretation)
- 8. تشخيص بواقي نماذج السلاسل الزمنية (ARIMA / SARIMA) في بايثون
- 9. مقارنة اختبار ليونغ-بوكس مع اختبارات الارتباط الذاتي الأخرى
- 10. التعامل مع مشكلات الارتباط الذاتي الشائعة وتصحيح النماذج
- 11. الأخطاء البرمجية والمفاهيمية الشائعة وكيفية تجنبها في بايثون
- 12. دراسة حالة تطبيقية متكاملة: تحليل سلسلة زمنية سلوكية خطوة بخطوة
- خاتمة وتوصيات منهجية
- References
1. مقدمة نظرية حول اختبار ليونغ-بوكس (Ljung-Box Test) في تحليل السلاسل الزمنية
1.1 تعريف اختبار ليونغ-بوكس وسياقه الإحصائي
يُعرَّف اختبار ليونغ-بوكس (Ljung-Box Test)، الذي طوره الإحصائيان غريتا م. ليونغ (Greta M. Ljung) وجورج إي. بي. بوكس (George E. P. Box) في عام 1978، بأنه اختبار فرضيات إحصائي تجميعي (Portmanteau Test) مصمم لفحص ما إذا كانت مجموعة من معاملات الارتباط الذاتي لعينة من السلسلة الزمنية أو بواقي النماذج تختلف معنوياً عن الصفر مجتمعةً، وليس فرادى. لا يقتصر هدف الاختبار على التحقق من وجود ارتباط عند فترة إبطاء محددة بذاتها (Lag $k$)، بل يمتد لتقييم الوجود التراكمي للارتباط عبر نطاق من فترات الإبطاء المتتابعة من الفترة الأولى وحتى الفترة $m$.
تاريخياً، جاء اختبار ليونغ-بوكس كتطوير مباشر ومعالجة للقصور الرياضي الذي اعتري اختبار بوكس-بيرس (Box-Pierce Test) المقترح عام 1970. فعلى الرغم من أن كلا الاختبارين يعتمدان على نفس المبدأ النظري لاختبار الدلالة الإحصائية للارتباطات الذاتية التراكمية، إلا أن إحصائية بوكس-بيرس كانت تعاني من ضعف تقارب توزيعها نحو توزيع كاي-تربيع ($ chi^2 $) في العينات الصغيرة والمتوسطة، مما يؤدي إلى رفض الفرضية الصفرية بمعدلات أقل من المفترض (أي تضخيم الخطأ من النوع الثاني). جاء تعديل ليونغ وبوكس ليعيد وزن معاملات الارتباط الذاتي بناءً على حجم العينة وفترة الإبطاء، مما جعل الإحصائية تتطابق بدقة أكبر مع توزيع كاي-تربيع، حتى في العينات المحدودة الحجم.
يلعب الاختبار دوراً محورياً في التحقق من استقلالية البواقي (Residuals Independence)، وهي الركيزة الأساسية في منهجية “بوكس-جينكينز” (Box-Jenkins Methodology) لنمذجة السلاسل الزمنية. ففي النمذجة الكلاسيكية باستخدام نماذج الانحدار الذاتي والمتوسطات المتحركة (ARMA وARIMA)، يُشترط أن يستوعب النموذج كافة الأنماط الديناميكية والهيكلية في البيانات، بحيث لا يتبقى في الأخطاء العشوائية سوى تباينات بيضاء مستقلة وغير مترابطة. إن إخفاق النموذج في تحقيق هذا الشرط يعني بالضرورة أن هناك معلومات منتظمة متبقية في البواقي لم يتم نمذجتها، مما يفقد التنبؤات المستقبلية كفاءتها الإحصائية ودقتها المأمولة.
1.2 أهمية التحقق من الارتباط الذاتي في البيانات
يمثل الارتباط الذاتي (Autocorrelation) – أو الارتباط التسلسلي (Serial Correlation) – ظاهرة إحصائية ترتبط فيها القيم الحالية للمتغير بقيمه السابقة عبر الزمن. وفي سياق النمذجة القياسية والإحصائية، يؤدي إهمال فحص الارتباط الذاتي في البواقي إلى عواقب وخيمة على سلامة الاستدلال الإحصائي؛ إذ يفضي وجود الارتباط التسلسلي في حدود الخطأ إلى انتهاك الافتراض الجوهري لنظرية “غاوس-ماركوف” (Gauss-Markov Theorem)، مما يجعل تقديرات المعلمات بطريقة المربعات الصغرى العادية (OLS) غير فعالة (Inefficient)، رغم بقائها غير متحيزة (Unbiased).
تتجلى الخطورة الأكبر للارتباط الذاتي في تشويه تقدير مصفوفة التباين والتباين المشترك (Variance-Covariance Matrix) لمعلمات النموذج؛ حيث يميل التباين المقدر للمعلمات إلى الانخفاض بصورة مصطنعة، مما يقود إلى تضخيم إحصاءات $t$ و$F$ المئوية بشكل زائف، والحصول على قيم احتمالية ($p$-values) شديدة الانخفاض توحي بدلالة إحصائية وهمية لمتغيرات غير معنوية في الواقع. يترتب على ذلك تضييق غير حقيقي لفترات الثقة (Confidence Intervals)، مما يمنح الباحث أو متخذ القرار ثقة مفرطة وخاطئة في دقة التنبؤات، في حين أن التنبؤات الفعلية ستعاني من تباين حقيقي مرتفع وانخفاض حاد في الدقة خارج العينة (Out-of-sample accuracy).
إضافة إلى ذلك، يعمل فحص الارتباط الذاتي بمثابة مجس استكشافي يكشف عن وجود أنماط كامنة غير مفسرة داخل البيانات، مثل التأثيرات الموسمية غير المعالجة، أو اللاخطية غير المكتشفة، أو غياب متغيرات توضيحية جوهرية ذات مسار زمني مترابط. من هنا، يصبح التحقق من فرضية “الضجيج الأبيض” (White Noise Residuals) – التي تفترض أن الأخطاء مستقلة، موزعة بشكل متطابق بمتوسط صفري وتباين ثابت، وبلا ارتباط ذاتي – المعيار الحاكم والنهائي لجودة وملاءمة النموذج الإحصائي قبل اعتماده في التطبيقات العملية.
1.3 تطبيقات الاختبار في النمذجة القياسية والنفسية
يمتد النطاق التطبيقي لاختبار ليونغ-بوكس إلى مجالات متعددة تتجاوز الاقتصاد القياسي التقليدي والتحليلات المالية؛ حيث يشهد علم النفس المعاصر والعلوم السلوكية اعتماداً متزايداً على تصميمات السلاسل الزمنية المكثفة، لا سيما مع انتشار منهجيات التقييم اللحظي البيئي (Ecological Momentary Assessment – EMA). في هذا السياق، يُستخدم الاختبار لفحص التغيرات السلوكية والانفعالية اللحظية للأفراد عبر الزمن، والتحقق مما إذا كانت الاستجابات النفسية لحدث معين تتلاشى عشوائياً أم أنها تخضع لنمط ارتدادي ذاتي متكرر يتطلب نمذجة ديناميكية خاصة.
وفي التجارب النفسية العصبية (Neuropsychological Experiments) ودراسات علم الأعصاب الإدراكي، تُجرى قياسات متكررة للنشاط الدماغي وزمن الاستجابة (Reaction Time) أثناء أداء مهام معرفية معقدة. يُوظف اختبار ليونغ-بوكس للتحقق من استقلالية أخطاء القياس المتتابعة عبر المحاولات (Trials)؛ إذ إن وجود ارتباط ذاتي بين المحاولات المتتالية قد يشير إلى تأثيرات التعب (Fatigue Effects)، أو استراتيجيات التعلم التراكمي، أو الانحراف في معايرة الأجهزة، وهو ما يستوجب الفصل بين هذه التأثيرات المنهجية والأداء المعرفي الحقيقي للمفحوص.
علاوة على ذلك، يُعد الاختبار أداة حاسمة في تقييم دقة نماذج الاستجابة المعرفية والانفعالية الزمنية، وفي التأكد من خلو بيانات المقاييس النفسية الطولية (Longitudinal Psychometrics) من التكرار المنتظم المشوه. إن وجود الارتباط الذاتي غير المعالج في القياسات النفسية الطولية يؤدي إلى تضخيم معاملات الثبات الداخلي والاتساق عبر الزمن بصورة مضللة، مما يجعل اختبار ليونغ-بوكس خطوة تنظيف وتحقق منهجية لا غنى عنها في الأبحاث السلوكية والطبية النفسية الحديثة.
2. الفرضيات الإحصائية والأسس الرياضية لاختبار ليونغ-بوكس
2.1 صياغة الفرضية الصفرية والبديلة
ينطلق الاستدلال الإحصائي في اختبار ليونغ-بوكس من صياغة ثنائية صارمة للفرضيات تغطي مجمل معاملات الارتباط الذاتي حتى فترة الإبطاء المستهدفة $m$. تُصاغ الفرضية الصفرية ($H_0$) والفرضية البديلة ($H_1$ أو $H_A$) رياضياً كما يلي:
- الفرضية الصفرية ($H_0$): تنص على أن جميع معاملات الارتباط الذاتي للسلسلة (أو البواقي) من فترة الإبطاء الأولى حتى فترة الإبطاء $m$ تساوي الصفر تماماً؛ أي أن البيانات مستقلة إحصائياً وتتوزع عشوائياً:
$$H_0: \rho_1 = \rho_2 = dots = \rho_m = 0$$ - الفرضية البديلة ($H_A$): تنص على أن معامل ارتباط ذاتي واحداً على الأقل من بين المعاملات المحسوبة حتى فترة الإبطاء $m$ يختلف معنوياً عن الصفر؛ مما يعني وجود ارتباط ذاتي تسلسلي في البيانات:
$$H_A: \exists , k in {1, 2, dots, m} \quad \text{بحيث} \quad \rho_k \neq 0$$
في سياق تشخيص النماذج (Model Diagnostics)، يختلف الهدف التحليلي للباحث عن سياق اختبارات الفرضيات التقليدية؛ حيث يسعى الباحث هنا إلى الفشل في رفض الفرضية الصفرية (Fail to reject $H_0$). إن بقاء الفرضية الصفرية قائمة هو الدليل الإحصائي الإيجابي على أن بواقي النموذج تمثل ضجيجاً أبيض ناصعاً، وأن النموذج قد استنفد بنجاح كافة الأنماط الزمنية القابلة للتفسير. ويُتخذ القرار الإحصائي بمقارنة القيمة الاحتمالية المحسوبة ($p$-value) بمستوى الدلالة المعياري المختار مسبقاً (عادةً ما يتم ضبط مستوى المعنوية $\alpha = 0.05$). فإذا كانت القيمة الاحتمالية أكبر من 0.05، تُقبل الفرضية الصفرية لاستقلالية البواقي، بينما تدل القيمة الأقل من أو تساوي 0.05 على وجود ارتباط ذاتي يستوجب إعادة هيكلة النموذج.
2.2 المعادلة الرياضية وإحصاء الاختبار (Q-Statistic)
تعتمد إحصائية اختبار ليونغ-بوكس، والتي يُرمز لها غالباً بالرمز $Q_{LB}$ أو ببساطة $Q$، على دمج معاملات الارتباط الذاتي للعينة ($\hat{\rho}_k$) المحسوبة عند كل فترة إبطاء $k$. تُعرف دالة الارتباط الذاتي للعينة للسلسلة الزمنية $e_t$ ذات الطول $n$ والمتوسط $\bar{e}$ بالمعادلة التالية:
$$\hat{\rho}_k = \frac{\sum_{t=k+1}^{n} (e_t – \bar{e})(e_{t-k} – \bar{e})}{\sum_{t=1}^{n} (e_t – \bar{e})^2}$$
وتُحسب إحصائية ليونغ-بوكس $Q$ وفقاً للصيغة الرياضية الدقيقة التالية:
$$Q_{LB} = n(n + 2) \sum_{k=1}^{m} \frac{\hat{\rho}_k^2}{n – k}$$
حيث تمثل المتغيرات في المعادلة ما يلي:
- $n$: حجم العينة الإجمالي أو عدد المشاهدات في السلسلة الزمنية.
- $m$: الحد الأقصى لعدد فترات الإبطاء (Lags) المفحوصة في الاختبار.
- $\hat{\rho}_k$: معامل الارتباط الذاتي المقدر للعينة عند فترة الإبطاء $k$.
- $n – k$: عامل التصحيح الزمني الذي يمنح أوزاناً إضافية لفترات الإبطاء الأكبر لتعويض انخفاض عدد الأزواج المتزامنة المتاحة للحساب مع زيادة $k$.
- $n(n+2)$: معامل التكبير التقاربي الذي يضمن تسريع تقارب الإحصائية نحو توزيعها النظري في العينات المحدودة.
تتبع إحصائية $Q_{LB}$ المقدرة توزيع كاي-تربيع التقاربي ($\chi^2$) بدرجات حرية تعتمد على سياق تطبيق الاختبار:
$$Q_{LB} \sim \chi^2(df)$$
حيث تكون درجات الحرية $df = m$ إذا طُبق الاختبار على سلسلة زمنية أصلية خام، بينما تصبح درجات الحرية $df = m – p – q$ إذا طُبق الاختبار على بواقي نموذج قياسي مقدر من عائلة $ARMA(p, q)$ أو $ARIMA(p, d, q)$، حيث يمثل $p$ عدد معلمات الانحدار الذاتي، ويمثل $q$ عدد معلمات المتوسطات المتحركة المقدرة في النموذج.
2.3 شروط وتوزيعات الاستدلال الإحصائي
يرتكز الاستدلال الإحصائي الموثوق باستخدام اختبار ليونغ-بوكس على مجموعة من الافتراضات النظرية والشروط الهيكلية في البيانات. يفترض الاختبار في مقامه الأول أن السلسلة الخاضعة للفحص تحقق شرط الاستقرارية الضعيفة أو الاستقرارية من الدرجة الثانية (Weak Stationarity / Covariance Stationarity)؛ مما يعني ثبات المتوسط والتباين عبر الزمن، وأن دالة التغاير الذاتي تعتمد فقط على المسافة الزمنية بين النقطتين (فترة الإبطاء) وليس على اللحظة الزمنية الفعلية.
تظهر القوة المنهجية لاختبار ليونغ-بوكس عند مقارنة سلوكه التقاربي بسلوك إحصائية بوكس-بيرس الأصلية المعرفة بالصيغة:
$$Q_{BP} = n \sum_{k=1}^{m} \hat{\rho}_k^2$$
في العينات الصغيرة، يكون تباين $\hat{\rho}_k$ مساوياً تقريباً لـ $\frac{n – k}{n(n + 2)}$ بدلاً من المقدار الكلاسيكي $\frac{1}{n}$. ومن خلال قسمة مربع معامل الارتباط الذاتي $\hat{\rho}_k^2$ على تباينه المقدر في العينات المحدودة، ينجح اختبار ليونغ-بوكس في تصحيح الانحراف السالب نحو الصفر، مما يجعل الإحصائية التجميعية تتبع توزيع كاي-تربيع بدقة فائقة ويمنع التقدير المتفائل غير المبرر لاستقلالية البواقي في الدراسات ذات العينات المحدودة.
3. إعداد وتجهيز بيئة العمل البرمجية في بايثون (Python Environment)
3.1 تثبيت المكتبات الإحصائية والتحليلية الأساسية
لتنفيذ اختبار ليونغ-بوكس وإجراء التشخيص الإحصائي المتقدم للسلاسل الزمنية، تتطلب بيئة العمل في بايثون تثبيت وتحديث حزمة من المكتبات العلمية المعيارية. تُعد مكتبة Statsmodels الركيزة المركزية لتنفيذ الاختبار، حيث تتضمن وحدة التشخيصات الإحصائية statsmodels.stats.diagnostic كافة الدوال المتخصصة في فحص البواقي والارتباط التسلسلي.
إلى جانب Statsmodels، تبرز مكتبة Pandas كأداة لا غنى عنها لإدارة وهيكلة السلاسل الزمنية، ومكتبة NumPy لإجراء العمليات الجبرية والمصفوفية عالية الأداء، بالإضافة إلى مكتبتي Matplotlib وSeaborn لتوليد الرسوم البيانية الاستكشافية والتشخيصية عالية الدقة. يمكن إعداد البيئة وتثبيت أحدث الإصدارات المستقرة عبر سطر الأوامر باستخدام مديري الحزم pip أو conda.
يتيح الكود التالي تثبيت الحزم المطلوبة بصورة متكاملة:
# تثبيت الحزم الأساسية عبر أداة pip
pip install numpy pandas statsmodels matplotlib seaborn scipy --upgrade
بعد اكتمال عملية التثبيت، يتم استيراد هذه الحزم داخل بيئة العمل البرمجية (مثل Jupyter Notebook أو نصوص بايثون المستقلة) مع ضبط معايير العرض والرسوم لضمان تناسق المخرجات الأكاديمية والبيانية عبر الأوامر التالية:
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.stats.diagnostic import acorr_ljungbox
import matplotlib.pyplot as plt
import seaborn as sns
# ضبط النمط البصري للمخططات البيانية
sns.set_theme(style="whitegrid")
plt.rcParams['font.sans-serif'] = 'DejaVu Sans'
plt.rcParams['axes.unicode_minus'] = False
3.2 هيكلة البيانات الزمنية للتحليل
يتطلب التحليل الدقيق للسلاسل الزمنية في بايثون ضبطاً صارماً لبنية هياكل البيانات في مكتبة Pandas. لا يكفي تخزين البيانات في مصفوفات رقمية مجردة، بل يجب تحويل المؤشرات الزمنية إلى كائنات من نوع DatetimeIndex لتمكين المكتبات الإحصائية من معالجة الفترات الزمنية والترددات بصورة متسقة، وتجنب الأخطاء البرمجية الناتجة عن عدم انتظام السلسلة.
تتضمن عملية التهيئة ثلاث مراحل أساسية: تحويل عمود التواريخ إلى فهرس زمني رسمي، ثم التحقق من التردد الزمني المنتظم (Frequency Regularity) وتحديده صراحة (مثل ‘D’ للبيانات اليومية، ‘M’ للشهرية)، وأخيراً معالجة القيم المفقودة (Missing Values). يُعد وجود قيم مفقودة (NaNs) في السلسلة الزمنية عائقاً مباشراً أمام تنفيذ اختبار ليونغ-بوكس؛ حيث تفشل دالة حساب الارتباط الذاتي في ظل وجود فجوات في المشاهدات المتتابعة.
يوضح الكود التالي كيفية إنشاء إطار بيانات زمني منظم، وضبط التردد، وتطبيق تقنيات الاستيفاء الخطي (Linear Interpolation) للتعامل مع الفجوات الزمنية:
# إنشاء سلسلة زمنية تجريبية مع مؤشر زمني يومي
date_range = pd.date_range(start='2023-01-01', periods=250, freq='D')
np.random.seed(42)
raw_values = np.random.normal(loc=10.0, scale=2.0, size=250)
# إدراج بعض القيم المفقودة لمحاكاة الواقع العملي
raw_values[15] = np.nan
raw_values[45] = np.nan
# بناء إطار بيانات Pandas مهيكل
df = pd.DataFrame(data={'Target_Variable': raw_values}, index=date_range)
df.index.name = 'Date'
# التأكد من التردد الزمني ومعالجة القيم المفقودة بالاستيفاء الخطي
df['Clean_Variable'] = df['Target_Variable'].interpolate(method='time')
print("معلومات الفهرس الزمني والبيانات بعد المعالجة:")
print(df.info())
3.3 استيراد دوال الفحص من مكتبة Statsmodels
توجد الدالة الأساسية لاختبار ليونغ-بوكس داخل وحدة التشخيص الإحصائي لمكتبة Statsmodels تحت المسار البرمجي التالي: statsmodels.stats.diagnostic.acorr_ljungbox. شهدت هذه الدالة تطورات مهمة في الإصدارات الحديثة من المكتبة (تحديداً بدءاً من الإصدار 0.12 وما بعده)؛ حيث أصبحت ترجع إطار بيانات مهيكلاً من نوع pandas.DataFrame افتراضياً بدلاً من إرجاع مصفوفات نمطية أو أزواج من التوليفات الرقمية (Tuples) كما كان متبعاً في الإصدارات القديمة.
من الممارسات البرمجية المتقدمة بناء دوال مساعدة (Helper Functions) مخصصة لتغليف مخرجات الدالة الأصلية، وتنسيق الأرقام العشرية، وإضافة علامات التمييز الإحصائي (Significance Stars) التي توضح بصورة فورية مستويات الدلالة ($p < 0.05$, $p < 0.01$, $p < 0.001$). يسهم هذا التغليف في تسهيل عملية التوثيق الأكاديمي، وتصدير الجداول الإحصائية مباشرة إلى تقارير النشر العلمي أو منصات العرض التنفيذية.
فيما يلي كود برمجي يوضح استيراد الدالة وبناء دالة مساعدة لتنسيق وتصدير مخرجات الفحص بدقة أكاديمية عالية:
def run_academic_ljungbox(series, lags=10, model_df=0):
"""
دالة مساعدة لإجراء اختبار ليونغ-بوكس وإخراج النتائج بتنسيق أكاديمي منظم.
المعاملات:
series (pd.Series or np.ndarray): السلسلة أو البواقي المراد فحصها.
lags (int or list): عدد فترات الإبطاء المفحوصة.
model_df (int): درجات الحرية المستهلكة في النموذج المقدر (p + q).
المخرجات:
pd.DataFrame: جدول إحصائي منسق يتضمن إحصائية Q والقيمة الاحتمالية والقرار الإحصائي.
"""
# تنفيذ الاختبار عبر Statsmodels
results = acorr_ljungbox(series, lags=lags, model_df=model_df, return_df=True)
# إضافة أعمدة تفسيرية منسقة
results['Decision (alpha=0.05)'] = np.where(
results['lb_pvalue'] < 0.05,
'Reject H0 (Serial Correlation Present)',
'Fail to Reject H0 (White Noise / Independent)'
)
# تنسيق الأرقام العشرية
formatted_results = results.copy()
formatted_results['lb_stat'] = formatted_results['lb_stat'].map('{:,.4f}'.format)
formatted_results['lb_pvalue'] = formatted_results['lb_pvalue'].map('{:,.5f}'.format)
return formatted_results
4. التشريح البرمجي لدالة acorr_ljungbox ومعاملاتها (Parameters)
4.1 المعاملات الأساسية للدالة
تمتلك دالة acorr_ljungbox في مكتبة Statsmodels توقيعاً برمجياً دقيقاً يتضمن مجموعة من المعاملات (Arguments) الحاكمة لكيفية تنفيذ الحسابات الرياضية وطبيعة المخرجات المرجعة. يتطلب الاستخدام الاحترافي للدالة فهماً عميقاً لكل معامل وتأثيره المباشر على النتائج المستخلصة:
statsmodels.stats.diagnostic.acorr_ljungbox(
x,
lags=None,
boxpierce=False,
model_df=0,
period=None,
return_df=True,
auto_lag=False
)
تتمثل المعاملات الأساسية فيما يلي:
x(array_like): مصفوفة المدخلات أو السلسلة الزمنية أحادية البعد (1D array or Series) المراد اختبارها. يمكن أن تكون سلسلة زمنية أصلية خام للتحقق من استقلاليتها، أو مصفوفة البواقي الناتجة عن تقدير نموذج رياضي مثل ARIMA أو OLS.lags(int or list-like, default None): يحدد عدد فترات الإبطاء التي سيتم عندها فحص الارتباط الذاتي. إذا تم تمرير عدد صحيح مثلlags=10، فإن الدالة تختبر الفترات من 1 إلى 10 تراكمياً. كما يمكن تمرير قائمة محددة مثلlags=[5, 10, 15]لفحص فترات زمنية متباعدة ومحددة فقط. في حال تُرك المعامل فارغاً (None)، تعتمد الدالة على خوارزمية افتراضية مبنية على حجم العينة ($min(10, n // 5)$).boxpierce(bool, default False): معامل منطقي يتيح للمستخدم حساب إحصائية “بوكس-بيرس” ($Q_{BP}$) جنباً إلى جنب مع إحصائية ليونغ-بوكس للمقارنة المباشرة بين القيمتين.return_df(bool, default True): يتحكم في صيغة المخرجات؛ حيث يؤدي تعيينه إلىTrueإلى إرجاع كائنpd.DataFrameمفهرس بفترات الإبطاء، بينما يرجع مصفوفات عادية في حال تعيينه إلىFalse.
4.2 المعاملات المتقدمة وضبط درجات الحرية
يُعد المعامل model_df (Model Degrees of Freedom) المعامل الأكثر حساسية وخطورة من الناحية المنهجية عند تطبيق الاختبار على بواقي النماذج المقدرة. يُعبر هذا المعامل عن عدد المعلمات الديناميكية التي تم تقديرها داخل النموذج واستُهلكت من درجات الحرية الكلية للبيانات قبل استخراج البواقي.
عند ملاءمة نموذج انحدار ذاتي ومتوسطات متحركة $ARMA(p, q)$ أو نموذج متكامل $ARIMA(p, d, q)$، يتم تقدير $p$ معلمات انحدار ذاتي و$q$ معلمات متوسطات متحركة. يفرض الاستدلال الإحصائي السليم طرح هذا المجموع ($p + q$) من عدد فترات الإبطاء $m$ لحساب درجات الحرية الفعلية لتوزيع كاي-تربيع ($df = m – (p + q)$). لا تؤثر درجات التكامل والتفاضل $d$ أو المعامل الثابت (Intercept) على درجات حرية الارتباط الذاتي للبواقي، وبالتالي لا تُدرج ضمن model_df.
إذا أهمل المحلل ضبط model_df وتركه على قيمته الافتراضية (model_df=0) أثناء اختبار بواقي نموذج ARIMA(2, 1, 2) مثلاً، فإن الدالة ستفترض خاطئة أن درجات الحرية تساوي $m$ بدلاً من $m – 4$. يؤدي هذا الخطأ إلى تضخيم القيمة الاحتمالية المحسوبة ($p$-value) وجعلها تبدو أكبر من قيمتها الحقيقية؛ مما يقود الباحث إلى قبول خاطئ للفرضية الصفرية والتغاضي عن وجود ارتباط تسلسلي متبقٍ في البواقي، وهو ما يمثل وقوعاً صريحاً في خطأ التقدير الإحصائي من النوع الثاني (Type II Error).
4.3 فهم بنية المخرجات (Output Structure)
عند تشغيل دالة acorr_ljungbox مع تفعيل المعامل الافتراضي return_df=True، تُنتج الدالة إطار بيانات منظماً يتألف من صفوف تمثل فترات الإبطاء المتتابعة وعمودين رئيسيين (أو أربعة أعمدة في حال تفعيل فحص بوكس-بيرس):
lb_stat: القيمة العددية المحسوبة لإحصائية اختبار ليونغ-بوكس ($Q_{LB}$) التراكمية عند فترة الإبطاء المحددة في الفهرس. تتزايد هذه القيمة رتيباً (Monotonically) أو تبقى ثابتة مع زيادة عدد الإبطاءات، لأنها تجمع مربعات معاملات الارتباط الذاتي السابقة.lb_pvalue: القيمة الاحتمالية المقابلة لقيمة $Q_{LB}$ المحسوبة مقارنة بالتوزيع النظري لكاي-تربيع عند درجات الحرية المصححة ($m – \text{model_df}$). تمثل هذه القيمة احتمال الحصول على إحصائية $Q$ بهذا الحجم أو أكبر بمحض الصدفة البحتة بافتراض صحة الفرضية الصفرية.bp_stat&bp_pvalue: تظهر هذه الأعمدة فقط عند تعيينboxpierce=True، وتوفر الإحصائية المقابلة والقيمة الاحتمالية لاختبار بوكس-بيرس التقليدي للمقارنة.
في الحالات التي تكون فيها فترة الإبطاء الأولى $k le \text{model_df}$، تظهر القيم الاحتمالية كـ NaN في المخرجات؛ وذلك لأن درجات الحرية تصبح سالبة أو مساوية للصفر ($df le 0$)، وهو ما يعكس حقيقة رياضية واضحة تنص على تعذر اختبار فرضية الاستقلالية عند فترات إبطاء تقل عن أو تساوي عدد المعلمات المستهلكة في النموذج المقدر.
5. التطبيق العملي الأساسي: فحص الارتباط الذاتي لسلسلة زمنية
5.1 توليد أو تحميل بيانات تجريبية
لفهم الآلية التشغيلية لاختبار ليونغ-بوكس بصورة عملية، سنقوم ببناء بيئة تجريبية منضبطة في بايثون تتضمن توليد سلسلتين زمنيتين اصطناعيتين معلومتي الخصائص الإحصائية مسبقاً: السلسلة الأولى تمثل “ضجيجاً أبيض ناصعاً” (Pure Gaussian White Noise) لا يحتوي على أي ارتباط ذاتي، في حين تمثل السلسلة الثانية عملية انحدار ذاتي من الدرجة الأولى $AR(1)$ ذات معامل ارتباط ذاتي قوي وموجب ($phi = 0.75$).
تتيح هذه المقارنة التجريبية مراقبة الاستجابة الإحصائية الدقيقة للدالة في ظل حالتي الوجود والغياب التام للارتباط التسلسلي، والتحقق من سلامة القرارات المستخلصة. يوضح الكود التالي توليد السلسلتين ورسمهما بيانياً:
# ضبط البذرة العشوائية لضمان إمكانية إعادة الإنتاج
np.random.seed(101)
n_samples = 300
# 1. توليد سلسلة ضجيج أبيض نقية
white_noise = np.random.normal(loc=0.0, scale=1.0, size=n_samples)
# 2. توليد سلسلة انحدار ذاتي من الدرجة الأولى AR(1): y_t = 0.75 * y_{t-1} + e_t
ar_series = np.zeros(n_samples)
for t in range(1, n_samples):
ar_series[t] = 0.75 * ar_series[t-1] + np.random.normal(loc=0.0, scale=1.0)
# تحويل السلاسل إلى كائنات Pandas Series
dates = pd.date_range(start='2023-01-01', periods=n_samples, freq='D')
ts_white_noise = pd.Series(white_noise, index=dates, name="White_Noise")
ts_ar = pd.Series(ar_series, index=dates, name="AR1_Process")
print("تم توليد السلاسل الزمنية التجريبية بنجاح.")
5.2 تنفيذ كود اختبار ليونغ-بوكس خطوة بخطوة
سنقوم الآن بتطبيق اختبار ليونغ-بوكس على كلا السلسلتين لفحص فترات الإبطاء من 1 وحتى 10، مع إبقاء model_df=0 نظراً لأننا نقوم باختبار سلاسل بيانات خام مباشرة وليس بواقي نماذج مقدرة. سنستعرض المخرجات الرقمية لكلا الاختبارين لمقارنة التباين في قيم الإحصائية وقيم الاحتمالية.
# تنفيذ الاختبار على سلسلة الضجيج الأبيض
lb_results_wn = acorr_ljungbox(ts_white_noise, lags=10, return_df=True)
# تنفيذ الاختبار على سلسلة الانحدار الذاتي AR(1)
lb_results_ar = acorr_ljungbox(ts_ar, lags=10, return_df=True)
# دمج النتائج للمقارنة المباشرة
comparison_table = pd.DataFrame({
'Lag': lb_results_wn.index,
'WN_Stat': lb_results_wn['lb_stat'].values,
'WN_pValue': lb_results_wn['lb_pvalue'].values,
'AR_Stat': lb_results_ar['lb_stat'].values,
'AR_pValue': lb_results_ar['lb_pvalue'].values
}).set_index('Lag')
print("جدول المقارنة بين الضجيج الأبيض وسلسلة AR(1):")
print(comparison_table.round(4))
5.3 قراءة النتائج المبدئية واتخاذ القرار الإحصائي
يوضح الجدول المقارن سلوكاً إحصائياً متبايناً بوضوح بين الحالتين يعكس قوة الاختبار في التمييز بين السلاسل المستقلة والمترابطة:
- حالة الضجيج الأبيض (White Noise): نلاحظ أن قيم إحصائية الاختبار
lb_statتظل منخفضة للغاية عبر كافة فترات الإبطاء من 1 إلى 10 (تتراوح عادة بين 0.5 و8.0 وهي أقل بكثير من القيم الحرجة لتوزيع كاي-تربيع عند هذه الدرجات الحرية). يترتب على ذلك بقاء القيم الاحتماليةlb_pvalueأعلى بكثير من مستوى الدلالة المعياري $\alpha = 0.05$ (غالباً تتجاوز 0.40 عبر كافة الفترات). القرار الإحصائي هنا هو الفشل في رفض الفرضية الصفرية ($H_0$)، مما يؤكد استقلالية السلسلة وخلوها التام من الارتباط الذاتي. - حالة عملية الانحدار الذاتي AR(1): تسجل إحصائية الاختبار
lb_statقيماً مرتفعة للغاية منذ فترة الإبطاء الأولى ($Q > 150$) وتتراكم بسرعة مع زيادة فترات الإبطاء. يقابل هذا التضخم قيم احتمالية شديدة الانخفاض تؤول برمجياً إلى الصفر التام ($p < 0.000001$). القرار الإحصائي الصارم هو رفض الفرضية الصفرية بالكامل وتأكيد وجود ارتباط ذاتي تسلسلي قوي لا يمكن إغفاله.
يُصاغ القرار الإحصائي في التقارير الأكاديمية بلغة محكمة تؤكد على حجم الإحصائية، درجات الحرية، والقيمة الاحتمالية؛ على سبيل المثال: “أظهر اختبار ليونغ-بوكس عدم وجود دلالة إحصائية للارتباط الذاتي التراكمي في السلسلة الأولى عبر 10 فترات إبطاء ($Q(10) = 7.42, p = 0.685$) مما يدعم فرضية الضجيج الأبيض، في حين كشف الاختبار عن ارتباط تسلسلي دال إحصائياً في السلسلة الثانية ($Q(10) = 482.19, p < 0.001$)".
6. تحديد وتخصيص عدد فترات الإبطاء (Lags) واستراتيجيات الاختيار
6.1 القواعد الإحصائية القياسية لاختيار فترات الإبطاء
يمثل تحديد الحد الأقصى لعدد فترات الإبطاء ($m$ أو $K$) أحد أهم القرارات المنهجية التي يواجهها المحلل عند تطبيق اختبار ليونغ-بوكس. لا توجد قاعدة رياضية أحادية مطلقة تناسب جميع الحالات، ولكن الأدبيات الإحصائية الكلاسيكية والمعاصرة تقترح قواعد إرشادية (Heuristics) تستند إلى حجم العينة الكلي ($T$ أو $n$) وطبيعة التردد الزمني للبيانات.
من أبرز هذه القواعد ما اقترحه روبندر بارتكي وبرونر وهيلمان (Brunner & Heylmann)، إضافة إلى توصيات بوكس وجينكينز الأصلية:
- قاعدة بوكس وجينكينز / برونر: تحديد $m = min(20, T – 1)$ في السلاسل القصيرة، أو استخدام القيمة التقريبية $m \approx \ln(T)$ أو $m \approx \sqrt{T}$ للسلاسل المتوسطة والكبيرة.
- قاعدة تسور (Tsay, 2010): يقترح استخدام $m \approx \ln(T)$ عند نمذجة السلاسل المالية عالية التردد، في حين يوصي باستخدام $m \approx 10$ إلى $20$ كحد أقصى للبيانات الاقتصادية الكلية.
- قاعدة التردد الدوري (Seasonal Frequency Rule): إذا كانت البيانات خاضعة لموسمية واضحة، يجب أن يغطي عدد الإبطاءات دورة موسمية كاملة على الأقل أو دورتين؛ أي $m = 2s$، حيث $s = 4$ للبيانات الربع سنوية ($m = 8$)، و$s = 12$ للبيانات الشهرية ($m = 24$)، و$s = 7$ للبيانات اليومية ذات النمط الأسبوعي ($m = 14$).
6.2 مخاطر الإفراط أو التفريط في عدد الإبطاءات
ينطوي سوء تقدير عدد فترات الإبطاء على مخاطر منهجية مباشرة تؤثر على قوة ومصداقية الاستدلال الإحصائي:
1. مخاطر التفريط (Under-lagging): يؤدي اختيار عدد قليل جداً من فترات الإبطاء (مثل فحص فترة إبطاء واحدة أو اثنتين فقط في سلسلة شهرية) إلى فقدان القدرة على اكتشاف الارتباطات الذاتية الدورية أو ذات المدى المتوسط والطويل. قد تظهر البواقي مستقلة تماماً عند $k=1$ و$k=2$، في حين تخفي ارتباطاً موسمياً عنيفاً عند الإبطاء $k=12$، مما يمرر نموذجاً مشوهاً وغير صالح للتنبؤ.
2. مخاطر الإفراط (Over-lagging): في المقابل، يؤدي اختيار عدد كبير جداً من الإبطاءات بالنسبة لحجم العينة (مثل اختيار $m=40$ في عينة مكونة من $n=80$) إلى إضعاف القوة الإحصائية للاختبار (Statistical Power). يعود ذلك إلى أن إحصائية $Q$ تقوم بجمع مربعات معاملات الارتباط، ومع زيادة الإبطاءات تتراكم معاملات ضئيلة جداً ناتجة عن ضجيج العينة العشوائي، في حين تتضخم درجات الحرية في توزيع كاي-تربيع المقابل بمقدار وحدة واحدة لكل إبطاء، مما يرفع القيمة الحرجة بصورة حادة ويجعل القيمة الاحتمالية ترتفع اصطناعياً مسببة الفشل في رفض الفرضية الصفرية رغم وجود ارتباط حقيقي.
6.3 برمجة حلقة تكرارية لتقييم حساسية النتائج عبر إبطاءات متعددة
لتفادي الوقوع في تحيزات اختيار فترة إبطاء منفردة، يُنصح بتطبيق “تحليل الحساسية” (Sensitivity Analysis) برمجياً عبر فحص سلوك القيمة الاحتمالية وإحصائية الاختبار عبر نطاق تدريجي واسع من الإبطاءات (مثل من $m=1$ إلى $m=30$). يتيح هذا النهج التأكد من استقرار القرار الإحصائي وعدم اعتماده على اختيار اعتباطي لفترة معينة.
يوضح الكود التالي بناء حلقة تكرارية مرئية في بايثون ترسم مسار القيمة الاحتمالية عبر فترات الإبطاء المختلفة مقارنة بخط العتبة الإحصائية $\alpha = 0.05$:
def plot_ljungbox_sensitivity(series, max_lags=30, model_df=0, title="Ljung-Box Sensitivity Analysis"):
"""
رسم استجابة القيمة الاحتمالية لاختبار ليونغ-بوكس عبر نطاق متدرج من فترات الإبطاء.
"""
lb_df = acorr_ljungbox(series, lags=max_lags, model_df=model_df, return_df=True)
plt.figure(figsize=(10, 5))
plt.plot(lb_df.index, lb_df['lb_pvalue'], marker='o', color='#1f77b4', lw=2, label='p-value')
plt.axhline(y=0.05, color='r', linestyle='--', label='Alpha Threshold (0.05)')
plt.title(title, fontsize=14, fontweight='bold')
plt.xlabel('Number of Lags (m)', fontsize=12)
plt.ylabel('Ljung-Box p-value', fontsize=12)
plt.ylim(-0.02, 1.02)
plt.xticks(np.arange(1, max_lags + 1, 2))
plt.legend(loc='best')
plt.tight_layout()
plt.show()
# تطبيق الدالة على سلسلة الضجيج الأبيض
plot_ljungbox_sensitivity(ts_white_noise, max_lags=20, title="Sensitivity Analysis: Pure White Noise")
7. تفسير المخرجات الإحصائية وقيمة الاحتمالية (P-Value Interpretation)
7.1 التفسير العلمي لقيمة p-value في سياق تشخيص النماذج
يمثل التفسير الدقيق للقيمة الاحتمالية ($p$-value) حجر الزاوية في اتخاذ القرارات المنهجية السليمة. في سياق تشخيص البواقي، يُعبر الحصول على $p\text{-value} > 0.05$ عن عدم وجود أدلة إحصائية كافية لرفض الفرضية الصفرية عند مستوى ثقة 95%. يدل هذا صراحة على أن معاملات الارتباط الذاتي التراكمية تقع ضمن النطاق المتوقع للتقلبات العشوائية لعملية الضجيج الأبيض، وهو مؤشر الجودة الأساسي الذي يبحث عنه المحلل للتحقق من كفاءة النموذج المقدر.
وعلى العكس من ذلك، فإن الحصول على $p\text{-value} le 0.05$ يمثل دليلاً إحصائياً قاطعاً على رفض الفرضية الصفرية لصالح الفرضية البديلة؛ مما يثبت وجود ارتباط ذاتي تسلسلي غير معالج في البواقي. يتطلب هذا القرار التوقف التام عن استخدام النموذج في التنبؤ أو الاستدلال، والعودة إلى مرحلة تحديد النموذج لإعادة ضبط الرتب الهيكلية أو معالجة المتغيرات المحذوفة.
من المغالطات الأكاديمية الشائعة الاعتقاد بأن القيمة الاحتمالية المرتفعة جداً (مثل $p = 0.98$) تعني أن النموذج “صحيح بنسبة 98%”. القيمة الاحتمالية ليست مقياساً لاحتمالية صحة النموذج، بل هي مجرد قياس لاحتمالية ملاحظة البيانات الحالية بافتراض صحة الفرضية الصفرية. كما أن قبول الفرضية الصفرية لا يعني إثبات صحتها القطعية، بل يعني ببساطة “الفشل في دحضها” استناداً إلى البيانات المتاحة وحجم العينة الحالي.
7.2 تقييم إحصائية كاي تربيع المقابلة (Q-Statistic)
إلى جانب القيمة الاحتمالية، يوفر الفحص المباشر لقيمة إحصائية الاختبار $Q_{LB}$ عمقاً تحليلياً إضافياً؛ حيث ترتبط قيمة $Q_{LB}$ طردياً مع شدة ومقدار الارتباطات الذاتية المقدرة. تُقارن القيمة المحسوبة للإحصائية مباشرة مع القيمة الجدولية الحرجة لتوزيع كاي-تربيع عند مستوى معنوية محدد ودرجات حرية $df$ معينة ($ chi^2_{alpha, df} $).
يوضح الجدول الإحصائي التالي أمثلة للقيم الحرجة المعيارية لتوزيع كاي-تربيع عند مستوى معنوية $\alpha = 0.05$ عبر درجات حرية مختلفة، والتي يمكن مقارنة إحصائية $Q$ المحسوبة بها مباشرة:
| درجات الحرية ($df$) | القيمة الحرجة ($ chi^2_{0.05, df} $) | حالة القرار إذا كانت $Q_{calc} > \chi^2_{crit}$ |
|---|---|---|
| 1 | 3.841 | رفض $H_0$ (وجود ارتباط ذاتي) |
| 4 | 9.488 | رفض $H_0$ (وجود ارتباط ذاتي) |
| 8 | 15.507 | رفض $H_0$ (وجود ارتباط ذاتي) |
| 12 | 21.026 | رفض $H_0$ (وجود ارتباط ذاتي) |
| 20 | 31.410 | رفض $H_0$ (وجود ارتباط ذاتي) |
يتيح تتبع الزيادة المتراكمة في قيمة $Q$ من فترة إبطاء إلى التي تليها معرفة الإبطاء الزمني المسؤول تحديداً عن القفزة الكبرى في الإحصائية؛ فإذا كانت الإحصائية تتزايد بمقادير ضئيلة ثم قفزت قفزة حادة عند الإبطاء $k=7$ مثلاً، دل ذلك على وجود أثر أسبوعي متخلف لم يتم استيعابه داخل النموذج.
7.3 معالجة النتائج المتأرجحة بين الدلالة وعدم الدلالة
يواجه الباحثون أحياناً حالات تقع فيها القيم الاحتمالية في “المنطقة الرمادية” أو النتائج الحدية (Marginal Significance)، مثل الحصول على قيم $p$ تتراوح بين $0.04$ و$0.07$، أو تجاوز العتبة الإحصائية عند إبطاء منفرد (مثل الإبطاء 3 فقط) بينما تظل كافة الإبطاءات الأخرى غير دالة إحصائياً. في هذه الحالات، يجب عدم التسرع في اتخاذ قرار ميكانيكي بحت.
يجب التمييز في هذه المواقف بين “الدلالة الإحصائية” (Statistical Significance) و”الدلالة العملية” (Practical/Substantive Significance). إذا كان حجم العينة ضخماً للغاية ($n > 5000$)، فإن الاختبار يصبح شديد الحساسية لأدنى انحراف طفيف في الارتباط الذاتي (مثل $\hat{\rho} = 0.03$) مما ينتج عنه قيم $p < 0.05$ على الرغم من أن هذا الارتباط لا يؤثر عملياً على كفاءة التنبؤ. في المقابل، إذا كانت النتيجة الحدية مصحوبة بمعامل ارتباط ذاتي ذي قيمة مطلقة واضحة في مخطط ACF، فإن التحفظ المنهجي يقتضي تعديل النموذج وإضافة معلمات إضافية لاستيعاب هذا الأثر.
8. تشخيص بواقي نماذج السلاسل الزمنية (ARIMA / SARIMA) في بايثون
8.1 بناء نموذج ARIMA واستخراج البواقي
تمثل النمذجة التكاملية للانحدار الذاتي والمتوسطات المتحركة (ARIMA) الأسلوب المعياري الأكثر استخداماً في التنبؤ بالسلاسل الزمنية. بعد ملاءمة نموذج ARIMA للبيانات، يجب استخراج مصفوفة البواقي المعيارية (Standardized Residuals) أو البواقي العادية لفحصها بدقة.
يوضح الكود التالي كيفية بناء وملاءمة نموذج ARIMA(1, 1, 1) على سلسلة زمنية باستخدام مكتبة Statsmodels، ثم استخراج البواقي وحساب مؤشراتها الإحصائية الأولية للتأكد من اقتراب متوسطها من الصفر وثبات تباينها:
from statsmodels.tsa.arima.model import ARIMA
# محاكاة سلسلة زمنية متكاملة غير مستقرة: Random Walk with Drift + ARMA
np.random.seed(42)
n_obs = 200
errors = np.random.normal(0, 1, n_obs)
simulated_data = np.zeros(n_obs)
for t in range(1, n_obs):
simulated_data[t] = 0.6 * simulated_data[t-1] + errors[t] + 0.4 * errors[t-1]
integrated_series = np.cumsum(simulated_data) + 50
# ملاءمة نموذج ARIMA(1, 1, 1)
model = ARIMA(integrated_series, order=(1, 1, 1))
fitted_model = model.fit()
# استخراج البواقي
residuals = fitted_model.resid
print(f"متوسط البواقي: {np.mean(residuals):.4f}")
print(f"الانحراف المعياري للبواقي: {np.std(residuals):.4f}")
print(fitted_model.summary())
8.2 تطبيق اختبار ليونغ-بوكس مع ضبط درجات الحرية الصحيحة
عند اختبار بواقي نموذج ARIMA(1, 1, 1) المشروح أعلاه، نلاحظ أن النموذج يشتمل على معلمة انحدار ذاتي واحدة ($p=1$) ومعلمة متوسطات متحركة واحدة ($q=1$). بالتالي، فإن مجموع المعلمات الديناميكية المقدرة هو $p + q = 1 + 1 = 2$.
يجب تمرير هذه القيمة صراحة إلى المعامل model_df=2 داخل دالة acorr_ljungbox. يضمن هذا الإجراء قيام Statsmodels بطرح 2 من درجات حرية توزيع كاي-تربيع عند حساب القيمة الاحتمالية لكل فترة إبطاء. يوضح الكود التالي التطبيق الصحيح للاختبار ومقارنة النتائج الخاطئة الناتجة عن إهمال ضبط model_df:
# التطبيق الصحيح للاختبار مع ضبط درجات الحرية: p + q = 2
correct_lb = acorr_ljungbox(residuals, lags=10, model_df=2, return_df=True)
# التطبيق الخاطئ (إهمال درجات حرية النموذج model_df=0)
incorrect_lb = acorr_ljungbox(residuals, lags=10, model_df=0, return_df=True)
# مقارنة القيم الاحتمالية
df_comparison = pd.DataFrame({
'Lag': correct_lb.index,
'Correct_pVal (df=m-2)': correct_lb['lb_pvalue'].values,
'Incorrect_pVal (df=m)': incorrect_lb['lb_pvalue'].values
}).set_index('Lag')
print("أثر ضبط درجات الحرية على القيم الاحتمالية:")
print(df_comparison.round(4))
8.3 استخدام أدوات التشخيص الرسومية المكملة
لا ينبغي الاعتماد على الاختبارات الرقمية بمعزل عن الفحص البصري التكميلي. توفر مكتبة Statsmodels دالة مدمجة قوية تُعرف باسم plot_diagnostics، تقوم بتوليد لوحة تشخيصية رباعية متكاملة للبواقي تتضمن: مسار البواقي عبر الزمن، وتوزيع التردد المدرج مقارنة بالتوزيع الطبيعي المعياري، ورسم الاحتمال الطبيعي (Q-Q Plot)، ومخطط دالة الارتباط الذاتي (Correlogram / ACF Plot).
يتيح الجمع بين المخططات البصرية والنتائج الرقمية لاختبار ليونغ-بوكس تكوين رؤية شاملة وحاسمة حول مطابقة النموذج للفرضيات الإحصائية. يوضح الكود التالي كيفية إنشاء لوحة التشخيص الرسومية:
# رسم اللوحة التشخيصية للبواقي
fig = plt.figure(figsize=(12, 8))
fitted_model.plot_diagnostics(fig=fig, lags=15)
plt.tight_layout()
plt.show()
9. مقارنة اختبار ليونغ-بوكس مع اختبارات الارتباط الذاتي الأخرى
9.1 المقارنة مع اختبار بوكس-بيرس (Box-Pierce Test)
يشترك اختبارا ليونغ-بوكس وبوكس-بيرس في نفس الصياغة النظرية للفرضيات، حيث يستهدف كلاهما فحص الارتباط الذاتي التراكمي. ومع ذلك، يكمن الفارق الجوهري في الصيغة الرياضية لحساب إحصائية الاختبار؛ حيث تكتفي إحصائية بوكس-بيرس بضرب حجم العينة في مجموع مربعات معاملات الارتباط الذاتي:
$$Q_{BP} = n \sum_{k=1}^{m} \hat{\rho}_k^2$$
في المقابل، تضيف إحصائية ليونغ-بوكس معامل التصحيح النسبي $\frac{n(n + 2)}{n – k}$ الذي يعوض انخفاض الدقة في العينات الصغيرة. وبسبب هذا التعديل، تتفوق إحصائية ليونغ-بوكس دائماً في الدقة والاستقرار التقاربي، مما جعلها المعيار المعتمد والمفضل في كافة البرمجيات الإحصائية الحديثة. يوضح الكود التالي المقارنة البرمجية المباشرة بين الاختبارين في بايثون:
# تشغيل فحص ليونغ-بوكس وبوكس-بيرس معاً
dual_test = acorr_ljungbox(residuals, lags=5, boxpierce=True, model_df=2, return_df=True)
print("مقارنة نتائج Ljung-Box مقابل Box-Pierce:")
print(dual_test[['lb_stat', 'lb_pvalue', 'bp_stat', 'bp_pvalue']].round(4))
9.2 المقارنة مع اختبار دوربن-واتسون (Durbin-Watson Test)
يُعد اختبار دوربن-واتسون (Durbin-Watson Test) أحد أقدم وأشهر اختبارات الارتباط الذاتي المستخدمة في نماذج الانحدار الخطي الكلاسيكي. تختلف فلسفة اختبار دوربن-واتسون جوهرياً عن ليونغ-بوكس في النطاق؛ حيث يقتصر دوربن-واتسون حصرياً على فحص الارتباط الذاتي من الدرجة الأولى فقط ($AR(1)$)، وتتراوح إحصائيته $d$ بين 0 و4 (حيث تدل القيمة 2 على غياب الارتباط، وأقل من 2 على ارتباط موجب، وأكبر من 2 على ارتباط سالب).
في المقابل، يتميز اختبار ليونغ-بوكس بالمرونة والشمولية التراكمية عبر فترات إبطاء متعددة ($k = 1, 2, dots, m$)، وهو ما يجعله الخيار الوحيد المناسب للسلاسل الزمنية المعقدة والنماذج الموسمية التي يظهر فيها الارتباط عند إبطاءات متقدمة تفوق الإبطاء الأول. يوضح الكود التالي كيفية تنفيذ اختبار دوربن-واتسون في بايثون لمقارنته باختبار ليونغ-بوكس:
from statsmodels.stats.stattools import durbin_watson
# حساب إحصائية دوربن-واتسون للبواقي
dw_statistic = durbin_watson(residuals)
print(f"إحصائية دوربن-واتسون (Durbin-Watson): {dw_statistic:.4f}")
# تفسير النتيجة: القيمة القريبة من 2 تدل على خلو الدرجة الأولى من الارتباط الذاتي
9.3 المقارنة مع اختبار بروش-جودفري (Breusch-Godfrey Test)
يُعرف اختبار بروش-جودفري (Breusch-Godfrey Test) أيضاً باسم اختبار مضاعف لاغرانج للارتباط التسلسلي (Lagrange Multiplier Test). يُعد هذا الاختبار البديل الأكثر قوة ومرونة في نماذج الانحدار والانحدار الذاتي، لا سيما عندما تشتمل النماذج على متغيرات تابعة مبطأة (Lagged Dependent Variables) كمتغيرات مفسرة في الطرف الأيمن من المعادلة، وهي الحالة التي يفقد فيها اختبار دوربن-واتسون صلاحيته تماماً.
يتميز بروش-جودفري بكونه متوافقاً مع نماذج الانحدار المتعدد، وقادراً على التعامل مع البواقي في ظل وجود عدم تجانس تباين معتدل عند استخدام مصفوفات التباين المصححة. ومع ذلك، يظل اختبار ليونغ-بوكس أسهل في التطبيق المباشر وأكثر ملاءمة لنماذج ARIMA النقية في مرحلة التشخيص السريع للسلاسل الزمنية الأحادية. يوضح الجدول التالي مقارنة شاملة بين الاختبارات الأربعة:
| وجه المقارنة | Ljung-Box | Box-Pierce | Durbin-Watson | Breusch-Godfrey (LM) |
|---|---|---|---|---|
| نطاق فترات الإبطاء | تراكمي متعدد ($1 to m$) | تراكمي متعدد ($1 to m$) | الدرجة الأولى فقط ($k=1$) | متعدد مخصص ($1 to p$) |
| كفاءة العينات الصغيرة | عالية جداً (مصحح) | منخفضة (انحياز نحو H0) | جيدة (تتطلب جداول حرجة) | تقاربية (تعتمد على LM) |
| وجود متغير تابع مبطأ | صالح في ARIMA المقيدة | صالح في ARIMA المقيدة | غير صالح نهائياً (متحيز) | صالح ومصمم خصيصاً له |
| الاستخدام الشائع | بواقي ARIMA والسلاسل النقية | تاريخي ومقارن | الانحدار الخطي الكلاسيكي OLS | نماذج الاقتصاد القياسي المتقدمة |
10. التعامل مع مشكلات الارتباط الذاتي الشائعة وتصحيح النماذج
10.1 استراتيجيات تعديل النموذج عند فشل الاختبار (رفض H0)
إذا أسفر اختبار ليونغ-بوكس عن رفض الفرضية الصفرية ($p\text{-value} le 0.05$) لبواقي النموذج المقدر، فإن ذلك يمثل إعلاناً رسمياً بعدم كفاية النموذج الحالي (Model Inadequacy). لتصحيح هذه المشكلة، يجب اتباع استراتيجيات هيكلية متدرجة:
- إعادة ضبط الرتب (Order Respecification): فحص دالتي الارتباط الذاتي (ACF) والارتباط الذاتي الجزئي (PACF) للبواقي الحالية لتحديد الرتب الناقصة؛ فإذا ظهر ارتباط معنوي عند الإبطاء الأول أو الثاني للبواقي، يتم رفع رتبة الانحدار الذاتي $p$ أو رتبة المتوسطات المتحركة $q$ في نموذج ARIMA بمقدار درجة إضافية ($p+1$ أو $q+1$).
- تطبيق أو زيادة درجة التفاضل (Differencing): إذا كان الارتباط الذاتي يتلاشى ببطء شديد عبر فترات إبطاء عديدة، فإن ذلك يشير إلى بقاء اتجاه عام (Stochastic Trend) غير مستقر، مما يتطلب زيادة درجة التفاضل $d$ من 0 إلى 1 أو من 1 إلى 2.
- إدماج المعلمات الموسمية (SARIMA): إذا ظهر رفض الفرضية الصفرية عند فترات إبطاء دورية محددة (مثل $k=12$ أو $k=24$)، يجب الانتقال من نموذج ARIMA البسيط إلى نموذج ARIMA الموسمي $SARIMA(p, d, q)(P, D, Q)_s$ واستيعاب التكرار الموسمي صراحة.
10.2 معالجة عدم تجانس التباين المشروط (ARCH Effects)
في السلاسل الزمنية المالية والاقتصادية، قد تفشل البواقي في اجتياز معايير الاستقلالية التامة على الرغم من انعدام الارتباط الذاتي الخطي في قيم البواقي ذاتها ($e_t$). يحدث ذلك عندما يتركز الارتباط في مربعات البواقي ($e_t^2$)، وهي الظاهرة المعروفة إحصائياً باسم “تجمع التقلبات” (Volatility Clustering) أو عدم تجانس التباين المشروط بالانحدار الذاتي (ARCH Effects).
يؤدي وجود تأثيرات ARCH إلى تشويه التوزيع المقارب لاختبار ليونغ-بوكس القياسي، مما يرفع من معدلات رفض الفرضية الصفرية زائفاً. للتحقق من هذه الظاهرة، يتم تطبيق اختبار ليونغ-بوكس مباشرة على مصفوفة مربعات البواقي (residuals**2)؛ فإذا ظهر ارتباط معنوي قوي، فإن العلاج المنهجي لا يكمن في إضافة معلمات ARIMA إضافية، بل في دمج نموذج تقلبات التباين مثل نماذج GARCH لنمذجة التباين المشروط المشترك.
يوضح الكود التالي كيفية فحص مربعات البواقي لاكتشاف تأثيرات ARCH في بايثون:
# فحص الارتباط الذاتي في مربعات البواقي للكشف عن تأثيرات ARCH
squared_residuals = residuals ** 2
arch_lb_test = acorr_ljungbox(squared_residuals, lags=10, return_df=True)
print("نتائج اختبار ليونغ-بوكس على مربعات البواقي (فحص تأثيرات ARCH):")
print(arch_lb_test.round(4))
10.3 التعامل مع التغيرات الهيكلية والقيم الشاذة (Outliers)
تتسبب الصدمات المفاجئة، والأزمات الاقتصادية، والأحداث الاستثنائية الحادة في توليد قيم شاذة متطرفة (Extreme Outliers) أو إحداث تغيرات هيكلية (Structural Breaks) في متوسط أو تباين السلسلة الزمنية. تؤدي هذه الانقطاعات إلى تشويه معاملات الارتباط الذاتي المحسوبة، مما يخلق انطباعاً زائفاً بوجود ارتباط تسلسلي ممتد عبر العينة بأكملها.
للتعامل مع هذه المعضلة، يُنصح بتطبيق اختبارات الكشف عن التغيرات الهيكلية (مثل اختبار تشاو Chow Test أو اختبارات الانقطاع المتعدد Bai-Perron). كما يمكن تقسيم السلسلة الزمنية إلى فترات فرعية مستقرة (Sub-periods) وتطبيق اختبار ليونغ-بوكس على كل فترة على حدة، أو استخدام متغيرات وهمية تصحيحية (Dummy Variables) لامتصاص أثر الصدمات الاستثنائية وتحييد تأثيرها المشوه على البواقي.
11. الأخطاء البرمجية والمفاهيمية الشائعة وكيفية تجنبها في بايثون
11.1 الأخطاء البرمجية الشائعة عند استخدام acorr_ljungbox
يقع العديد من المبرمجين ومحللي البيانات في أخطاء برمجية متكررة عند استدعاء وتنفيذ دالة acorr_ljungbox في بيئة بايثون، وتتضمن أبرز هذه الأخطاء ما يلي:
- تمرير بيانات تحتوي على قيم مفقودة (NaNs): تفشل الدالة فورياً وتنتج قيماً فارغة لجميع الإحصاءات إذا كانت السلسلة تتضمن أي قيمة مفقودة. يجب التأكد دائماً من تنظيف البيانات عبر
series.dropna()أو الاستيفاء قبل التمرير للدالة. - تجاهل توافق الإصدارات في نوع المخرجات: في الإصدارات القديمة من Statsmodels، كانت الدالة ترجع صفوفاً مجردة من المصفوفات، بينما في الإصدارات الحديثة ترجع
DataFrame. يؤدي محاولة تفكيك المخرجات بالطريقة القديمة (مثلstat, pval = acorr_ljungbox(...)) إلى انهيار البرنامج البرمجي (ValueError). - الخلط بين السلسلة الأصلية والبواقي: تمرير السلسلة الزمنية الخام بدلاً من البواقي الناتجة عن النموذج المقدر (
model.resid)، مما يقود إلى اختبار فرضية عشوائية السلسلة ذاتها وليس جودة ملاءمة النموذج.
11.2 المفاهيم الإحصائية المغلوطة
إلى جانب الأخطاء البرمجية، تشيع بعض المفاهيم الإحصائية المغلوطة التي تؤثر سلباً على سلامة الاستنتاجات العلمية:
- مغالطة “إثبات كمال النموذج”: الاعتقاد بأن اجتياز اختبار ليونغ-بوكس والحصول على قيمة $p > 0.05$ يعني أن النموذج هو الأفضل مطلقاً ولا يحتاج إلى مزيد من الفحص. الاختبار يثبت فقط غياب الارتباط الخطي، ولكنه لا يضمن اعتدالية التوزيع (Normality) أو ثبات التباين (Homoscedasticity) أو تفوق القدرة التنبؤية مقارنة بنماذج أخرى.
- تجاهل درجات الحرية في بواقي النماذج: ترك
model_df=0عند فحص بواقي نماذج ARIMA، وهو ما يغير درجات الحرية الفعلية ويؤدي إلى قرارات إحصائية مفرطة في التفاؤل بقبول الفرضية الصفرية خطأً. - المبالغة في عدد الإبطاءات: اختيار فترات إبطاء تفوق ثلث أو نصف حجم العينة، مما يؤدي إلى تآكل القوة الإحصائية للاختبار وتقديم نتائج مضللة.
11.3 أفضل الممارسات البرمجية والتحليلية (Best Practices)
لضمان أعلى معايير الجودة والاستقرار في خطوط أنابيب تحليل البيانات (Data Pipelines)، يُوصى باتباع مجموعة من أفضل الممارسات الهندسية والإحصائية في بايثون:
def validate_model_residuals(fitted_arima_model, max_lags=10, alpha=0.05):
"""
خط أنابيب مؤتمت بالكامل للتحقق من بواقي النموذج عبر توكيدات برمجية دقيقة.
"""
# استخراج البواقي وتحديد معلمات النموذج
resids = fitted_arima_model.resid
order = fitted_arima_model.model_orders
p = order.get('ar', 0)
q = order.get('ma', 0)
p_total = p + q
# التحقق من خلو البواقي من NaNs
clean_resids = resids.dropna()
assert len(clean_resids) > max_lags + p_total, "حجم العينة غير كافٍ لإجراء الاختبار بعدد الإبطاءات المطلوب."
# تنفيذ الاختبار
lb_df = acorr_ljungbox(clean_resids, lags=max_lags, model_df=p_total, return_df=True)
# فحص الفشل في رفض H0 لجميع الفترات بعد درجات الحرية
valid_pvals = lb_df['lb_pvalue'].dropna()
is_white_noise = (valid_pvals > alpha).all()
return {
'is_valid_white_noise': is_white_noise,
'summary_table': lb_df,
'min_pvalue': valid_pvals.min()
}
12. دراسة حالة تطبيقية متكاملة: تحليل سلسلة زمنية سلوكية خطوة بخطوة
12.1 وصف المشكلة وإعداد مجموعة البيانات السلوكية
في هذه الدراسة التطبيقية المتكاملة، سنقوم بمحاكاة وتحليل مشكلة بحثية واقعية في علم النفس السلوكي والقياس العصبي: قياس المستويات اليومية للتوتر النفسي والضغط العصبي (Daily Perceived Stress Scores) لدى عينة من الموظفين عبر فترة متابعة طولية مكثفة بلغت 365 يوماً متتالياً (سنة كاملة). يتمثل الهدف التحليلي في بناء نموذج ديناميكي دقيق قادر على تفسير مسار التوتر، واستخدام اختبار ليونغ-بوكس كمعيار حاسم للتأكد من خلو النموذج من الأنماط غير المفسرة.
سنبدأ بتحميل وتجهيز البيانات، وفحص استقرار السلسلة الزمنية باستخدام اختبار ديكي-فولر المعزز (Augmented Dickey-Fuller Test – ADF) للتأكد من خصائصها السكونية قبل النمذجة:
from statsmodels.tsa.stattools import adfuller
# محاكاة بيانات التوتر اليومية (AR(2) Process with Trend)
np.random.seed(555)
n_days = 365
noise = np.random.normal(0, 1.5, n_days)
stress_levels = np.zeros(n_days)
for t in range(2, n_days):
stress_levels[t] = 12.0 + 0.45 * stress_levels[t-1] + 0.25 * stress_levels[t-2] + noise[t]
dates = pd.date_range(start='2023-01-01', periods=n_days, freq='D')
stress_ts = pd.Series(stress_levels, index=dates, name="Stress_Level")
# فحص الاستقرارية عبر اختبار ADF
adf_result = adfuller(stress_ts)
print(f"ADF Statistic: {adf_result[0]:.4f}")
print(f"p-value: {adf_result[1]:.4f}")
# النتيجة: p-value < 0.05 تدل على أن السلسلة مستقرة بالفعل عند المستويات (d=0)
12.2 بناء النموذج التشخيصي وتطبيق اختبار ليونغ-بوكس
بما أن السلسلة مستقرة ($d=0$)، سنقوم بملاءمة نموذج انحدار ذاتي ومتوسطات متحركة $ARIMA(2, 0, 1)$ على بيانات التوتر السلوكي. بعد ذلك، سنستخرج البواقي ونقوم بتشغيل اختبار ليونغ-بوكس لعشر فترات إبطاء مع ضبط درجات الحرية الصحيحة ($p + q = 2 + 1 = 3$).
# بناء وملاءمة النموذج
stress_model = ARIMA(stress_ts, order=(2, 0, 1))
stress_fit = stress_model.fit()
# استخراج البواقي وتطبيق فحص ليونغ-بوكس مع model_df = 3
stress_resids = stress_fit.resid
stress_lb_results = acorr_ljungbox(stress_resids, lags=10, model_df=3, return_df=True)
print("التقرير الإحصائي لاختبار ليونغ-بوكس لبواقي نموذج التوتر السلوكي:")
print(stress_lb_results.to_string())
12.3 كتابة تقرير النتائج النهائي وفق المعايير الأكاديمية
عند توثيق النتائج الإحصائية للنشر في المجلات العلمية المحكمة وفق معايير جمعية علم النفس الأمريكية (APA Style – 7th Edition)، يجب صياغة النتائج بدقة بالغة تجمع بين المؤشرات الوصفية، معلمات النموذج المقدرة، وإحصاءات تشخيص البواقي. تُصاغ فقرة النتائج الرسمية على النحو التالي:
“تمت نمذجة درجات التوتر النفسي اليومية عبر الزمن باستخدام نموذج الانحدار الذاتي والمتوسطات المتحركة $ARIMA(2, 0, 1)$. أظهرت تقديرات المعلمات دلالة إحصائية لمعامل الانحدار الذاتي الأول ($\phi_1 = 0.421, p < 0.001$) والمعامل الثاني ($\phi_2 = 0.238, p < 0.001$). وللتحقق من كفاية النموذج وملاءمته الإحصائية، خضعت بواقي التقدير لاختبار ليونغ-بوكس للارتباط الذاتي التراكمي عبر 10 فترات إبطاء مع تعديل درجات الحرية لمطابقة معلمات النموذج ($df = m – 3$). كشفت النتائج عن عدم وجود دلالة إحصائية للارتباط الذاتي عبر جميع فترات الإبطاء المفحوصة؛ حيث سجلت إحصائية الاختبار عند فترة الإبطاء العاشرة قيمة $Q(7) = 5.812$ بقيمة احتمالية غير دالة ($p = 0.562$). تؤكد هذه النتائج استيفاء فرضية الاستقلالية والضجيج الأبيض للبواقي، وخلو النموذج من أي أنماط ديناميكية متبقية غير مفسرة، مما يجعله صالحاً للتنبؤ والاستدلال الإكلينيكي."
خاتمة وتوصيات منهجية
يمثل اختبار ليونغ-بوكس (Ljung-Box Test) ركيزة منهجية لا غنى عنها في ترسانة الأدوات الإحصائية لكل باحث ومحلل يتعامل مع البيانات الزمنية المعقدة. إن قدرة الاختبار على تجميع معاملات الارتباط الذاتي وضبط أوزانها بما يتلاءم مع قيود العينات المحدودة تمنحه تفوقاً استدلالياً ملحوظاً على الاختبارات الكلاسيكية التقليدية.
ومع ذلك، تظل الفائدة التطبيقية لهذا الاختبار مرتبطة ارتباطاً وثيقاً بوعي المحلل بالشروط الرياضية والبرمجية الحاكمة لتنفيذه في بايثون؛ وفي مقدمتها ضبط درجات الحرية المرتبطة بمعلمات النموذج المقدر (model_df)، والاختيار الرشيد لعدد فترات الإبطاء دون إفراط أو تفريط، ودمج الاختبارات الرقمية مع أدوات التشخيص البصري وفحوصات عدم تجانس التباين. إن اتباع هذه الممارسات المنهجية الرصينة يضمن بناء نماذج قياسية متينة، موثوقة إحصائياً، وقادرة على توليد تنبؤات علمية دقيقة تخدم مسارات البحث العلمي وصناعة القرار العملي.
References
- Box, G. E. P., & Pierce, D. A. (1970). Distribution of residual autocorrelations in autoregressive-integrated moving average time series models. Journal of the American Statistical Association, 65(332), 1509–1526. https://doi.org/10.1080/01621459.1970.10481180
- Box, G. E. P., Jenkins, G. M., Reinsel, G. C., & Ljung, G. M. (2015). Time Series Analysis: Forecasting and Control (5th ed.). John Wiley & Sons. https://www.wiley.com/
- Breusch, T. S. (1978). Testing for autocorrelation in dynamic linear models. Australian Economic Papers, 17(31), 334–355. https://doi.org/10.1111/j.1467-8454.1978.tb00635.x
- Durbin, J., & Watson, G. S. (1950). Testing for serial correlation in least squares regression: I. Biometrika, 37(3/4), 409–428. https://doi.org/10.2307/2332388
- Godfrey, L. G. (1978). Testing against general autoregressive and moving average error models when the regressors include lagged dependent variables. Econometrica, 46(6), 1293–1301. https://doi.org/10.2307/1913829
- Hyndman, R. J., & Athanasopoulos, G. (2021). Forecasting: Principles and Practice (3rd ed.). OTexts. https://otexts.com/fpp3/
- Ljung, G. M., & Box, G. E. P. (1978). On a measure of lack of fit in time series models. Biometrika, 65(2), 297–303. https://doi.org/10.1093/biomet/65.2.297
- Seabold, S., & Perktold, J. (2010). Statsmodels: Econometric and statistical modeling with python. In Proceedings of the 9th Python in Science Conference (Vol. 57, pp. 61–65). https://doi.org/10.25080/Majora-92bf1922-011
- Tsay, R. S. (2010). Analysis of Financial Time Series (3rd ed.). John Wiley & Sons. https://www.wiley.com/