كيفية إجراء اختبار فيشر الدقيق في R
يُعد التحليل الإحصائي للبيانات الفئوية (Categorical Data Analysis) أحد الركائز الأساسية التي يعتمد عليها الباحثون في العلوم النفسية، والسلوكية، والطبية، والاجتماعية لفهم العلاقات المعقدة بين المتغيرات الاسمية وتفسيرها. في خضم الممارسات البحثية الواقعية، يواجه المتخصصون تحديات منهجية متكررة تتعلق بحجم العينات المتاحة للدراسة؛ لا سيما عند دراسة ظواهر نفسية نادرة، أو اضطرابات إكلينيكية محددة الانتشار، أو عند إجراء تجارب معملية مصغرة تتطلب معايير ضبط بالغة الصرامة تجعل من جمع أعداد كبيرة من الملاحظات أمراً متعذراً أو غير واقعي من حيث التكلفة والوقت. في مثل هذه البيئات البحثية المقيدة، تنهار الافتراضات التوزيعية التقليدية التي تقوم عليها الاختبارات الإحصائية المعلمية والتقاربية المألوفة.
يمثل اختبار كاي تربيع للاستقلالية (Chi-Square Test of Independence) الخيار الكلاسيكي الأكثر شيوعاً لدراسة الارتباط بين المتغيرات الفئوية داخل جداول التوافق (Contingency Tables)، إلا أن اعتماده البنيوي على التقريب التقاربي (Asymptotic Approximation) يجعله غير صالح للاستخدام عندما ينخفض حجم العينة الكلي أو عندما تقل التكرارات المتوقعة داخل خلايا الجدول عن مستويات حرجة محددة. هنا يبرز اختبار فيشر الدقيق (Fisher’s Exact Test) كحل رياضي ومنهجي لا غنى عنه، إذ يتجاوز قيود التوزيع التقاربي من خلال حسابه المباشر للاحتمالات الشرطية الدقيقة وفق التوزيع فوق الهندسي، مما يوفر للباحث استدلالاً إحصائياً صارماً لا يتأثر بانخفاض حجم العينة.
تتكامل هذه الموثوقية الرياضية مع القوة الحوسبية التي توفرها لغة البرمجة الإحصائية الرائدة R، والتي تقدم بيئة مرنة وشاملة لتنفيذ اختبار فيشر الدقيق، سواء في شكله الثنائي الكلاسيكي (جداول 2×2) أو في امتداداته متعددة الأبعاد (جداول R × C)، مع إمكانية استخراج المؤشرات الإحصائية المرافقة مثل نسبة الأرجحية (Odds Ratio) وفترات الثقة، وتمثيل النتائج بيانياً وتوثيقها بصورة أكاديمية دقيقة تتماشى مع أرقى المعايير الدولية. يهدف هذا المقال الشامل إلى تزويد الباحث والمحلل بدليل نظري وتطبيقي متكامل لإجراء اختبار فيشر الدقيق في بيئة R وفهم أسسه الرياضية وتطبيقاته النفسية والإكلينيكية بعمق.
## 1. مقدمة عامة حول اختبار فيشر الدقيق وأهميته في البحث الإحصائي والنفسي
### 1.1 تعريف اختبار فيشر الدقيق وسياقه التاريخي
يعود الفضل في تطوير اختبار فيشر الدقيق إلى عالم الإحصاء والجينات البريطاني الشهير السير رونالد فيشر (Sir Ronald A. Fisher)، الذي طرح هذا الابتكار المنهجي عام 1935 في كتابه التأسيسي “تصميم التجارب” (The Design of Experiments). وقد نشأت الفكرة في سياق حادثة شهيرة عُرفت بـ “تجربة سيدة تتذوق الشاي” (The Lady Tasting Tea)؛ حيث ادعت إحدى زميلاته في محطة “روثامستد” التجريبية، وهي الدكتورة مورييل بريستول (Muriel Bristol)، قدرتها على التمييز بحاستي الشم والتذوق عما إذا كان الحليب قد سُكب في الفنجان أولاً ثم الشاي، أم أن الشاي سُكب أولاً ثم أُضيف الحليب. صمم فيشر تجربة لاختبار هذه الفرضية تضمنت تقديم ثمانية فناجين موزعة عشوائياً (أربعة حليب أولاً، وأربعة شاي أولاً)، وطور صيغة رياضية دقيقة لحساب احتمال تحقيق ذلك الأداء بمحض الصدفة البحتة.
من المنظور الإحصائي الحديث، يُعرف اختبار فيشر الدقيق بأنه اختبار لا معلمي (Non-parametric Test) دقيق يُستخدم لفحص استقلالية المتغيرات الفئوية الاسمية في جداول التوافق، ولا سيما الجداول ذات البعد 2×2. وتكمن كلمة “الدقيق” (Exact) في كونه لا يعتمد على دالة توزيع احتمالي تقاربية تتطلب افتراض اقتراب حجم العينة من اللانهاية (كما هو الحال في اختبار كاي تربيع لبيرسون)، بل يعتمد على الحساب المباشر والتام للاحتمال الدقيق لظهور التكرارات الملاحظة في مصفوفة البيانات بالاعتماد على التباديل والتوافيق المنبثقة من التوزيع فوق الهندسي (Hypergeometric Distribution).
تتجلى الأهمية الإبستمولوجية لهذا الاختبار في توفيره حماية رياضية صارمة ضد القرارات الإحصائية الخاطئة عند التعامل مع الجداول الصغيرة. في التطبيقات الإحصائية التقليدية، يؤدي استخدام التقريبات التقاربية في عينات غير كافية إلى تشوه حاد في مستويات الدلالة المحسوبة، مما يرفع احتمالية الوقوع في الخطأ من النوع الأول (Type I Error). وعليه، يمثل اختبار فيشر المعيار الذهبي المطلق لتقييم الارتباط في الجداول ذات الأحجام المحدودة نظراً لعدم تأثره بالتشوهات الناتجة عن التقريب الإحصائي.
### 1.2 متى نلجأ إلى اختبار فيشر الدقيق؟
تنشأ الحاجة المنهجية لاختبار فيشر الدقيق عند التعامل مع جداول التوافق ذات البعد 2×2 الناتجة عن تقاطع متغيرين اسميين ثنائيي التقسيم (Dichotomous Nominal Variables)، عندما ينخفض حجم العينة الكلي (N) بحيث لا تعود الافتراضات الرياضية لاختبار كاي تربيع صالحة للتطبيق. تضع المعايير الإحصائية الكلاسيكية شروطاً صارمة لصلاحية اختبار كاي تربيع؛ حيث يُشترط ألا يقل التكرار المتوقع (Expected Frequency) داخل أي خلية من خلايا الجدول عن 5 في جداول 2×2، وألا يقل عن ذلك في أكثر من 20% من الخلايا في الجداول الأكبر حجماً، مع ضرورة ألا ينخفض أي تكرار متوقع عن 1 مطلقاً.
عندما ينكسر هذا الافتراض، كأن يظهر تكرار متوقع يقل عن 5 في خلية واحدة أو أكثر، يصبح اللجوء إلى اختبار فيشر الدقيق أمراً حتمياً وليس مجرد خيار تفضيلي. فالانخفاض في التكرارات المتوقعة، حتى لو كان التكرار الملاحظ داخل الخلية كبيراً، يخل بالاستقرار التقاربي لتوزيع كاي تربيع، مما يجعل القيمة الاحتمالية الناتجة (p-value) غير دقيقة ومضللة لمتخذ القرار الإحصائي.
علاوة على ذلك، يمثل اختبار فيشر الدقيق الجسر المنهجي الذي يربط بين المتطلبات الصارمة لتحليل البيانات الاسمية والمحددات العملية للتصاميم التجريبية المعقدة. فبينما تتطلب الاختبارات المعلمية افتراضات متشددة حول التوزيع الطبيعي وتجانس التباين في البيانات الكمية، يتطلب التعامل مع المتغيرات الاسمية تقييماً دقيقاً للاحتمالات الشرطية للملاحظات المصنفة. يوفر اختبار فيشر استدلالاً متيناً دون الحاجة لافتراض اعتدالية البيانات أو اشتراط أحجام عينات ضخمة، مما يجعله الأداة المثالية في العينات الميكروية (Micro-samples).
### 1.3 تطبيقات الاختبار في علم النفس والعلوم السلوكية
يحتل اختبار فيشر الدقيق مكانة محورية في بحوث علم النفس الإكلينيكي، والعلوم العصبية السلوكية، والطب النفسي، حيث تفرض طبيعة الظواهر المدروسة قيوداً جوهرية على أحجام العينات. من أبرز هذه التطبيقات دراسة الاستجابات العلاجية للحالات الإكلينيكية النادرة، مثل متلازمات الاضطرابات النفسية قليلة الشيوع (كالاضطرابات التفارقية الحادة، أو بعض اضطرابات الشخصية غير النمطية، أو الاضطرابات الجينية المرتبطة باعتلالات سلوكية نادرة)، حيث يندر أن تتجاوز العينات المتاحة للباحث بضع عشرات من الأفراد، مما يجعل استخدام الاختبارات التقاربية أمراً يفتقر إلى الرصانة العلمية.
كما يُعد الاختبار أداة مثالية لتقييم فعالية التدخلات العلاجية السلوكية والمعرفية في العينات التجريبية الصغيرة (Pilot Intervention Studies). فعند تجريب بروتوكول علاجي جديد على عينة محدودة مكونة من مجموعة تجريبية وأخرى ضابطة لتقييم حدوث التحسن (متحسن / غير متحسن)، يوفر اختبار فيشر الدقيق تقديراً إحصائياً قاطعاً لما إذا كان التحسن الملاحظ ناتجاً عن التدخل النفسي أم أنه مجرد تباين عشوائي ناتج عن الصدفة، مع تزويد الباحث بمؤشر كمي دقيق لحجم التأثير.
يمتد استخدام الاختبار أيضاً إلى فحص العلاقات الارتباطية بين المتغيرات الديموغرافية الاسمية وظواهر سلوكية محددة في عينات التجمعات الخاصة، مثل دراسة السلوك الانتحاري بين نزلاء المؤسسات الإصلاحية ذوي الخصائص النفسية المحددة، أو تحليل أنماط الاستجابة للمحفزات العصبية لدى مجموعات فرعية من المرضى في أبحاث الرنين المغناطيسي الوظيفي (fMRI)، حيث تتطلب الكلفة العالية للتجارب وحساسية العينات الاكتفاء بأعداد صغيرة من المبحوثين مع الحفاظ على الدقة الاستدلالية القصوى.
## 2. الأسس النظرية والرياضية لاختبار فيشر الدقيق
### 2.1 التوزيع فوق الهندسي (Hypergeometric Distribution)
يقوم البناء الرياضي لاختبار فيشر الدقيق بالكامل على أسس نظرية الاحتمالات المرتبطة بـ التوزيع فوق الهندسي، وهو التوزيع الذي يصف احتمال وقوع عدد معين من النجاحات في سلسلة من السحوبات دون إرجاع (Sampling without replacement) من مجتمع إحصائي محدود. في سياق جداول التوافق 2×2، يُفترض أن الجدول يتكون من صفين وعمودين يمثلان تقاطع متغيرين ثنائيين، ويحتوي على الخلايا الملاحظة المرموز لها بالحروف (a, b, c, d)، بحيث يمثل a التكرار في الصف الأول والعمود الأول، وb في الصف الأول والعمود الثاني، وc في الصف الثاني والعمود الأول، وd في الصف الثاني والعمود الثاني.
يفترض فيشر في هذا البناء الرياضي ثبات المجاميع الهامشية (Fixed Marginal Totals)، أي أن مجاميع الصفوف:
– مجموع الصف الأول: $R_1 = a + b$
– مجموع الصف الثاني: $R_2 = c + d$
ومجاميع الأعمدة:
– مجموع العمود الأول: $C_1 = a + c$
– مجموع العمود الثاني: $C_2 = b + d$
مع بقاء الحجم الكلي للعينة ثابتًا: $N = a + b + c + d = R_1 + R_2 = C_1 + C_2$.
بناءً على شرط ثبات الهوامش وتحت مظلة الفرضية الصفرية القائلة بعدم وجود ارتباط بين المتغيرين، تصبح معرفة قيمة خلية واحدة فقط (ولتكن الخلية a) كافية لتحديد قيم باقي الخلايا تلقائياً. يُعطى احتمال الحصول على هذا التوزيع المحدد من الملاحظات بالمعادلة الدقيقة التالية:
$$P(X = a) = \frac{\binom{a+b}{a} \binom{c+d}{c}}{\binom{N}{a+c}} = \frac{(a+b)! , (c+d)! , (a+c)! , (b+d)!}{a! , b! , c! , d! , N!}$$
حيث تشير علامة المضروب (!) إلى حاصل ضرب الأعداد الصحيحة الموجبة التنازلية. تحسب هذه الصيغة الاحتمال الدقيق لوقوع مصفوفة البيانات الملاحظة بالتحديد ضمن فضاء العينة لجميع المصفوفات الممكنة التي تشترك في نفس المجاميع الهامشية الثابتة.
### 2.2 مفهوم نسبة الأرجحية (Odds Ratio) وحجم التأثير
تُعد نسبة الأرجحية (Odds Ratio – OR) المعيار الكمي الأساسي الذي يرتكز عليه اختبار فيشر لتقدير حجم التأثير (Effect Size) والاتجاه في جداول التوافق 2×2. تُعرف “الأرجحية” (Odds) عموماً بأنها النسبة بين احتمال وقوع حدث معين إلى احتمال عدم وقوعه. في جدول التوافق الثنائي، تُحسب أرجحية وقوع الحدث في المجموعة الأولى (الصف الأول) بالصيغة:
$$\text{Odds}_1 = \frac{a}{b}$$
بينما تُحسب أرجحية وقوع الحدث في المجموعة الثانية (الصف الثاني) بالصيغة:
$$\text{Odds}_2 = \frac{c}{d}$$
وبناءً على ذلك، يتم تعريف نسبة الأرجحية (OR) كحاصل قسمة أرجحية المجموعة الأولى على أرجحية المجموعة الثانية، وتأخذ الصيغة الرياضية المتقاطعة الشهيرة:
$$\text{OR} = \frac{\text{Odds}_1}{\text{Odds}_2} = \frac{a / b}{c / d} = \frac{a \cdot d}{b \cdot c}$$
يحمل هذا المؤشر دلالات إحصائية ونفسية بالغة الأهمية:
– إذا كانت قيمة $\text{OR} = 1$: فهذا يشير إلى استقلالية تامة بين المتغيرين؛ أي أن أرجحية وقوع الحدث متساوية تماماً في كلا المجموعتين، ولا يوجد أي ارتباط.
– إذا كانت قيمة $\text{OR} > 1$: فهذا يعني أن الحدث المدروس أكثر ترجيحاً للحدوث في المجموعة الأولى مقارنة بالمجموعة الثانية (ارتباط إيجابي).
– إذا كانت قيمة $\text{OR} 1$ (اختبار زيادة الأرجحية).
– فرضية الطرف الأيسر (Less): $H_A: \theta < 1$ (اختبار انخفاض الأرجحية أو الأثر الوقائي).
يؤثر اختيار نوع الفرضية البديلة تأثيراً مباشراً على كيفية حساب القيمة الاحتمالية النهائية ($p$-value)، إذ يحدد فضاء التوزيعات التي سيتم جمع احتمالاتها لتقييم مدى تطرف البيانات الملاحظة مقارنة بالصدفة.
## 3. المقارنة المنهجية بين اختبار كاي تربيع واختبار فيشر الدقيق
### 3.1 حدود وافتراضات اختبار كاي تربيع للاستقلالية
يُعد اختبار كاي تربيع للاستقلالية الذي طوره كارل بيرسون (Karl Pearson) واحداً من أوسع الاختبارات الإحصائية استخداماً في تحليل البيانات الفئوية، إلا أن موثوقيته ترتبط عضوياً بمدى استيفاء افتراضات العينة الكبيرة. يعتمد الاختبار على المقارنة بين التكرارات الملاحظة ($O$) والتكرارات المتوقعة ($E$) عبر الصيغة:
$$\chi^2 = \sum \frac{(O – E)^2}{E}$$
تستند هذه الصيغة إلى افتراض أن التوزيع الإحصائي لهذه الإحصاءة يتقارب تدريجياً نحو توزيع كاي تربيع النظري عندما يكبر حجم العينة بدرجة كافية.
وفقاً لقاعدة كوتشران المنهجية الشهيرة (Cochran’s Criterion)، يُعتبر تقريب كاي تربيع غير صالح إذا كان التكرار المتوقع في أي خلية يقل عن 5 في جداول 2×2، أو إذا احتوت أكثر من 20% من الخلايا على تكرارات متوقعة تقل عن 5 في الجداول الأكبر. عند انتهاك هذه الشروط، يحدث تضخم حاد في معدل الخطأ من النوع الأول ($\alpha$)، حيث يميل الاختبار إلى إعطاء قيم $p$ صغيرة بصورة وهمية، مما يقود الباحث إلى رفض الفرضية الصفرية واستنتاج وجود فروق أو علاقات وهمية لا وجود لها فعلياً في المجتمع.
حاول فرانك ييتس (Frank Yates) معالجة هذا القصور في جداول 2×2 عبر اقتراح “تصحيح ييتس للاستمرارية” (Yates’ Continuity Correction)، والذي يقوم على خصم القيمة 0.5 من الفروق المطلقة بين التكرارات الملاحظة والمتوقعة قبل تربيعها:
$$\chi^2_{\text{Yates}} = \sum \frac{(|O – E| – 0.5)^2}{E}$$
ورغم أن تصحيح ييتس كان خطوة لتحسين التقريب في العينات المتوسطة، إلا أن الدراسات الإحصائية الحديثة أظهرت أنه يميل إلى الإفراط الشديد في التحفظ (Over-conservatism)، مما يؤدي إلى خفض القوة الإحصائية بصورة غير مبررة ورفع معدل الخطأ من النوع الثاني (Type II Error)، أي الفشل في اكتشاف التأثيرات الحقيقية، فضلاً عن بقائه مجرد تقريب لا يقدم حلاً رياضياً دقيقاً في العينات الصغيرة جداً.
### 3.2 الفروق الحسابية: الدقة التامة مقابل التقريب التقاربي
يكمن الفارق الجوهري بين اختبار كاي تربيع واختبار فيشر الدقيق في المنهجية الحسابية المتبعة لتوليد القيمة الاحتمالية ($p$-value). في اختبار كاي تربيع، يتم حساب قيمة إحصائية واحدة ($\chi^2$) ثم مقارنتها بالدالة التراكمية لتوزيع كاي تربيع النظري المقابل لدرجات الحرية المعنية ($df = (r-1)(c-1)$). هذه العملية تقاربية بحتة، وتفترض مسبقاً أن التكرارات تتوزع بصورة متصلة وتتبع توزيعاً طبيعياً متعدد المتغيرات في خلفيتها التوافقية، وهو افتراض يسقط تماماً في العينات الصغيرة.
في المقابل، يتجاوز اختبار فيشر الدقيق فكرة الإحصاءة التوزيعية الوسيطة، ويقوم بحساب الدلالة الفعلية عبر توليد كافة الجداول الممكنة نظرياً التي تشترك في نفس المجاميع الهامشية للجدول الملاحظ. يقوم الاختبار بحساب الاحتمال التوافقي الدقيق لكل جدول ممكن باستخدام التوزيع فوق الهندسي، ثم تُحسب القيمة الاحتمالية النهائية ($p$-value) بجمع احتمالات جميع الجداول التي تمتلك احتمالية حدوث مساوية أو أقل من احتمالية الجدول الملاحظ (أي الجداول الأكثر تطرفاً في اتجاه الفرضية البديلة).
| وجه المقارنة | اختبار كاي تربيع للاستقلالية | اختبار فيشر الدقيق |
| :— | :— | :— |
| **الأساس الرياضي** | تقريب تقاربي نحو توزيع كاي تربيع | توزيع فوق هندسي دقيق وتوافقي |
| **متطلبات حجم العينة** | يتطلب عينات كبيرة وتكرارات متوقعة $ge 5$ | صالح تماماً للعينات الصغيرة والصغيرة جداً |
| **طبيعة القيمة الاحتمالية** | قيمة احتمالية تقريبية (Asymptotic) | قيمة احتمالية دقيقة تامة (Exact) |
| **مقياس حجم التأثير** | معامل فاي ($phi$) أو كرامر ($V$) | نسبة الأرجحية ($\text{Odds Ratio}$) |
| **الافتراضات الهامشية** | هوامش عشوائية غير مشروطة بالضرورة | هوامش مفترضة الثبات مشروطاً |
| **القوة في العينات الضخمة** | عالية جداً وسريعة حسابياً | مكافئة تماماً لكاي تربيع لكنها مكلفة حوسبياً |
من حيث القوة الإحصائية (Statistical Power)، يتفوق اختبار فيشر تفوقاً مطلقاً في العينات الصغيرة نظراً لأنه يعطي تحكماً تاماً وصارماً في معدل الخطأ من النوع الأول عند المستوى الاسمي المحدد ($\alpha = 0.05$). ومع نمو حجم العينة إلى مئات أو آلاف الحالات، تتطابق نتائج كلا الاختبارين تقريباً حيث يتقارب التوزيع فوق الهندسي مع التوزيع التقاربي، إلا أن تكلفة الحسابات التوافقية في فيشر تزداد أُسياً، مما يجعل كاي تربيع أكثر ملاءمة وعملية في العينات الكبيرة جداً.
### 3.3 شجرة اتخاذ القرار لاختيار الاختبار الإحصائي المناسب
لتوجيه الباحث في العلوم النفسية والسلوكية نحو اتخاذ القرار المنهجي الصحيح عند تحليل البيانات الفئوية الثنائية، يمكن صياغة خوارزمية منهجية واضحة تستند إلى المعايير الإحصائية المعتمدة وتصميم التجربة:
1. فحص طبيعة المتغيرات:
– هل كلا المتغيرين فئويان اسميان؟ إذا كانت الإجابة نعم، ننتقل لتقييم حجم العينة والجدول.
2. التحقق من أبعاد جدول التوافق:
– هل الجدول ذو أبعاد 2×2؟ أم أنه جدول متعدد الفئات $R \times C$؟
3. في حالة جداول 2×2:
– حساب مصفوفة التكرارات المتوقعة (Expected Frequencies) لكل خلية عبر المعادلة: $E_{ij} = \frac{R_i \cdot C_j}{N}$.
– فحص الحد الأدنى للتكرار المتوقع:
– إذا كانت **جميع** التكرارات المتوقعة $ge 5$ وحجم العينة الإجمالي $N > 40$: يمكن استخدام اختبار كاي تربيع لبيرسون بثقة تامة.
– إذا كان **أي** تكرار متوقع أقل من 5 ($E < 5$)، أو كان حجم العينة الكلي صغيراً ($N < 40$): **يجب إلزامياً استخدام اختبار فيشر الدقيق**.
4. في حالة جداول $R \times C$ (أكبر من 2×2):
– إذا احتوت أكثر من 20% من الخلايا على تكرارات متوقعة أقل من 5، أو وُجدت أي خلية بتكرار متوقع أقل من 1: يُستخدم الامتداد متعدد الأبعاد لاختبار فيشر الدقيق مع اللجوء إلى محاكاة مونت كارلو في حال التعقيد الحسابي.
5. النظر في طبيعة تثبيت الهوامش (Marginal Totals):
– في التصاميم التجريبية التي يحدد فيها الباحث مسبقاً أحجام المجموعات (مثلاً: تعيين 15 مريضاً في مجموعة العلاج السلوكي و15 في المجموعة الضابطة، مع تثبيت عدد النتائج الممكنة)، تتطابق بنية التجربة تطابقاً بنيوياً تاماً مع النموذج الرياضي لاختبار فيشر ذي الهوامش المثبتة.
## 4. إعداد بيئة العمل وهيكلة البيانات في برمجية R
### 4.1 تجهيز بيئة R الأساسية وتحميل الحزم المساعدة
تتميز بيئة البرمجة الإحصائية R بأن دالة اختبار فيشر الدقيق مدمجة بشكل افتراضي في نظامها الأساسي عبر حزمة `stats` المحملة تلقائياً عند بدء التشغيل تحت اسم الدالة `fisher.test()`. هذا يعني أن الباحث يستطيع إجراء التحليل الإحصائي الأساسي دون الحاجة لتثبيت أي ملحقات خارجية. ومع ذلك، تتطلب المعالجة المتقدمة للبيانات، وتصوير النتائج بصرياً، وحساب مؤشرات الوبائيات السلوكية المرافقة، الاستعانة ببعض الحزم المتخصصة في مستودع CRAN.
تتضمن الحزم الأساسية الموصى بها في هذا السياق:
– حزمة `tidyverse`: وتضم مجموعة متكاملة من الأدوات مثل `dplyr` لتنظيف البيانات وهيكلتها و`ggplot2` للتصوير البياني الاحترافي.
– حزمة `epitools`: لتوفير أدوات حسابية متقدمة لنسب الأرجحية وفترات ثقتها واختبارات الارتباط الوبائي والسلوكي.
– حزمة `vcd` (Visualizing Categorical Data): المتخصصة في تمثيل البيانات الفئوية عبر مخططات الموزاييك والارتباط البصري.
– حزمة `ggstatsplot`: لدمج نتائج الاختبارات الإحصائية ومؤشراتها مباشرة فوق الأشكال البيانية التوضيحية بجودة عالية.
لضمان إمكانية تكرار النتائج الإحصائية (Reproducibility)، خصوصاً عند إجراء المحاكاة العشوائية في الجداول الكبيرة، يُنصح دائماً بتعيين البذرة العشوائية في بداية جلسة العمل باستخدام الأمر `set.seed()`. كما يجب التحقق من إصدار لغة R المستخدم لضمان توافق الدوال البرمجية.
لتثبيت وتحميل الحزم المساعدة، يُنفذ الأمر البرمجي التالي داخل بيئة R:
“`r
# تثبيت الحزم المطلوبة (تُنفذ مرة واحدة فقط)
install.packages(c(“tidyverse”, “epitools”, “vcd”, “ggstatsplot”, “gt”))
# تحميل الحزم في جلسة العمل الحالية
library(tidyverse)
library(epitools)
library(vcd)
library(ggstatsplot)
library(gt)
# ضبط البذرة العشوائية لضمان تكرار نتائج المحاكاة
set.seed(12345)
“`
### 4.2 إنشاء جداول التوافق 2×2 من مصفوفات البيانات
توجد طرق برمجية متعددة لبناء جداول التوافق في R، وتعتمد الطريقة المختارة على هيئة البيانات المتاحة لدى الباحث (سواء كانت بيانات مجمعة مسبقاً في هيئة تكرارات ملخصة، أو بيانات خام مسجلة لكل مبحوث على حدة).
عندما يمتلك الباحث التكرارات الملخصة مسبقاً، فإن الطريقة الأسرع والأكثر مباشرة هي إنشاء مصفوفة ثنائية الأبعاد باستخدام دالة `matrix()`. يتم تمرير التكرارات كمتجه رقمي مع تحديد عدد الصفوف والأعمدة، مع ضرورة إسناد أسماء واضحة ومحددة للصفوف والأعمدة عبر الوسيط `dimnames` لضمان قراءة المخرجات وتفسير نسبة الأرجحية بشكل صحيح لاحقاً:
“`r
# إنشاء مصفوفة 2×2 لتكرارات ملاحظة
# البيانات تمثل: الصفوف (بروتوكول العلاج: علاج سلوكي CBT مقابل قائمة انتظار Waitlist)
# الأعمدة (النتيجة الإكلينيكية: تحسن Remission مقابل عدم تحسن No_Remission)
contingency_matrix <- matrix(
c(12, 3, 4, 11),
nrow = 2,
byrow = TRUE,
dimnames = list(
Treatment = c("CBT", "Waitlist"),
Outcome = c("Remission", "No_Remission")
)
)
# عرض المصفوفة في شاشة المخرجات
print(contingency_matrix)
“`
في المقابل، إذا كانت البيانات مخزنة في إطار بيانات خام (Data Frame) يحتوي على صف لكل مشارك ومتغيرين فئويين يمثلان التصنيف، يمكن تحويل هذه البيانات إلى جدول توافق بسهولة بالغة باستخدام دالة `table()` أو دالة المعادلات التقاطعية `xtabs()`:
“`r
# إنشاء إطار بيانات تجريبي يمثل بيانات خام لـ 30 مريضاً
clinical_df <- data.frame(
Patient_ID = 1:30,
Therapy = factor(c(rep("CBT", 15), rep("Waitlist", 15))),
Response = factor(c(rep("Improved", 12), rep("Not_Improved", 3),
rep("Improved", 4), rep("Not_Improved", 11)))
)
# توليد جدول التوافق باستخدام دالة table()
table_data <- table(clinical_df$Therapy, clinical_df$Response)
# أو باستخدام صيغة المعادلات عبر دالة xtabs()
table_xtabs <- xtabs(~ Therapy + Response, data = clinical_df)
print(table_data)
“`
### 4.3 التحقق من جودة البيانات والمتغيرات الفئوية
تتطلب المعالجة السليمة للبيانات الفئوية قبل إجراء اختبار فيشر التأكد التام من نظافتها وخلوها من التشوهات الهيكلية. تبرز هنا قضية التعامل مع القيم المفقودة (`NA`)؛ حيث إن وجود قيم مفقودة في أي من المتغيرين الفئويين قد يؤدي إلى استبعاد غير مقصود للملاحظات أو تشويه التكرارات الهامشية. يمكن استبعاد القيم المفقودة أو فحص حجمها باستخدام دوال الفلترة مثل `na.omit()` أو `filter(!is.na(variable))`.
الخطوة الجوهرية التالية تتمثل في التحقق من أن المتغيرات معرفة صراحة كعوامل (`Factors`) داخل R، مع الانتباه الشديد لترتيب المستويات المرجعية (`Reference Levels`). تحدد برمجية R المستوى المرجعي الأول أبجدياً بصورة افتراضية، وهو ما يؤثر مباشرة على كيفية حساب اتجاه نسبة الأرجحية (Odds Ratio)؛ إذ يتم اعتبار المستوى الأول هو الأساس في المقارنة. يمكن إعادة ضبط المستوى المرجعي صراحة باستخدام دالة `relevel()` أو دالة `factor()` مع تحديد وسيط `levels`.
أخيراً، يجب فحص التكرارات الهامشية والتكرارات المتوقعة للتأكد من مبرر استخدام اختبار فيشر مقارنة بكاي تربيع، وذلك عبر تطبيق دالة `chisq.test()` لاستخراج مصفوفة القيم المتوقعة:
“`r
# التحقق من نوع المتغيرات وإعادة ضبط المستويات المرجعية
clinical_df$Therapy <- relevel(clinical_df$Therapy, ref = "Waitlist")
clinical_df$Response <- relevel(clinical_df$Response, ref = "Not_Improved")
# فحص التكرارات الهامشية لجدول البيانات
marginal_rows <- margin.table(table_data, 1) # مجاميع الصفوف
marginal_cols <- margin.table(table_data, 2) # مجاميع الأعمدة
# فحص التكرارات المتوقعة للتحقق من شروط كوتشران
expected_counts 1$).
– `”less”`: لاختبار فرضية الطرف الأيسر بأن نسبة الأرجحية أقل من القيمة المحددة ($\text{OR} < 1$).
– `or`: القيمة المفترضة لنسبة الأرجحية تحت الفرضية الصفرية (تساوي 1 افتراضياً).
– `conf.int`: قيمة منطقية (`TRUE` أو `FALSE`) لتحديد ما إذا كان يجب حساب فترة الثقة لنسبة الأرجحية (متاحة حصرياً لجداول 2×2).
– `conf.level`: مستوى الثقة الإحصائي المطلوب لحساب فترة الثقة (الافتراضي هو 0.95 أي فترة ثقة 95%).
– `workspace`: حجم الذاكرة المخصصة لشبكة الخوارزمية التوافقية لحساب الاحتمالات الدقيقة في الجداول الأكبر حجماً.
– `simulate.p.value`: قيمة منطقية لتفعيل محاكاة مونت كارلو في الجداول المعقدة $R \times C$.
– `B`: عدد التكرارات العشوائية في محاكاة مونت كارلو عند تفعيل الوسيط السابق.
### 5.2 تنفيذ كود الاختبار على بيانات تجريبية خطوة بخطوة
لتوضيح التطبيق العملي، سنفترض دراسة إكلينيكية مصغرة لفحص الارتباط بين نوع التدخل العلاجي (مجموعة علاج نفسي جديد مقابل مجموعة علاج تقليدي) وحدوث نكسة إكلينيكية (انتكاس / عدم انتكاس) لدى عينة مكونة من 24 مريضاً يعانون من اضطراب الوسواس القهري (OCD).
يتم بناء مصفوفة البيانات وتنفيذ اختبار فيشر وتخزين المخرجات الإحصائية في كائن مستقل بالخطوات التالية:
“`r
# 1. بناء مصفوفة جدول التوافق 2×2
ocd_study <- matrix(
c(2, 10, # المجموعة 1 (علاج جديد): 2 انتكسوا، 10 لم ينتكسوا
8, 4), # المجموعة 2 (علاج تقليدي): 8 انتكسوا، 4 لم ينتكسوا
nrow = 2,
byrow = TRUE,
dimnames = list(
Treatment = c("New_Psychotherapy", "Standard_Care"),
Relapse_Status = c("Relapsed", "No_Relapse")
)
)
# عرض الجدول للتحقق من التكرارات
print("جدول التوافق للملاحظات:")
print(ocd_study)
# 2. تنفيذ اختبار فيشر الدقيق وتخزين النتائج في كائن R
fisher_result <- fisher.test(ocd_study, alternative = "two.sided", conf.level = 0.95)
# 3. طباعة التقرير الإحصائي الكامل للمخرجات
print(fisher_result)
“`
عند تنفيذ هذا الكود، تُجري بيئة R الحسابات التوافقية وفق التوزيع فوق الهندسي، وتطبع تقريراً منظماً يحتوي على اسم الاختبار، والبيانات المدخلة، والقيمة الاحتمالية الدقيقة ($p$-value)، والفرضية البديلة المعتمدة، وفترة الثقة لنسبة الأرجحية بنسبة 95%، وقيمة تقدير النقطة لنسبة الأرجحية (Odds Ratio Estimate).
### 5.3 التعامل المباشر مع المتغيرات من إطار البيانات (Data Frame)
في السيناريوهات التحليلية اليومية، يتعامل الباحث غالباً مع مجموعات بيانات تتضمن مئات المتغيرات المنظمة في أعمدة داخل إطار بيانات (`data.frame` أو `tibble`). تتيح دالة `fisher.test()` التعامل المباشر مع أسماء الأعمدة دون الحاجة لإنشاء مصفوفات وسيطة عبر تمرير المتغيرين كوسيطين `x` و `y`.
سنوضح ذلك باستخدام كود يولد إطار بيانات لمرضى، ثم نطبق الاختبار مباشرة مع فحص الجدول المتقاطع المولد داخلياً:
“`r
# إنشاء إطار بيانات تمثيلي
set.seed(42)
ptsd_data <- data.frame(
Subject_ID = 1:28,
Early_Trauma = factor(c(rep("Present", 14), rep("Absent", 14)),
levels = c("Present", "Absent")),
Severe_Anxiety = factor(c(rep("High", 11), rep("Low", 3),
rep("High", 4), rep("Low", 10)),
levels = c("High", "Low"))
)
# عرض الملخص التقاطعي للتأكد من التوزيع
with(ptsd_data, table(Early_Trauma, Severe_Anxiety))
# تطبيق اختبار فيشر مباشرة على أعمدة إطار البيانات
ptsd_test 0.05$: **يُفشل في رفض الفرضية الصفرية**، ويُستنتج عدم وجود أدلة إحصائية كافية تثبت وجود ارتباط بين المتغيرين في حدود العينة المدروسة.
من الأخطاء الشائعة والجسيمة في البحوث النفسية الخلط بين الدلالة الإحصائية والأهمية الإكلينيكية أو العملية (Clinical vs Statistical Significance). فالقيمة الاحتمالية الصغيرة تخبرنا فقط بمدى استبعاد أن تكون الفروق ناتجة عن تباين الصدفة، لكنها لا تقدم أي معلومة حول قوة أو حجم التأثير السلوكي، وهو ما يستلزم فحص نسبة الأرجحية كخطوة تالية ملازمة لتفسير الـ $p$-value.
### 6.2 تحليل نسبة الأرجحية المقدرة (Odds Ratio)
تعتمد دالة `fisher.test()` في لغة R منهجية متقدمة لتقدير نسبة الأرجحية تختلف عن الحساب البسيط المباشر للضرب التبادلي ($ad/bc$). تستخدم R طريقة **تقدير الاحتمال الأعظم الشرطي** (Conditional Maximum Likelihood Estimation – Conditional MLE) القائمة مباشرة على بنية التوزيع فوق الهندسي غير المركزي (Non-central Hypergeometric Distribution).
لذلك، قد يلاحظ الباحث فرقاً طفيفاً جداً بين القيمة المعروضة في مخرجات R تحت مسمى `odds ratio` وتلك الناتجة عن الحساب اليدوي البسيط، ويعتبر تقدير R الشرطي أكثر دقة وأقل تحيزاً في العينات الميكروية.
يتم تفسير القيمة العددية لنسبة الأرجحية المقدرة في السياق النفسي والإكلينيكي كالتالي:
– لنفترض أن مخرج التحليل في دراسة التدخل العلاجي أظهر $\text{Odds Ratio} = 0.106$:
– يعني هذا أن أرجحية حدوث الانتكاس لدى مجموعة العلاج الجديد تعادل 0.106 من أرجحية حدوث الانتكاس لدى مجموعة العلاج التقليدي.
– يمكن إعادة صياغة المعنى بأخذ مقلوب القيمة ($1 / 0.106 \approx 9.43$) لنقول: “إن أرجحية عدم حدوث الانتكاس لدى المرضى الذين تلقوا العلاج الجديد أعلى بحوالي 9.43 مرة مقارنة بالمرضى في العلاج التقليدي”، مما يشير إلى أثر علاجي وقائي قوي جداً.
– إذا كانت النسبة قريبة من 1 (مثلاً 1.05 أو 0.98)، فإن الأثر السلوكي يعتبر شبه منعدم حتى لو كانت العينة تعاني من تباينات عشوائية.
### 6.3 قراءة فترات الثقة لنسبة الأرجحية (95% Confidence Intervals)
تُعد فترة الثقة (Confidence Interval) المصاحبة لنسبة الأرجحية في مخرجات R الركيزة الأساسية لتقييم الدقة التقديرية لحجم التأثير. تحسب دالة `fisher.test()` فترة ثقة دقيقة تامة تعتمد على توزيع الاحتمال فوق الهندسي غير المركزي، وتُعرض في المخرجات محددة بحدين: الحد الأدنى (Lower Bound) والحد الأعلى (Upper Bound).
القواعد المنهجية لتفسير فترة الثقة تشمل:
1. **اختبار الدلالة الإحصائية عبر فترة الثقة**:
– إذا كانت فترة الثقة 95% **لا تشتمل** على القيمة 1 (مثل: $[1.45, 18.92]$ أو $[0.02, 0.65]$)، فإن ذلك يتطابق رياضياً مع كون القيمة الاحتمالية $p 0.05$)، حيث تظل فرضية الاستقلالية وتكافؤ الأرجحيات احتمالاً وارداً علمياً.
2. **تقييم دقة التقدير (Precision)**:
– اتساع فترة الثقة (كأن تتراوح بين 1.10 و 85.0) يعكس صغر حجم العينة وانخفاض دقة التقدير النقطي، مما يستوجب توخي الحذر عند تعميم حجم التأثير، والتوصية بإجراء دراسات لاحقة بعينات أكبر حجماً.
يمكن استخراج هذه العناصر الإحصائية برمجياً من كائن النتائج المخزن في R لاستخدامها في إعداد التقارير التلقائية عبر معاملات الإسناد (`$`):
“`r
# استخراج المكونات الفردية برمجياً
p_val <- fisher_result$p.value
or_est <- fisher_result$estimate
ci_lower <- fisher_result$conf.int[1]
ci_upper <- fisher_result$conf.int[2]
# طباعة ملخص مخصص
cat("القيمة الاحتمالية الدقيقة:", round(p_val, 4), "n")
cat("نسبة الأرجحية المقدرة (MLE):", round(or_est, 3), "n")
cat("فترة الثقة 95%:", paste0("[", round(ci_lower, 3), " , ", round(ci_upper, 3), "]"), "n")
“`
## 7. التعامل مع الفرضيات الموجهة (أحادية وثنائية الطرف) في R
### 7.1 إجراء الاختبار ثنائي الطرف (Two-Sided Test)
يمثل الاختبار ثنائي الطرف (Two-Sided Test) النهج الأكثر أماناً وتحفظاً في البحث العلمي، وهو الخيار الافتراضي في دالة `fisher.test()` عند إبقاء الوسيط `alternative = "two.sided"`. يُستخدم هذا الاختبار عندما يسعى الباحث إلى فحص ما إذا كان هناك اقتران أو اختلاف عام بين المجموعتين دون تبني فرضية جازمة حول اتجاه هذا الاختلاف؛ أي فحص ما إذا كانت نسبة الأرجحية تختلف عن الواحد الصحيح سواء بالزيادة أو النقصان ($\text{OR} \neq 1$).
يقوم الاختبار ثنائي الطرف في R بجمع الاحتمالات الدقيقة لجميع الجداول التوافقية الممكنة التي تمتلك احتمالية حدوث $P le P_{\text{observed}}$ في كلا طرفي التوزيع فوق الهندسي. يُوصى بهذا الخيار في الأبحاث الاستكشافية النفسية، أو عند اختبار تدخلات علاجية قد تحمل احتمالية التحسن أو احتمالية حدوث آثار عكسية تزيد من تدهور الحالة.
“`r
# تنفيذ الاختبار ثنائي الطرف بصورة صريحة
test_two_sided 1$.
في هذا النمط من الاختبارات، تقوم الدالة بجمع الاحتمالات الدقيقة للجداول التي تظهر عدداً من التكرارات في الخلية المرجعية مساوياً أو أكبر من التكرار الملاحظ $a$ في اتجاه زيادة الأرجحية. كما تختلف طريقة حساب فترة الثقة في هذه الحالة لتصبح فترة ثقة أحادية الجانب (One-sided Confidence Interval)، بحيث يكون لها حد أدنى محدد بينما يمتد الحد الأعلى إلى المالانهاية ($\infty$).
“`r
# اختبار ما إذا كانت أرجحية التعافي أعلى في المجموعة التجريبية
# H0: OR 1
test_greater <- fisher.test(contingency_matrix, alternative = "greater")
print(test_greater)
“`
تتجلى فائدة هذا الإجراء في زيادة القوة الإحصائية للكشف عن التأثير المتوقع إذا كان الاتجاه النظري صحيحاً، إلا أنه ينطوي على مخاطرة منهجية تتمثل في تجاهل أي تأثير يسير في الاتجاه المعاكس تماماً.
### 7.3 إجراء الاختبار أحادي الطرف للأرجحية الأقل (Less)
في المقابل، يُستخدم خيار الطرف الأيسر `alternative = "less"` لاختبار الفرضيات التي تفترض أثراً وقائياً أو مثبطاً؛ أي اختبار الفرضية القائلة بأن نسبة الأرجحية تقل دلالياً عن الواحد الصحيح ($text{OR} = 1 مقابل HA: OR < 1
test_less <- fisher.test(ocd_study, alternative = "less")
print(test_less)
“`
عند المقارنة بين القرارات الإحصائية الناتجة عن الفرضيات الأحادية والثنائية، يُلاحظ دائماً أن القيمة الاحتمالية للاختبار أحادي الطرف تكون تقريباً نصف قيمتها في الاختبار ثنائي الطرف (في التوزيعات المتماثلة). ولذلك، تحذر الأدبيات المنهجية لجمعية علم النفس الأمريكية (APA) من استخدام الفرضيات الأحادية بصورة بعدية (Post-hoc) لمجرد تحويل نتيجة غير دالة إحصائياً إلى نتيجة دالة، مؤكدة على وجوب توثيق التوجه أحادي الطرف وتبريره نظرياً قبل مرحلة جمع وتحليل البيانات.
## 8. توسيع الاختبار لجداول التوافق المعقدة (R × C) في R
### 8.1 تطبيق دالة fisher.test على جداول أكبر من 2×2
لا يقتصر اختبار فيشر الدقيق على جداول 2×2 البسيطة فحسب، بل يمتد ليشمل جداول التوافق متعددة الصفوف والأعمدة من الحجم $R \times C$ (مثل جداول 2×3، أو 3×3، أو 4×3)، والتي تنشأ عند دراسة متغيرات اسمية ذات مستويات متعددة (مثل مقارنة ثلاث تقنيات علاجية مختلفة عبر ثلاثة مستويات من الشدة الإكلينيكية: طفيف، متوسط، شديد).
اعتمد فيشر وامتداداته اللاحقة على خوارزمية فريمان-هالتون (Freeman-Halton Test) لحساب الاحتمال متعدد الحدود فوق الهندسي الدقيق لجميع المصفوفات الممكنة تحت شرط ثبات الهوامش الشاملة.
تُنفذ الدالة في R بنفس البساطة البرمجية عبر تمرير المصفوفة الأكبر حجماً:
“`r
# إنشاء جدول توافق 3×3 لمقارنة ثلاثة أساليب علاجية عبر ثلاثة مستويات استجابة
multiclass_matrix <- matrix(
c(8, 5, 2, # العلاج المعرفي CBT
3, 7, 5, # العلاج الديناميكي Psychodynamic
1, 4, 10), # العلاج الدوائي Pharmacotherapy
nrow = 3,
byrow = TRUE,
dimnames = list(
Modality = c("CBT", "Psychodynamic", "Pharm"),
Response_Level = c("High", "Moderate", "Low")
)
)
# تنفيذ اختبار فيشر الدقيق الموسع
fisher_rxc <- fisher.test(multiclass_matrix)
print(fisher_rxc)
“`
من الضروري ملاحظة أن مخرجات الاختبار لجداول $R \times C$ لا تحتوي على مؤشر نسبة الأرجحية (Odds Ratio) أو فترات ثقته؛ حيث إن نسبة الأرجحية معرفة رياضياً للمقارنات الثنائية فقط. بدلاً من ذلك، يقدم الاختبار قيمة احتمالية عامة ($p$-value) تختبر الفرضية الصفرية لتجانس التوزيع واستقلالية التصنيفين الشاملين.
### 8.2 استخدام محاكاة مونت كارلو (Monte Carlo Simulation)
عندما تكبر أبعاد الجدول (مثلاً $4 \times 4$ أو جداول تحتوي على تكرارات هامشية كبيرة نسبياً)، تصبح عملية التعداد الشامل لكافة التباديل والتوافيق الممكنة مستحيلة حوسبياً وتتجاوز حدود الذاكرة المتاحة حتى في أسرع الحواسيب المعاصرة، وهو ما قد يتسبب في توقف تنفيذ الدالة وظهور رسائل خطأ في R.
للتغلب على هذا القيد الحسابي، وفرت لغة R خياراً متقدماً يقوم على تقدير القيمة الاحتمالية الدقيقة عبر **محاكاة مونت كارلو** (Monte Carlo Simulation) بدلاً من الحساب التحليلي الشامل، وذلك بتفعيل الوسيط `simulate.p.value = TRUE` وتحديد عدد العينات العشوائية المطلوبة عبر الوسيط `B` (يُنصح باستخدام $B = 10000$ أو أكثر لضمان دقة بالغة في التقدير):
“`r
# تنفيذ اختبار فيشر عبر محاكاة مونت كارلو لجداول معقدة
fisher_mc <- fisher.test(
multiclass_matrix,
simulate.p.value = TRUE,
B = 100000
)
print(fisher_mc)
“`
تولد هذه الخوارزمية عدداً ضخماً من الجداول العشوائية المتوافقة مع نفس الهوامش الملاحظة، وتحسب بدقة متناهية نسبة الجداول التي تمتلك احتمالات مساوية أو أقل من الجدول الملاحظ. تتقارب القيمة الاحتمالية الناتجة عن المحاكاة تقارباً شبه تام مع الحل الدقيق التحليلي دون استنزاف ذاكرة النظام.
### 8.3 المقارنات البعدية الثنائية وتصحيح بونفيروني (Post-Hoc Analysis)
عند الحصول على قيمة احتمالية عامة دالة إحصائياً ($p < 0.05$) في جدول توافق متعدد الفئات $R \times C$، فإن هذه النتيجة تدل فقط على وجود ارتباط عام بين المتغيرين، لكنها لا تحدد بدقة أي المجموعات أو الخلايا المحددة مسؤولة عن هذا الارتباط الإحصائي الدال. يتطلب الاستدلال العلمي في هذه الحالة إجراء **مقارنات بعدية ثنائية** (Post-Hoc Pairwise Comparisons).
يتم ذلك عبر تفكيك الجدول الكبير إلى سلسلة من الجداول الفرعية الثنائية (2×2) وإجراء اختبار فيشر لكل مقارنة زوجية على حدة، مع تطبيق تصحيح إحصائي لمستوى الدلالة مثل تصحيح بونفيروني (Bonferroni Correction) أو تصحيح معدل الاكتشاف الخاطئ (False Discovery Rate – FDR / Benjamini-Hochberg) باستخدام دالة `p.adjust()` لتفادي التضخم في خطأ العائلة الشامل (Family-wise Error Rate):
“`r
# تفكيك جدول 3×3 إلى مقارنات ثنائية بين أساليب العلاج لمستوى الاستجابة “العالية مقابل المنخفضة”
comp_1_2 <- multiclass_matrix[c("CBT", "Psychodynamic"), c("High", "Low")]
comp_1_3 <- multiclass_matrix[c("CBT", "Pharm"), c("High", "Low")]
comp_2_3 <- multiclass_matrix[c("Psychodynamic", "Pharm"), c("High", "Low")]
# استخراج القيم الاحتمالية الخام لكل مقارنة
raw_p_values <- c(
CBT_vs_Dynamic = fisher.test(comp_1_2)$p.value,
CBT_vs_Pharm = fisher.test(comp_1_3)$p.value,
Dynamic_vs_Pharm = fisher.test(comp_2_3)$p.value
)
# تطبيق تصحيح بونفيروني وتصحيح FDR
adjusted_p_bonf <- p.adjust(raw_p_values, method = "bonferroni")
adjusted_p_fdr <- p.adjust(raw_p_values, method = "fdr")
# تجميع النتائج في إطار بيانات منسق
posthoc_results <- data.frame(
Comparison = names(raw_p_values),
Raw_P = round(raw_p_values, 4),
Bonferroni_P = round(adjusted_p_bonf, 4),
FDR_P = round(adjusted_p_fdr, 4)
)
print(posthoc_results)
“`
تتيح هذه المقارنات للباحث تحديد مصدر الفروق الإكلينيكية بدقة متناهية ودعم القرارات العلاجية بالأدلة الإحصائية المصححة.
## 9. معالجة المشكلات الشائعة والقيود الحسابية أثناء التنفيذ البرمجي
### 9.1 مشكلة الذاكرة الحسابية وتوسيع مساحة العمل (workspace)
من أكثر المشكلات البرمجية شيوعاً عند تنفيذ اختبار فيشر الدقيق في R على جداول التوافق ذات الأبعاد الأكبر من 2×2 ظهور رسالة خطأ شهيرة تنص على:
`Error in fisher.test(…) : FEXACT error 7. LDKEY is too small for this problem`
أو أخطاء متعلقة بنفاد مساحة العمل المخصصة للخوارزمية الحسابية `workspace`.
يرجع هذا الخطأ إلى أن خوارزمية FEXACT (المكتوبة بلغة Fortran المدمجة في نواة R) تخصص حجماً مبدئياً محدوداً لذاكرة التخزين المؤقت للأعداد التوافقية الضخمة المتولدة أثناء استكشاف شبكة الجداول. لحل هذه المشكلة بصورة جذرية، يمكن للمحلل زيادة مساحة العمل يدوياً عبر وسيط `workspace` وتمرير قيمة عددية كبيرة (مثل `workspace = 2e8` أو `2e9`):
“`r
# حل مشكلة FEXACT error بتوسيع مساحة العمل المخصصة
large_table_test <- fisher.test(multiclass_matrix, workspace = 2e8)
“`
إذا استمر الخطأ نتيجة الضخامة الفائقة للتكرارات الهامشية، فإن الحل المنهجي الصحيح والموصى به دولياً هو التحول الفوري إلى وسيط المحاكاة `simulate.p.value = TRUE` كما فُصل في البند السابق.
### 9.2 التعامل مع الخلايا الصفرية (Zero Cell Counts)
يمثل ظهور خلايا تحتوي على تكرار صفري (Zero Count) في جداول التوافق تحدياً رياضياً في تحليل البيانات الفئوية. يتميز اختبار فيشر الدقيق بقدرته الأصيلة على حساب القيمة الاحتمالية الدقيقة ($p$-value) حتى في وجود خلايا صفرية دون أي خلل، حيث يتعامل التوزيع فوق الهندسي مع المضروب الصفري كقيمة معرفة رياضياً ($0! = 1$).
ومع ذلك، تكمن المشكلة عند حساب نسبة الأرجحية النقطية ($\text{OR} = ad/bc$) وفترات ثقتها؛ فإذا كانت قيمة أي خلية صفراً، تصبح النسبة إما صفراً مطلقاً ($0$) أو مالانهاية ($\infty$)، وتصبح حدود فترة الثقة غير محددة في أحد طرفيها.
للتعامل مع هذه الحالات في التقدير الإحصائي لحجم التأثير، تقترح الأدبيات الإحصائية استخدام تصحيح هالدين-أنسكومب (Haldane-Anscombe Correction)، والذي يقوم على إضافة ثابت قدره $0.5$ إلى جميع خلايا جدول التوافق لتثبيت تقدير نسبة الأرجحية والخطأ المعياري، ويمكن تنفيذ ذلك في R كالتالي:
“`r
# مصفوفة تحتوي على تكرار صفري
zero_matrix <- matrix(c(0, 12, 8, 7), nrow = 2, byrow = TRUE)
# اختبار فيشر يحسب p-value بدقة تامة رغم وجود الصفر
zero_test <- fisher.test(zero_matrix)
print(zero_test$p.value)
# تطبيق تصحيح هالدين-أنسكومب لحساب نسبة أرجحية مستقرة
haldane_matrix <- zero_matrix + 0.5
haldane_or <- (haldane_matrix[1,1] * haldane_matrix[2,2]) /
(haldane_matrix[1,2] * haldane_matrix[2,1])
cat("نسبة الأرجحية بعد تصحيح هالدين:", round(haldane_or, 3), "n")
“`
### 9.3 التحقق من ثبات النتائج وقضايا حجم العينة الفائق
على النقيض من مشكلة العينات الصغيرة، يواجه الباحثون أحياناً ما يُعرف بـ "مفارقة الحوسبة في العينات الضخمة"؛ فعندما يبلغ حجم العينة عشرات الآلاف من الملاحظات، تصبح الحسابات التوافقية لاختبار فيشر مكلفة جداً من حيث زمن المعالجة واستهلاك وحدة المعالجة المركزية (CPU)، في حين أن التوزيع التقاربي لاختبار كاي تربيع في هذه الحالة يكون قد وصل إلى قمة دقته وتطابقه النظري.
في مثل هذه الظروف البحثية، يكون التحول التلقائي إلى اختبار كاي تربيع لبيرسون مبرراً منهجياً ورياضياً بالكامل، حيث لا يقدم اختبار فيشر أي ميزة إضافية في الدقة على الإطلاق في العينات الكبيرة، بل يمثل هدراً للوقت الحوسبي. يجب على الباحث دائماً الموازنة بين الدقة التوافقية والتكلفة الحوسبية بناءً على حجم العينة الفعلي وتكرارات الخلايا المتوقعة.
## 10. التمثيل البياني وتصوير نتائج اختبار فيشر في R

### 10.1 رسم مخططات الموزاييك (Mosaic Plots)
تُعد مخططات الموزاييك (Mosaic Plots) من أرقى وأعمق الأساليب البصرية لتصوير بيانات جداول التوافق؛ حيث تعكس مساحات المستطيلات داخل المخطط التكرارات المشتركة للخلايا، بينما تعبر عروض الأعمدة وارتفاعات الصفوف عن التكرارات الهامشية للمتغيرات.
توفر بيئة Base R دالة `mosaicplot()` الأساسية، بينما توفر حزمة `vcd` إمكانيات متقدمة تتيح تلوين المستطيلات وفق قيم البواقي المعيارية المعدلة (Standardized Pearson Residuals)، مما يمكن الباحث من رؤية الخلايا التي تبتعد دلالياً عن فرضية الاستقلالية بشكل بصري فوري:
“`r
# رسم مخطط موزاييك متقدم باستخدام حزمة vcd
# المستطيلات الزرقاء تعني تكرار ملاحظ أعلى من المتوقع، والحمراء تعني تكرار أقل
mosaic(
contingency_matrix,
shade = TRUE,
legend = TRUE,
main = “مخطط الموزاييك لعلاقة التدخل العلاجي بالاستجابة الإكلينيكية”,
labeling_args = list(set_varnames = c(Treatment = “نوع العلاج”, Outcome = “النتيجة”))
)
“`
يساعد هذا التمثيل البصري القارئ على استيعاب النمط الارتباطي المعقد الذي أظهره اختبار فيشر دون الغرق في الأرقام الصماء لجداول البيانات.
### 10.2 استخدام حزمة ggplot2 لرسم الأعمدة الفئوية المقارنة
تُعد مخططات الأعمدة المئوية المتراكمة (Stacked Percentage Bar Charts) أو الأعمدة المجمعة (Grouped Bar Charts) المنشأة عبر حزمة `ggplot2` المعيار الأكثر تفضيلاً في المجلات النفسية والطبية المحكمة. يتميز هذا الأسلوب بتحويل التكرارات المطلقة إلى نسب مئوية داخل كل مجموعة، مما يسهل مقارنة معدلات الاستجابة بصرياً حتى في حالة عدم تكافؤ الأحجام الهامشية للمجموعات.
يوضح الكود التالي كيفية بناء رسم بياني تفاعلي واحترافي باستخدام `ggplot2`:
“`r
# تحويل مصفوفة البيانات إلى إطار بيانات طويل منسق للرسم
plot_df %
group_by(Treatment) %>%
mutate(Percentage = Freq / sum(Freq) * 100)
# إنشاء الرسم البياني باستخدام ggplot2
p <- ggplot(plot_df, aes(x = Treatment, y = Percentage, fill = Outcome)) +
geom_bar(stat = "identity", position = "dodge", width = 0.6, color = "black") +
geom_text(aes(label = paste0(round(Percentage, 1), "%n(n=", Freq, ")")),
position = position_dodge(width = 0.6), vjust = -0.3, size = 3.5, fontface = "bold") +
scale_fill_manual(values = c("Remission" = "#2b8cbe", "No_Remission" = "#e41a1c"),
labels = c("تحسن إكلينيكي", "عدم تحسن")) +
scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, 20)) +
labs(
title = "مقارنة نسب التحسن الإكلينيكي بين مجموعات التدخل العلاجي",
subtitle = "النتائج مستندة إلى عينة إكلينيكية صغيرة (اختبار فيشر الدقيق)",
x = "بروتوكول التدخل",
y = "النسبة المئوية داخل المجموعة (%)",
fill = "الاستجابة"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5, color = "gray30"),
legend.position = "bottom"
)
print(p)
“`
### 10.3 إضافة النتائج الإحصائية على الرسوم البيانية وتصديرها
لتعظيم القيمة العلمية للمخططات البيانية وتجهيزها للنشر الأكاديمي، يمكن دمج نتائج اختبار فيشر الدقيق مباشرة داخل الشكل البياني باستخدام حزمة `ggstatsplot` ودالتها الشهيرة `ggbarstats()`. تقوم هذه الأداة تلقائياً بإجراء الاختبار الدقيق المناسب، وتدوين القيمة الاحتمالية، ونسبة الأرجحية، وحجم العينة في ترويسة الشكل بصورة ديناميكية موثقة.
كما يتطلب النشر في الدوريات المصنفة تصدير هذه الأشكال بدقة نقطية عالية لا تقل عن 300 نقطة في البوصة (DPI) بصيغ متجهة مثل TIFF أو PDF عبر دالة `ggsave()`:
“`r
# رسم بياني مدمج بالاختبار الإحصائي عبر ggstatsplot
stats_plot <- ggbarstats(
data = clinical_df,
x = Response,
y = Therapy,
paired = FALSE,
test = "fisher", # تحديد اختبار فيشر صراحة
results.subtitle = TRUE,
title = "التحليل الإحصائي البصري لفعالية العلاج المعرفي السلوكي",
xlab = "نوع التدخل السلوكي",
legend.title = "حالة التحسن"
)
# تصدير الشكل البياني بجودة طباعية فائقة (300 DPI) وفق معايير النشر
ggsave(
filename = "Fisher_Test_Results.png",
plot = stats_plot,
dpi = 300,
width = 8,
height = 6,
units = "in"
)
“`
## 11. دراسات حالة تطبيقية في علم النفس والعلوم السلوكية باستخدام R
### 11.1 دراسة حالة 1: الصدمات النفسية المبكرة والاستجابة لنوبات الهلع
**السياق البحثي:**
أجرى فريق بحثي إكلينيكي دراسة استكشافية لفحص الارتباط بين التعرض لصدمات الطفولة النفسية الشديدة (Early Childhood Trauma) وتطور نوبات هلع مفاجئة غير مستجيبة للعلاج (Refractory Panic Attacks) لدى عينة استطلاعية مكونة من 22 مريضاً بالغاً. نظراً لمحدودية العينة وصغر التكرارات المتوقعة، يُعد اختبار فيشر الدقيق الأداة الإحصائية الواجبة للتطبيق.
**البيانات والتحليل البرمجي في R:**
“`r
# 1. إدخال جدول التوافق
panic_trauma_matrix <- matrix(
c(9, 2, # تعرض لصدمة: 9 نوبات مستعصية، 2 نوبات اعتيادية
2, 9), # لم يتعرض لصدمة: 2 نوبات مستعصية، 9 نوبات اعتيادية
nrow = 2,
byrow = TRUE,
dimnames = list(
Trauma_History = c("Trauma_Present", "Trauma_Absent"),
Panic_Type = c("Refractory", "Typical")
)
)
# 2. تنفيذ اختبار فيشر ثنائي الطرف
case1_test 1$).
**التحليل البرمجي في R:**
“`r
# جدول الامتثال العلاجي
adherence_matrix <- matrix(
c(9, 1, # العلاج الرقمي: 9 ملتزمون، 1 غير ملتزم
4, 6), # العلاج التقليدي: 4 ملتزمون، 6 غير ملتزمين
nrow = 2,
byrow = TRUE,
dimnames = list(
Modality = c("Digital_CBT", "In_Person"),
Adherence = c("Adherent", "Non_Adherent")
)
)
# تنفيذ الاختبار أحادي الطرف للأرجحية الأكبر
case2_test <- fisher.test(adherence_matrix, alternative = "greater")
print(case2_test)
“`
**المناقشة والتفسير الإكلينيكي:**
أسفر الاختبار أحادي الطرف عن قيمة احتمالية دالة إحصائياً ($p = 0.0191$)، مع نسبة أرجحية مقدرة بلغت $\text{OR} = 10.95$ وحد أدنى لفترة الثقة 95% بلغ $1.36$.
يؤكد التحليل صحة الفرضية البديلة الموجهة؛ حيث يُظهر أن التدخل الرقمي يقلل بصورة جوهرية من عوائق الالتزام بحضور الجلسات وأداء الواجبات السلوكية المنزلية، مما يوفر سنداً تجريبياً لدمج الرعاية الصحية النفسية عن بعد (Tele-mental Health) في برامج الرعاية الأولية.
### 11.3 دراسة حالة 3: الأنماط السلوكية في بيئات العمل (جدول 3×2)
**السياق البحثي:**
استقصت دراسة في علم النفس التنظيمي والصناعي العلاقة بين النمط القيادي للمدير المباشر (أوتوقراطي، ديمقراطي، تحويلي) ومستوى الاحتراق النفسي الوظيفي لدى الموظفين (مرتفع مقابل منخفض) داخل شركة ناشئة شملت 36 موظفاً موزعين على أقسام صغيرة.
**التحليل البرمجي في R:**
“`r
# جدول 3×2 لبيانات القيادة والاحتراق النفسي
org_matrix <- matrix(
c(8, 2, # نمط أوتوقراطي: 8 احتراق مرتفع، 2 منخفض
4, 8, # نمط ديمقراطي: 4 احتراق مرتفع، 8 منخفض
1, 13), # نمط تحويلي: 1 احتراق مرتفع، 13 منخفض
nrow = 3,
byrow = TRUE,
dimnames = list(
Leadership_Style = c("Autocratic", "Democratic", "Transformational"),
Burnout_Level = c("High_Burnout", "Low_Burnout")
)
)
# اختبار فيشر العام باستخدام المحاكاة العشوائية
case3_omnibus <- fisher.test(org_matrix, simulate.p.value = TRUE, B = 20000)
print(case3_omnibus)
# المقارنات البعدية المصححة (بين الأوتوقراطي والتحويلي)
sub_matrix_auto_trans <- org_matrix[c("Autocratic", "Transformational"), ]
posthoc_auto_trans <- fisher.test(sub_matrix_auto_trans)
cat("المقارنة الثنائية (أوتوقراطي مقابل تحويلي) – P الخام:", posthoc_auto_trans$p.value, "n")
cat("نسبة الأرجحية المقدرة:", posthoc_auto_trans$estimate, "n")
“`
**المناقشة والتفسير التنظيمي:**
أظهر الاختبار الشامل وجود ارتباط عام دال جداً بين النمط القيادي ومستوى الاحتراق النفسي ($p = 0.0003$). وعند إجراء المقارنة البعدية بين النمطين الأوتوقراطي والتحويلي، اتضح أن الموظفين الخاضعين لقيادة أوتوقراطية لديهم أرجحية تفوق 40 ضعفاً للإصابة باحتراق نفسي حاد مقارنة بالموظفين تحت قيادة تحويلية ($\text{OR} = 42.1, p = 0.0004$).
توضح هذه النتائج التطبيقية لمديري الموارد البشرية أن الاستثمار في تدريب القيادات على مهارات القيادة الداعمة والتحويلية يمثل استراتيجية وقائية حيوية لخفض الضغوط والاعتلالات المهنية.
## 12. توثيق النتائج وفق معايير جمعية علم النفس الأمريكية (APA 7) وأفضل الممارسات
### 12.1 الصياغة النصية لنتائج اختبار فيشر وفق دليل APA 7
تفرض معايير الدليل التحريري السابع لجمعية علم النفس الأمريكية (APA 7th Edition) قواعد صارمة وشفافة لتوثيق نتائج التحليلات الإحصائية الفئوية في متن البحوث العلمية. عند الإبلاغ عن نتائج اختبار فيشر الدقيق، يجب تضمين العناصر الأساسية التالية:
1. تحديد نوع الاختبار بوضوح (اختبار فيشر الدقيق ثنائي أو أحادي الطرف).
2. ذكر التكرارات الملاحظة والنسب المئوية لكل مجموعة ($n, %$).
3. تدوين القيمة الاحتمالية الدقيقة ($p$) مقربة إلى خانتين أو ثلاث خانات عشرية (مع كتابة $p “أُجري اختبار فيشر الدقيق لتقييم العلاقة بين نوع التدخل العلاجي ومعدل الانتكاس الإكلينيكي. أظهرت النتائج وجود ارتباط دال إحصائياً بين المتغيرين ($p = .006$، اختبار ثنائي الطرف). حيث بلغت نسبة الانتكاس لدى مجموعة العلاج الجديد$16.7%$ ($n = 2$) مقارنة بـ $66.7%$ ($n = 8$) لدى مجموعة الرعاية المعتادة. وبلغت نسبة الأرجحية المقدرة $\text{OR} = 0.11$ مع فترة ثقة $95%$ تراوحت بين $[0.01, 0.82]$، مما يشير إلى انخفاض جوهري في أرجحية الانتكاس لدى الخاضعين للبروتوكول العلاجي الجديد.”
**نموذج الصياغة باللغة الإنجليزية (English APA 7 Standard):**
> “A Fisher’s exact test was conducted to examine the association between trauma history and panic disorder subtype. The analysis revealed a statistically significant relationship between the two variables, $p = .006$, two-tailed, with an estimated odds ratio of $\text{OR} = 16.03$, $95% \text{ CI } [1.89, 222.10]$. Patients with a documented history of childhood trauma exhibited significantly higher odds of developing refractory panic attacks compared to those without trauma exposure.”
### 12.2 تصميم الجداول الإحصائية للنشر الأكاديمي
تتطلب المعايير الأكاديمية عرض جداول التوافق بصورة بصرية نظيفة تخلو من الخطوط العمودية، مع الاقتصار على ثلاثة خطوط أفقية رئيسية (أعلى وأسفل رأس الجدول، وأسفل قاعدة الجدول). توفر حزمة `gt` وحزمة `knitr::kable` مع `kableExtra` أدوات برمجية لبناء هذه الجداول وتصديرها مباشرة بتنسيقات متوافقة تماماً مع معايير APA 7:
“`r
# بناء جدول أكاديمي احترافي متوافق مع APA 7 باستخدام حزمة gt
apa_table_data <- data.frame(
Group = c("العلاج السلوكي المعرفي (CBT)", "مجموعة قائمة الانتظار (Waitlist)"),
Remission_N = c("12 (80.0%)", "4 (26.7%)"),
No_Remission_N = c("3 (20.0%)", "11 (73.3%)"),
Total = c("15 (100%)", "15 (100%)")
)
apa_table %
gt() %>%
tab_header(
title = md(“**جدول 1**”),
subtitle = md(“*توزيع تكرارات الاستجابة الإكلينيكية وفق نوع التدخل العلاجي*”)
) %>%
cols_label(
Group = “المجموعة التجريبية”,
Remission_N = “تحسن إكلينيكي ن (%)”,
No_Remission_N = “عدم تحسن ن (%)”,
Total = “المجموع الكلي”
) %>%
tab_source_note(
source_note = md(“*ملاحظة.* $p = .009$ (اختبار فيشر الدقيق ثنائي الطرف)؛ نسبة الأرجحية $\text{OR} = 11.00$؛ فترة الثقة $95%\text{ CI } [1.77, 86.82]$.”)
)
print(apa_table)
“`
### 12.3 أفضل الممارسات لضمان قابلية تكرار البحث (Reproducibility)
تمثل قابلية تكرار النتائج العلمية ركيزة النزاهة الأكاديمية المعاصرة في أبحاث العلوم النفسية والسلوكية. ولضمان امتثال التحليلات الإحصائية المعتمدة على R لأعلى معايير الشفافية، يُوصى باتباع الممارسات المنهجية التالية:
1. **استخدام مستندات Quarto أو R Markdown**: لدمج الشيفرة البرمجية، والمخرجات الإحصائية، والتفسيرات النصية في ملف تقرير ديناميكي واحد بصيغة HTML أو PDF، مما يمنع أخطاء النقل اليدوي للأرقام.
2. **تثبيت وتوثيق بيئة العمل وحزم R**: عبر تضمين الأمر `sessionInfo()` في نهاية التحليل، أو استخدام حزم إدارة البيئات مثل `renv` لضمان توافق إصدارات الدوال عبر الأجهزة المختلفة.
3. **مشاركة الكود والبيانات المفتوحة**: رفع الشيفرات البرمجية والبيانات منزوعة الهوية الشخصية على مستودعات علمية موثوقة مثل مستودع العلوم المفتوحة (Open Science Framework – OSF) أو منصة GitHub.
4. **قائمة المراجعة النهائية قبل الاعتماد النمطي**:
– التحقق من ملاءمة هوامش المصفوفة للمستويات المرجعية المقصودة.
– التأكد من عدم انتهاك شروط الفرضيات الأحادية أو الثنائية.
– مراجعة اتساق فترة الثقة مع القيمة الاحتمالية المقدرة.
## الخلاصة الخاتمة
يمثل اختبار فيشر الدقيق أحد أعظم الابتكارات المنهجية في تاريخ علم الإحصاء التطبيقي؛ حيث وفر للباحثين حلاً رياضياً قاطعاً لتحليل البيانات الفئوية في جداول التوافق الصغيرة دون الوقوع في منزلقات التقريب التقاربي التي تشوب اختبار كاي تربيع. ومن خلال بيئة R البرمجية، بات بإمكان الباحثين والمحللين النفسيين والإكلينيكيين تطبيق هذا الاختبار بكفاءة متناهية، والتعامل مع الفرضيات الموجهة وغير الموجهة، وتوسيع التحليل إلى الجداول المعقدة باستخدام محاكاة مونت كارلو، وتصوير العلاقات بيانياً بأعلى المعايير الطباعية. إن الفهم العميق للأسس الرياضية للتوزيع فوق الهندسي ومؤشر نسبة الأرجحية يضمن توظيف هذه الأداة في سياقها الصحيح، مما يعزز رصانة الاستدلال الإحصائي ويسهم في تطوير المعرفة السلوكية والإكلينيكية الرصينة.
## References
Agresti, A. (2002). *Categorical Data Analysis* (2nd ed.). John Wiley & Sons. https://doi.org/10.1002/0471249688
American Psychological Association. (2020). *Publication manual of the American Psychological Association* (7th ed.). American Psychological Association. https://doi.org/10.1037/0000165-000
Cochran, W. G. (1954). Some methods for strengthening the common $\chi^2$ tests. *Biometrics*, 10(4), 417–451. https://doi.org/10.2307/3001616
Fisher, R. A. (1935). *The Design of Experiments*. Oliver and Boyd.
Freeman, G. H., & Halton, J. H. (1951). Note on an exact treatment of contingency, goodness of fit and other problems of significance. *Biometrika*, 38(1/2), 141–149. https://doi.org/10.2307/2332226
Haldane, J. B. S. (1956). The estimation and significance of the logarithm of a ratio of frequencies. *Annals of Human Genetics*, 20(4), 309–311. https://doi.org/10.1111/j.1469-1809.1955.tb01285.x
Patil, I. (2021). Visualizations with statistical details: The ‘ggstatsplot’ approach. *Journal of Open Source Software*, 6(61), 3167. https://doi.org/10.21105/joss.03167
R Core Team. (2023). *R: A language and environment for statistical computing*. R Foundation for Statistical Computing, Vienna, Austria. https://www.R-project.org/
Wickham, H., Averick, M., Bryan, J., Chang, W., McGowan, L. D., François, R., Grolemund, G., Hayes, A., Henry, L., Hester, J., Kuhn, M., Pedersen, T. L., Miller, E., Bache, S. M., Müller, K., Ooms, J., Robinson, D., Seidel, D. P., Spinu, V., … Yutani, H. (2019). Welcome to the Tidyverse. *Journal of Open Source Software*, 4(43), 1686. https://doi.org/10.21105/joss.01686
Yates, F. (1934). Contingency tables involving small numbers and the $\chi^2$ test. *Supplement to the Journal of the Royal Statistical Society*, 1(2), 217–235. https://doi.org/10.2307/2983604