الإحصاء والبياناتالبحث العلمي والقياس النفسيبرمجة R

كيفية إنشاء متغيرات فئوية في R (مع أمثلة)

دليل أكاديمي شامل يوضح كيفية إنشاء وإدارة المتغيرات الفئوية في لغة R الإحصائية باستخدام دوال factor وifelse وcut وحزم tidyverse مع أمثلة عملية مفصلة.

تاريخ النشر

تُعد معالجة البيانات النوعية وتصنيفها ركيزة أساسية في التحليل الإحصائي الحديث وبحوث القياس والتقييم النفسي والتربوي والعلوم السلوكية والطبية. في البيئات البرمجية المتقدمة مثل بيئة الحوسبة الإحصائية R Project for Statistical Computing، لا يقتصر التعامل مع المتغيرات الفئوية على مجرد تخزين نصوص أو وسوم وصفية، بل يمتد ليشمل بنية برمجية ورياضية دقيقة تُعرف باسم العامل (Factor). يتيح هذا الهيكل للباحث والمحلل تحويل المشاهدات الخام إلى فئات محددة رياضياً، وضبط مستوياتها، والتحكم في إشاراتها المرجعية داخل النماذج الخطية والنماذج الخطية المعممة بدقة بالغة.

إن الخطأ في تمثيل المتغير الفئوي أو التعامل معه كمتغير رقمي مستمر أو نصي بحت يؤدي بالضرورة إلى استنتاجات مضللة وتقديرات غير متسقة لمعلمات النماذج الإحصائية (Parameter Estimates). فعلى سبيل المثال، إذا عُوملت المجموعات التجريبية والضابطة كأرقام مجردة (مثل 1 و 2) دون عوملتها، فإن خوارزميات الانحدار ستفترض وجود علاقة خطية متصلة وفواصل متساوية بين الأرقام، مما يفرغ التحليل من مضمونه النظري. من هنا، يكتسب فهم آليات بناء المتغيرات الفئوية وتعديلها وهيكلتها داخل R أهمية منهجية تتجاوز مجرد كتابة الأكواد البرمجية إلى صلب التصميم التجريبي وضمان جودة النتائج.

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

1. مقدمة إلى المتغيرات الفئوية (Categorical Variables) وأهميتها في بيئة R

1.1 مفهوم المتغيرات الفئوية في النمذجة الإحصائية والبحوث النفسية

يُعرَّف المتغير الفئوي (Categorical Variable) في الإحصاء الرياضي ونظرية القياس بأنه متغير يتألف من عدد محدود ومحدد من الفئات أو المجموعات النوعية المنفصلة (Mutually Exclusive and Exhaustive Categories)، بحيث تنتمي كل وحدة تحليلية أو مفحوص إلى فئة واحدة فقط دون تداخل. في بحوث القياس النفسي والعلوم الاجتماعية والسلوكية، تشكل المتغيرات الفئوية جوهر التصميمات التجريبية وشبه التجريبية؛ حيث تُستخدم لتمثيل التوزيع الديموغرافي كالجنس والحالة الاجتماعية، أو لتصنيف الحالات الإكلينيكية كالتشخيص الطبي (مثل: مصاب باضطراب القلق، غير مصاب)، أو لتحديد أذرع المعالجة التجريبية (مجموعة ضابطة، معالجة دوائية، علاج سلوكي معرفي).

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

يؤثر الترميز الصحيح والمحكم للمتغيرات الفئوية تأثيراً مباشراً على درجات الحرية (Degrees of Freedom) وكفاءة تقدير التباين في النماذج الإحصائية المتقدمة؛ إذ يقوم البرنامج عند إدخال المتغير الفئوي في نماذج الانحدار بإنشاء متغيرات وهمية (Dummy Variables) تلقائياً، وبالتالي فإن أي خلل في ترميز هذه الفئات أو تعريفها يؤدي إلى تشويه في مصفوفة التصميم (Design Matrix) وخطأ في حساب فترات الثقة ومستويات الدلالة الإحصائية.

1.2 كيف تتعامل لغة R مع المتغيرات النوعية عبر بنية العامل (Factor)

تتعامل بيئة R مع البيانات النوعية بأسلوب فريد وفعال حوسبياً عبر بنية بيانات مخصصة تُدعى العامل (Factor). لا يتم تخزين العامل في الذاكرة كنصوص متكررة، بل يُخزن داخلياً كمتجه من الأعداد الصحيحة (Integer Vector) يُشير كل عنصر فيه إلى موقع الفئة المقابلة ضمن جدول مفهرس يحتوي على القيم الفريدة التي تُسمى المستويات (Levels). هذا التصميم الهندسي المبتكر يقلل من استهلاك الذاكرة العشوائية (RAM) بشكل هائل، ويزيد من سرعة معالجة العمليات الحسابية ومصفوفات التغاير أثناء ملاءمة النماذج الخطية الكبيرة.

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

يعتمد هيكل العامل في R على السمات المدمجة (Attributes)، وأهمها سمة الفئات المستوية (Levels Attribute) وسمة الصنف البرمجي (Class Attribute) الذي يحمل القيمة factor أو ordered factor. تحدد سمة المستويات الفضاء الكامل للقيم الممكنة للمتغير الفئوي حتى وإن لم تكن بعض تلك المستويات ممثلة بمشاهدات فعلية في العينة الحالية، وهو ما يضمن الحفاظ على الهيكل العام للتصميم التجريبي عند إجراء التصفية أو تقسيم البيانات إلى عينات فرعية للدراسة والتحليل المقارن.

2. المفاهيم الأساسية لهيكل العوامل (Factors) في R: المستويات والتسميات

2.1 بنية دالة factor() والمحددات التابعة لها

تُعد دالة factor() الأساس البرمجي الأهم لبناء وتشكيل العوامل في لغة R القياسية (Base R). تأخذ هذه الدالة الصيغة الرياضية والبرمجية التالية:

factor(x = character(), levels, labels = levels, exclude = NA, ordered = is.ordered(x), nmax = NA)

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

تلعب وسيطة labels دوراً جوهرياً في تحسين قابلية قراءة وتفسير المخرجات الإحصائية؛ فهي تتيح للمحلل إسناد مسميات نصية جديدة ومفسرة تقابل المستويات المحددة في وسيطة levels. من الأهمية بمكان التأكيد على أن طول متجه labels يجب أن يتطابق بدقة متناهية مع طول متجه levels، وإلا ستحدث أخطاء في تعيين البيانات. إذا تم تحديد المستويات كأرقام كودية مثل c(1, 2) فإن labels = c(“Control”, “Treatment”) ستقوم بإعادة تعيين القيمة 1 إلى المجموعة الضابطة والقيمة 2 إلى المجموعة التجريبية برمجياً وإحصائياً.

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

2.2 الفحص البنيوي والتشخيصي للعوامل في R

عقب إنشاء المتغير الفئوي، يتطلب بروتوكول ضبط جودة البيانات التحقق من صحة البنية الداخلية للعامل ومستوياته. تتيح دالة str() فحص التركيب الداخلي للكائن البرمجي، موضحة نوع الصنف (Factor)، وعدد المستويات الفريدة، وأسماء المستويات الأولى، إلى جانب عرض التمثيل العددي الصحيح المخزن داخلياً لكل مشاهدة. كما تُستخدم دالة class() للتأكد من أن الكائن ينتمي لصنف factor، بينما تؤكد دالة typeof() الهيكل الأساسي كمتجه عددي صحيح (integer).

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

لتشخيص التوزيع التكراري للفئات المنشأة، تُعد دالتا table() و summary() الأداتين الأساسيتين لفحص التكرارات المطلقة لكل فئة ورصد أي خلل إحصائي مثل ظاهرة الفئات النادرة (Sparse Categories) أو الفئات الفارغة (Zero-count Levels). يقدم استدعاء summary() على كائن من نوع Factor جدولاً تكرارياً موجزاً يتضمن عدد القيم المفقودة إن وجدت، مما يمنح الباحث رؤية استكشافية سريعة قبل الشروع في النمذجة المتقدمة.

3. إنشاء متغير فئوي من الصفر (From Scratch) باستخدام factor()

3.1 بناء متجه فئوي جديد من قيم نصية ورقمية

يبدأ بناء المتغيرات الفئوية من الصفر في بيئة R بتجميع المشاهدات الفردية داخل متجه أولي باستخدام دالة الربط المتجهي c(). يمكن لهذا المتجه أن يحتوي على نصوص صريحة أو أكواد رقمية تعكس استجابات المفحوصين أو وحدات المعاينة. بعد ذلك، يتم تمرير هذا المتجه مباشرة كمعامل أول داخل دالة factor() لتحويله إلى كائن عاملي مكتمل الخصائص الإحصائية والبرمجية.

عند تمرير متجه نصي دون تحديد وسيطة levels، تعتمد R تلقائياً خوارزمية الترتيب الأبجدي اللاتيني أو الرقمي لتحديد المستويات؛ فإذا أنشأنا متجهاً يمثل مجموعات دراسة تجريبية يحتوي على القيم c(“Placebo”, “Low_Dose”, “High_Dose”, “Placebo”, “Low_Dose”)، فإن الدالة تستخلص القيم الفريدة الثلاث وتعين “High_Dose” كمستوى أول و”Low_Dose” كمستوى ثانٍ و”Placebo” كمستوى ثالث وفقاً للترتيب الهجائي. لتفادي هذا السلوك الافتراضي وضبط الترتيب المنهجي السليم، يجب تحديد levels = c(“Placebo”, “Low_Dose”, “High_Dose”) صراحة داخل الدالة.

في تصاميم البحوث الإكلينيكية المعشاة (Randomized Controlled Trials)، يُعد ترميز المجموعات باستخدام وسيطتي levels و labels معاً الممارسة القياسية الفضلى. فإذا تم إدخال بيانات التجارب كرموز رقمية مثل c(0, 1, 1, 0, 2)، يتم تحويلها بكفاءة عبر الكود التالي:

group_factor <- factor(c(0, 1, 1, 0, 2), levels = c(0, 1, 2), labels = c(“Control”, “CBT_Intervention”, “Pharmacotherapy”))

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

3.2 دمج المتغير الفئوي المنشأ داخل إطار بيانات (Data Frame)

تمثل أطر البيانات (Data Frames) الهيكل التنظيمي الأكثر استخداماً لإدارة المصفوفات الإحصائية في R. لدمج متغير فئوي جديد مع متغيرات متصلة كالعمر والدرجات الكلية لاختبارات التحصيل أو درجات الاكتئاب، يتم استخدام دالة data.frame() لبناء مصفوفة متكاملة منسقة الأعمدة وموحدة المؤشرات الصفية (Row Indices).

عند إضافة عمود فئوي جديد إلى إطار بيانات قائم بالفعل، يُستخدم معامل الإسناد بالدولار ($) أو الأقواس المزدوجة [[]]. على سبيل المثال، إذا كان لدينا إطار بيانات يُدعى clinical_trial يحتوي على معرف المفحوص والدرجة القبلية، يمكن إضافة عمود الفئات مباشرة عبر العبارة:

clinical_trial$Condition <- factor(raw_conditions, levels = c(“A”, “B”), labels = c(“Standard Care”, “Novel Treatment”))

كما يمكن الاعتماد على دالة transform() الأساسية أو دوال منظومة tidyverse لإنجاز هذا الدمج بسلاسة وانسيابية برمجية عالية.

يستلزم دمج الأعمدة الفئوية التحقق الصارم من تطابق أبعاد إطار البيانات؛ حيث تفرض R تطابق عدد عناصر المتجه الفئوي الجديد تماماً مع عدد صفوف إطار البيانات (nrow). إذا اختلف الطول، فإن R قد تلجأ إلى خاصية تدوير العناصر (Recycling Rule) إذا كان طول المتجه الأصغر من مضاعفات الأكبر، مما يؤدي إلى تشوه جسيم وغير مقصود في بنية البيانات وربط استجابات المفحوصين بتصنيفات تجريبية خاطئة دون إطلاق أخطاء توقف التنفيذ، وهو ما يفرض استخدام دالة stopifnot(length(new_var) == nrow(df)) كإجراء وقائي برمجي صارم.

4. تحويل المتغيرات الرقمية إلى متغيرات فئوية ثنائية باستخدام ifelse() و as.factor()

4.1 المنطق الشرطي الثنائي عبر دالة ifelse()

تعتمد النمذجة الإحصائية في كثير من الأحيان على تحويل المتغيرات الكمية المستمرة إلى متغيرات ثنائية التفرع (Dichotomous Categorical Variables) لغرض تصنيف الحالات وفق معايير إكلينيكية محددة أو لتطبيق نماذج الانحدار اللوجستي الثنائي. تُعد دالة ifelse() الموجهة (Vectorized Conditional Function) في R الأداة الأساسية لتطبيق هذا المنطق الشرطي على المتجهات العددية بكفاءة برمجية عالية.

تأخذ دالة ifelse() ثلاثة وسائط رئيسية: الشرط المنطقي (test)، والقيمة المعادة في حال تحقق الشرط (yes)، والقيمة المعادة في حال عدم تحققه (no). على سبيل المثال، عند تحديد نقطة قطع إحصائية (Cut-off Point) لمقياس بيك للاكتئاب (BDI-II) عند الدرجة 14 لفرز الأفراد إلى فئتين، تُصاغ العبارة البرمجية كالتالي:

binary_classification <- ifelse(bdi_scores >= 14, “Clinical_Depression”, “Subclinical”)

تقوم هذه الدالة بفحص كل عنصر في المتجه bdi_scores بصورة متزامنة وتوليد متجه نصي مقابل يتطابق في الطول مع المتجه الأصلي.

من الناحية المنهجية، يجب على الباحثين توخي الحذر الشديد عند اختيار نقاط القطع؛ إذ إن التقسيم الثنائي للمتغيرات المستمرة يؤدي إلى فقدان جزء من التباين الإحصائي (Information Loss) وتقليل القوة الإحصائية (Statistical Power). ومع ذلك، عندما تملي المعايير التشخيصية أو التصنيفات الميدانية المعتمدة في الدليل التشخيصي والإحصائي للاضطرابات النفسية (DSM-5) وجود عتبة فارقة، يصبح التحويل الشرطي الثنائي ضرورة علمية وإجرائية لتحديد الأهلية للعلاج أو التدخل المساند.

4.2 تطبيق دالة as.factor() لتثبيت التصنيف الثنائي

إن المخرج النهائي الناتج عن تنفيذ دالة ifelse() هو متجه نصي مجرد (Character Vector) أو عددي (Numeric Vector)، ولا يعتبر عاملاً إحصائياً (Factor) بالمعنى الرياضي داخل بيئة R. لضمان تعرف حزم التحليل الإحصائي ونماذج الانحدار على هذا المخرج كمتغير فئوي ثنائي ذي مستويات صريحة، يجب استدعاء دالة التحويل النمطي as.factor() لتغليف المتجه النصي وتثبيته كعامل رسمي في الذاكرة.

لتطبيق ذلك عملياً في سياق بحوث قياس القلق، إذا قمنا بقياس مستويات القلق عبر استبانة درجاتها تتراوح من 0 إلى 100، وكانت نقطة الفصل المعتمدة هي 50، يتم تنفيذ الكود المركب التالي:

anxiety_factor <- as.factor(ifelse(anxiety_scores > 50, “High_Anxiety”, “Low_Anxiety”))

بموجب هذا التحويل، تنشئ R عاملاً يحتوي على مستويين فريدين هما “High_Anxiety” و “Low_Anxiety”، ويتم ترتيبهما هجائياً بشكل افتراضي بحيث يصبح “High_Anxiety” هو المستوى الأول (Reference Level) ما لم يُعد ضبطه لاحقاً.

عقب إتمام التحويل، يُجرى تقييم وصفي شامل للتوزيع التكراري والنسبي للفئات الثنائية الناتجة للتأكد من عدم وجود اختلال حاد في التوزيع (Class Imbalance) قد يؤثر سلباً على تقديرات اختبارات الفروق مثل اختبار ت للعينات المستقلة (Independent Samples t-test) أو الانحدار اللوجستي. يتم استخدام الدالتين prop.table(table(anxiety_factor)) لحساب النسب المئوية الدقيقة لكل فئة من فئتي التصنيف ومقارنتها بالنسب المعيارية الموثقة في الدراسات السابقة.

5. إنشاء متغيرات فئوية متعددة المستويات باستخدام دوال ifelse() المتداخلة

5.1 صياغة الشروط المتعددة عبر Nested ifelse Statements

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

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

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

5.2 تطبيق عملي: تصنيف مقياس رقمي متعدد الدرجات

لتوضيح البناء العملي للشروط المتداخلة، سنفترض دراسة نفسية تربوية تقيس درجات الدافعية الأكاديمية لدى الطلاب على مقياس من 0 إلى 100، حيث يُراد تصنيف الدرجات إلى أربعة مستويات معيارية: ممتاز (Level_A)، جيد جداً (Level_B)، متوسط (Level_C)، ومنخفض (Level_D). يتم تنفيذ التداخل الشرطي وعوملة المخرج في خطوة برمجية محكمة عبر الكود التالي:

academic_performance <- as.factor(ifelse(scores >= 85, “Level_A”, ifelse(scores >= 70, “Level_B”, ifelse(scores >= 50, “Level_C”, “Level_D”))))

في هذا النموذج البرمجي، يتم أولاً فحص ما إذا كانت الدرجة تساوي أو تتجاوز 85؛ فإذا كانت كذلك، تُسند القيمة “Level_A”. أما إذا كانت أقل، ينتقل المصنف تلقائياً إلى الشرط الثاني لفحص ما إذا كانت الدرجة تقع بين 70 و 84.99 لإسناد القيمة “Level_B”، ثم الشرط الثالث للدرجات بين 50 و 69.99 لإسناد “Level_C”، بينما تحصل كافة الدرجات الواقعة تحت 50 حكماً على التصنيف “Level_D”.

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

6. تقسيم المتغيرات المستمرة إلى فئات باستخدام دالة cut()

6.1 محددات وآليات دالة cut() في التقطيع الإحصائي (Binning)

تُعد دالة cut() البديل الرياضي والإحصائي الأرقى والأكثر كفاءة لجمل ifelse المتداخلة عند الرغبة في تقطيع متغير كمي مستمر إلى فترات ومجالات رقمية منتظمة أو غير منتظمة (Binning/Discretization). تتميز cut() بقدرتها الفائقة على معالجة المتجهات الضخمة حسابياً دون الحاجة إلى كتابة شروط منطقية مكررة، وتقوم تلقائياً بإرجاع كائن من نوع Factor.

تعتمد الدالة في بنيتها الأساسية على وسيطة breaks، والتي يمكن تمريرها بطريقتين مختلفتين تماماً من الناحية الإحصائية: إما بتمرير عدد صحيح موجب يمثل عدد الفترات المتساوية في العرض (Equal-width Intervals) المراد تقسيم المتغير إليها، أو بتمرير متجه عددي صريح يحدد النقاط الحدية الفاصلة بين الفئات بدقة متناهية مثل breaks = c(0, 18, 35, 60, 100).

تتحكم وسيطتان جوهريتان في الإغلاق الرياضي للفترات الفئوية: الوسيطة right والوسيطة include.lowest. بصورة افتراضية، تكون right = TRUE، مما يعني أن الفترات تكون مفتوحة من اليسار ومغلقة من اليمين بالشكل الرياضي (a, b]، أي أن القيمة الحدية العليا مشمولة في الفترة السابقة. لتغيير الفترات لتصبح مغلقة من اليسار ومفتوحة من اليمين [a, b)، يتم ضبط right = FALSE. وتعمل الوسيطة include.lowest = TRUE على ضمان شمول أصغر قيمة حدية في المتجه ضمن الفترة الأولى، مما يمنع تحول القيم الواقعة على الحد الأدنى الأدنى إلى قيم مفقودة (NA).

6.2 تخصيص تسميات الفترات المقطعة ومطابقتها للمعايير الأكاديمية

تُنتج دالة cut() افتراضياً تسميات فئوية تمثل الفواصل الرياضية للمجالات، مثل “(18,35]” و “(35,60]”. على الرغم من دقة هذه التسميات رياضياً، إلا أنها قد تكون غير ملائمة للعرض في التقارير الأكاديمية والمخططات البيانية الموجهة للنشر. لذلك، تتيح وسيطة labels إسناد متجهات نصية واضحة ومحددة تصف الفئات العمرية أو مستويات الأداء بدقة.

لتطبيق ذلك في دراسة ديموغرافية تعنى بتصنيف المشاركين وفق فئاتهم العمرية، يتم تطبيق الكود المتكامل التالي:

age_categories <- cut(age_vector, breaks = c(0, 12, 18, 35, 60, Inf), labels = c(“Child”, “Adolescent”, “Young_Adult”, “Middle_Aged”, “Senior”), right = FALSE, include.lowest = TRUE)

استخدام اللانهاية الإيجابية (Inf) كحد أقصى يضمن احتواء أي عمر متقدم دون الحاجة لتوقع أقصى عمر ممكن في العينة، وهو أسلوب منهجي وقائي يمنع فقدان بيانات كبار السن أثناء التحويل.

تتطلب المعالجة السليمة لدالة cut() الانتباه الشديد للقيم الشاذة والمتطرفة (Outliers) التي قد تقع خارج نطاق متجه breaks المحدد. إذا احتوت العينة على قيم أصغر من الحد الأدنى أو أكبر من الحد الأقصى للمجال، ستقوم دالة cut() بإرجاع NA لتلك الحالات. لذلك، يجب دائماً فحص sum(is.na(age_categories)) ومقارنتها بعدد القيم المفقودة في المتغير الأصلي لضمان أن التقطيع لم يسقط أي مشاهدات صالحة نتيجة لخطأ في تحديد أطراف المجالات الإحصائية.

7. التعامل مع المتغيرات الفئوية الترتيبية (Ordered Factors)

7.1 مفهوم الرتب في المتغيرات الفئوية واستخدام ordered = TRUE

تتميز المتغيرات الفئوية الترتيبية (Ordinal Variables) بوجود ترتيب هرمي أو منطقي متدرج بين مستوياتها، مثل شدة الألم أو التقديرات الدراسية، دون أن يقتضي ذلك بالضرورة تساوي الفواصل الرياضية بين المستويات المتتالية. في بيئة R، يتم تمثيل هذه المتغيرات عبر فئة خاصة من العوامل تُدعى العامل المرتب (Ordered Factor)، ويتم إنشاؤها ببساطة عن طريق تفعيل الوسيطة ordered = TRUE داخل دالة factor() أو عبر استدعاء الدالة المباشرة ordered().

عند تحويل متغير إلى عامل مرتب، يكتسب المتجه صنفين برمجيين هما “ordered” و “factor”. ينعكس هذا التغيير البنيوي على طريقة عرض المستويات في سطر الأوامر؛ حيث تُعرض مفصولة بعلامة الأصغر من (<) للدلالة على الترتيب التصاعدي، مثل Level_1 < Level_2 < Level_3. يتيح هذا الترتيب للمحلل استخدام معاملات المقارنة المنطقية المباشرة مثل > و < و >= بين مشاهدات العامل، وهو أمر غير مسموح به برمجياً في العوامل الاسمية العادية (Nominal Factors) ويولد خطأ تنفيذي عند محاولته.

يمتد الأثر الإحصائي للعوامل المرتبة إلى عمق النمذجة الرياضية داخل نماذج تحليل التباين (ANOVA) ونماذج الانحدار الخطي؛ حيث تقوم R تلقائياً بتطبيق مصفوفة التباين متعددة الحدود (Orthogonal Polynomial Contrasts: Linear, Quadratic, Cubic) بدلاً من مصفوفة التباين الثنائية التقليدية (Treatment Contrasts). يتيح ذلك للباحث اختبار ما إذا كانت استجابة المتغير التابع تتبع اتجاهاً خطياً منتظماً عبر الرتب، أو منحنى تربيعياً مقعراً، مما يعزز الفهم النظري للعلاقات غير الخطية بين المتغيرات النفسية والتربوية.

7.2 بناء مقاييس ليكرت (Likert Scales) كمتغيرات ترتيبية

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

likert_responses <- ordered(raw_likert_data, levels = c(“Strongly_Disagree”, “Disagree”, “Neutral”, “Agree”, “Strongly_Agree”))

يضمن هذا التمثيل الترتيبي المنضبط عدم قيام خوارزميات الترتيب الأبجدي بوضع “Agree” قبل “Disagree”، مما قد يشوه التحليل الإحصائي الاستكشافي والتوزيعي للمقياس بالكامل. بمجرد ترميز المتغير كعامل مرتب، يمكن للمحلل إجراء استعلامات منطقية وتصفية متقدمة بسهولة فائقة، مثل استخراج نسبة المفحوصين الذين كانت استجاباتهم محايدة أو أعلى من ذلك عبر كتابة العبارة المنطقية mean(likert_responses >= “Neutral”, na.rm = TRUE) * 100.

من المنظور الإحصائي، يثور جدل منهجي مستمر بين رواد القياس حول جواز معاملة درجات ليكرت كبيانات فترية مستمرة وتطبيق الاختبارات البارامترية عليها، أو وجوب معاملتها كمتغيرات ترتيبية واستخدام الاختبارات اللابارامترية مثل اختبار كروسكال واليس (Kruskal-Wallis) أو نماذج الانحدار اللوجستي الترتيبي (Ordinal Proportional Odds Models). إن تمثيل هذه المقاييس في R كـ Ordered Factors يمنح الباحث المرونة المنهجية الكاملة لملاءمة نماذج الانحدار الترتيبي المتقدمة بدقة متناهية عبر حزم متخصصة مثل حزمة MASS ودالتها الشهيرة polr().

8. إعادة تسمية وتعديل مستويات المتغير الفئوي القائم

8.1 استخدام دالة levels() للتعديل المباشر والتجميع

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

لإعادة تسمية جميع مستويات متغير فئوي ثلاثي المستويات بصورة مباشرة، يتم إسناد متجه نصي جديد مكافئ في الطول للمتجه الأصلي عبر الكود:

levels(study_factor) <- c(“Low_Dose”, “Medium_Dose”, “High_Dose”)

أما لدمج مستويات فرعية متعددة، فيمكن تمرير قائمة (List) تحدد المستويات المدمجة، أو إسناد أسماء متطابقة للمستويات المراد توحيدها. على سبيل المثال، إذا كان المتغير يحتوي على الفئات c(“Depression_Mild”, “Depression_Moderate”, “Depression_Severe”, “Control”)، وأردنا دمج جميع درجات الاكتئاب في فئة واحدة تسمى “Clinical”، يمكن تنفيذ الإسناد التالي:

levels(depression_factor) <- list(Clinical = c(“Depression_Mild”, “Depression_Moderate”, “Depression_Severe”), Non_Clinical = “Control”)

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

8.2 إعادة ترتيب المستويات المرجعية باستخدام دالة relevel()

في نماذج الانحدار الخطي (Linear Models – lm) ونماذج الانحدار اللوجستي (glm)، تتبع لغة R استراتيجية ترميز المتغيرات الوهمية للمقارنة المرجعية (Treatment Contrast Coding). بموجب هذه الاستراتيجية، يتم اختيار المستوى الأول في مصفوفة مستويات العامل ليكون هو الفئة المرجعية الأساسية (Baseline/Reference Category)، وتُحسب كافة معاملات الانحدار (Beta Coefficients) وفترات الثقة وقيم الدلالة الإحصائية للمستويات الأخرى بوصفها فروقاً مباشرة مقارنة بهذه الفئة المرجعية المحددة.

نظراً لأن R تختار الفئة المرجعية أبجدياً بصورة تلقائية، فقد يؤدي ذلك إلى اختيار مستوى غير منطقي كنقطة ارتكاز؛ كأن يتم تعيين مجموعة التدخل العلاجي كفئة مرجعية بدلاً من المجموعة الضابطة. لتصحيح ذلك وتحديد الفئة الضابطة كأساس للمقارنة، تُستخدم دالة relevel() بتمرير وسيطة ref:

study_group <- relevel(study_group, ref = “Control_Group”)

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

9. إنشاء المتغيرات الفئوية وإدارتها المتقدمة باستخدام حزمة forcats

9.1 مقدمة لحزمة forcats ودورها في منظومة tidyverse

على الرغم من قوة الدوال الأساسية في Base R، إلا أن التعامل مع المتغيرات الفئوية قد تشوبه بعض التعقيدات التركيبية عند تنظيف البيانات الضخمة أو إعادة ترتيب الفئات بناءً على متغيرات إحصائية أخرى. لمعالجة هذه القصور المنهجي، طُوّرت حزمة forcats (وهي جناس تركيبي لكلمة Factors) كجزء أساسي من منظومة البيانات المترابطة (Tidyverse Ecosystem). تقدم الحزمة منظومة متكاملة من الدوال المتخصصة الموحدة النحو والتركيب، والتي تبدأ جميعها بالبادئة fct_ لتسهيل استدعائها واستخدامها التفاعلي.

تتكامل حزمة forcats تكاملاً تاماً مع أدوات معالجة البيانات الحديثة مثل حزمة dplyr وعمليات الأنابيب (Pipes |> أو %>%) وحزمة الرسوم البيانية المتقدمة ggplot2. تتميز دوال forcats بعدم تغييرها للأنواع البيانية للمتغيرات بصورة مفاجئة، وتوفر آليات واضحة لمعالجة القيم المفقودة وإعادة الترتيب التلقائي لمستويات العامل استناداً إلى تكراراتها الإحصائية أو استناداً إلى دالة تلخيصية لمتغير كمي آخر.

يتم تحميل الحزمة إما منفردة عبر library(forcats) أو ضمن حزمة tidyverse الشاملة library(tidyverse). يوفر هذا التضمين بيئة عمل برمجية متقدمة تضمن كتابة كود إحصائي نظيف (Clean Code)، وسهل القراءة والمراجعة والتكرار، بما يتوافق مع أعلى معايير العلوم المفتوحة وقابلية إعادة الإنتاج البحثي (Reproducibility).

9.2 إعادة ترميز الفئات ودمجها عبر fct_recode() و fct_collapse()

تقدم حزمة forcats دالة fct_recode() لتعديل وتغيير مسميات الفئات بطريقة تركيبية فائقة الوضوح والأمان؛ حيث تعتمد صيغة التعيين: الاسم_الجديد = “الاسم_القديم”. تتيح هذه الصيغة الصريحة للباحث تغيير أسماء مستويات معينة دون المساس ببقية المستويات، ودون الخوف من حدوث خطأ في مطابقة الفهارس الصفية. يوضح الكود التالي كيفية إعادة ترميز متغير الحالة الوظيفية:

df$Employment <- fct_recode(df$Employment, “Full_Time” = “FT”, “Part_Time” = “PT”, “Unemployed” = “UN”)

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

df$Education_Level <- fct_collapse(df$Raw_Education, Basic = c(“Elementary”, “Middle_School”), Secondary = c(“High_School”, “Vocational”), Higher = c(“Bachelor”, “Master”, “PhD”))

ولمعالجة مشكلة الفئات نادرة التكرار التي تشوه النماذج الإحصائية وتستنزف درجات الحرية دون طائل، توفر الحزمة دالة fct_lump_min() ودالة fct_lump_prop(). تقوم دالة fct_lump_prop(f, prop = 0.05) بتجميع كافة الفئات التي تمثل تكراراً يقل عن 5% من إجمالي حجم العينة ودمجها تلقائياً في فئة عامة موحدة تحمل اسم “Other”، مما يحمي نماذج التحليل من ظاهرة التشتت المفرط ويعزز من متانة التقديرات الإحصائية المعلمية.

10. تطبيق الشروط المتعددة المعقدة لإنشاء الفئات عبر dplyr::case_when()

10.1 بنية دالة case_when() وبدائلها الحديثة في كتابة الكود النظيف

عند بناء متغيرات فئوية تستند إلى شروط منطقية متراكبة ومتقاطعة، تصبح دوال ifelse المتداخلة صعبة القراءة وعرضة للأخطاء البرمجية الخفية. هنا تتجلى القوة البرمجية الفائقة لدالة case_when() التابعة لـ حزمة dplyr؛ حيث توفر هيكلية تصريحية معيارية مبنية على صيغ المعادلات ثنائية الطرف (LHS ~ RHS Formula Syntax)، حيث يمثل الطرف الأيسر (Left-Hand Side) الشرط المنطقي القابل للتقييم كـ TRUE أو FALSE، بينما يمثل الطرف الأيمن (Right-Hand Side) القيمة أو الوسم الفئوي المسند عند تحقق ذلك الشرط.

تتميز دالة case_when() بأنها تفحص الشروط تسلسلياً من الأعلى إلى الأسفل، وتُسند القيمة الخاصة بأول شرط يتحقق، متجاهلة كافة الشروط التالية لذلك السطر. كما تفرض الدالة توافقاً صارماً في النوع البياني لكافة المخرجات في الطرف الأيمن، مما يمنع حدوث أخطاء التحويل الضمني للأنواع غير المتجانسة. لتحديد القيمة الاحتياطية لكافة الحالات التي لم تستوفِ أياً من الشروط المحددة، يُستخدم التعبير القياسي TRUE ~ “Default_Value” في نهاية السلسلة الشرطية.

لضمان تحويل المخرج النهائي لدالة case_when() إلى متغير فئوي مكتمل البنية، يتم تمرير الناتج مباشرة إلى دالة factor() مع تحديد المستويات المطلوبة صراحة، كما هو موضح في البنية التالية:

df <- df |> mutate(Clinical_Status = factor(case_when(score >= 80 ~ “Severe”, score >= 50 ~ “Moderate”, score >= 25 ~ “Mild”, TRUE ~ “Normal”), levels = c(“Normal”, “Mild”, “Moderate”, “Severe”)))

10.2 دمج متغيرات متعددة لإنشاء تصنيفات مركبة (Composite Categories)

تسمح دالة case_when() بدمج متغيرات مستقلة متعددة لإنشاء متغيرات فئوية مركبة (Composite / Typological Categories) تعكس التفاعل النظري بين أبعاد نفسية أو سلوكية متمايزة. يفيد هذا الأسلوب المنهجي في دراسات التشكيل السلوكي وتحديد الملامح النفسية (Profile Analysis) للمفحوصين بناءً على تقاطع محاور قياس متعددة.

لتطبيق ذلك عملياً، نفترض دراسة تبحث التفاعل بين “مستوى الضغط النفسي المتصور” (Stress: مقاس من 0 إلى 50) و”مستوى الدعم الاجتماعي” (Support: مقاس من 0 إلى 100). يُراد بناء تصنيف مركب يفرز الأفراد إلى أربعة ملامح إكلينيكية متمايزة: معرّض للخطر الشديد، مقاوم للضغوط، مضغوط مدعوم، ومستقر منخفض الضغط. يتم تنفيذ ذلك عبر الكود البرمجي التالي:

df <- df |> mutate(Risk_Profile = factor(case_when(Stress >= 30 & Support < 40 ~ “High_Risk_Isolated”, Stress >= 30 & Support >= 40 ~ “High_Risk_Supported”, Stress < 30 & Support < 40 ~ “Low_Risk_Vulnerable”, Stress < 30 & Support >= 40 ~ “Resilient_Optimal”, TRUE ~ “Unclassified”), levels = c(“Resilient_Optimal”, “Low_Risk_Vulnerable”, “High_Risk_Supported”, “High_Risk_Isolated”)))

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

11. إدارة القيم المفقودة (NA) والمتغيرات الفئوية في R

11.1 تأثير القيم المفقودة على إنشاء العوامل ومستوياتها

تُمثل البيانات المفقودة (Missing Data – NA) تحدياً إحصائياً ومنهجياً كبيراً في المعالجة الآلية للمتغيرات الفئوية. عند تطبيق دالة factor() الأساسية على متجه يحتوي على قيم مفقودة، فإن R تقوم افتراضياً باستبعاد هذه القيم من سمة المستويات (Levels)، مما يجعلها تظهر كقيم غير معرفة إحصائياً وتُستبعد تلقائياً عند إجراء حسابات الجداول التكرارية أو التحليلات الانحدارية عبر الحذف القائم على القائمة (Listwise Deletion).

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

ضمن منظومة tidyverse الحديثة، تقدم حزمة forcats دالة متقدمة مخصصة لهذا الغرض وهي fct_na_value_to_level() (والتي كانت تُعرف سابقاً باسم fct_explicit_na()). تتيح هذه الدالة استبدال القيم المفقودة بتسمية نصية محددة وواضحة مثل “Missing_Data” أو “Not_Reported” وتثبيتها كمستوى رسمي للعامل، كما يوضح السطر البرمجي التالي:

df$Income_Group <- fct_na_value_to_level(df$Income_Group, level = “Declined_to_State”)

يضمن هذا الإجراء الشفافية الكاملة في نمذجة البيانات ومنع التناقص غير المبرر في حجم العينة التحليلية.

11.2 تنظيف المتغيرات الفئوية واستبعاد المستويات غير المستخدمة

تنشأ مشكلة المستويات الفارغة أو غير المستخدمة (Unused / Empty Levels) عندما يقوم المحلل بتصفية إطار البيانات (Subsetting/Filtering) لاستخراج عينة فرعية من مجتمع الدراسة؛ كأن يتم استخراج بيانات الإناث فقط من دراسة شاملة لكلا الجنسين. في هذه الحالة، يظل مستوى “Male” مسجلاً في سمة levels الخاصة بالمتغير الفئوي على الرغم من أن تكراره الفعلي في مجموعة البيانات المصفاة أصبح صفراً.

تؤدي المستويات الخالية إلى تشوهات إحصائية خطيرة ومربكة عند ملاءمة نماذج الانحدار وتحليل التباين؛ حيث تظهر معاملات ذات قيم غير معرفة (NA/Singularities) في جداول المخرجات نتيجة لنقص الرتبة في مصفوفة التصميم (Rank Deficiency)، كما تؤدي إلى ظهور أعمدة وفئات فارغة في الرسوم البيانية المنشأة عبر ggplot2. لإزالة هذه المستويات المعطلة وتنظيف المتغير الفئوي، تُستخدم دالة droplevels() في Base R:

filtered_df <- droplevels(subset(df, Gender == “Female”))

كما تقدم حزمة forcats الدالة المقابلة fct_drop() التي تؤدي نفس الغرض التنظيفي بكفاءة عالية داخل أنابيب معالجة البيانات عبر dplyr. إن المداومة على إسقاط المستويات الفارغة قبل الشروع في بناء النماذج الإحصائية الاستدلالية هي إحدى القواعد الذهبية لضمان سلامة النماذج وتفادي الانهيارات البرمجية الحسابية أثناء حساب مقلوب المصفوفات (Matrix Inversion).

12. التطبيقات العملية والتحليل الإحصائي للمتغيرات الفئوية المنشأة في R

12.1 التحليل الاستكشافي والتلخيص الجدولي للمتغيرات الفئوية

يبدأ التحليل الإحصائي للمتغيرات الفئوية بتوليد الجداول التكرارية البسيطة والمتقاطعة (Cross-tabulations) لاستكشاف توزيع التكرارات والنسب المئوية ومصفوفات الاقتران. في Base R، تُستخدم دالة table() لحساب التكرارات المطلقة، بينما تُستخدم دالة prop.table() لتحويل تلك التكرارات إلى نسب مئوية كلية أو نسب صفية وعمودية دقيقة. كما توفر دالة xtabs() صيغة نمذجة مرنة تعتمد على المعادلات الرياضية (~ Var1 + Var2) لإنشاء الجداول المزدوجة والمتعددة الأبعاد بكفاءة بالغة.

لإجراء التلخيص البصري المتقدم، تمثل حزمة ggplot2 المعيار الذهبي لتصوير المتغيرات الفئوية؛ حيث تُستخدم الدالة الهندسية geom_bar() لتمثيل التكرارات البسيطة للأعمدة، بينما تُستخدم الدالة geom_col() عند الرغبة في رسم قيم محسوبة مسبقاً. يمكن تعزيز التحليل البصري بتقسيم الأعمدة وفق متغير فئوي تجميعي ثانوي باستخدام الوسيطة position = “dodge” لإنشاء أعمدة متجاورة، أو position = “fill” لإنشاء أعمدة نسبية مئوية موحدة الارتفاع تبرز الفروق التوزيعية بوضوح متناهٍ.

في كتابة التقارير الأكاديمية ونشر البحوث، يتطلب التوثيق الإحصائي السليم حساب فترات الثقة للنسب المئوية (Confidence Intervals for Proportions) باستخدام دالة prop.test() أو دالة binom.test()، وتوثيق التكرارات المشاهدة والتكرارات المتوقعة، لتقديم صورة وصفية متكاملة تسبق الانتقال للاختبارات الإحصائية الاستدلالية المتقدمة.

12.2 توظيف المتغيرات الفئوية في الاختبارات الاستدلالية ونماذج الانحدار

تندمج المتغيرات الفئوية المنشأة في صلب الاختبارات الاستدلالية لاختبار الفروض العلمية. لاختبار استقلالية متغيرين فئويين اسميين (مثل: نوع التدخل العلاجي ومستوى الاستجابة السريرية: تحسن / لم يتحسن)، يُطبق اختبار مربع كاي للاستقلالية عبر دالة chisq.test()، أو اختبار فيشر الدقيق fisher.test() في حال وجود خلايا ذات تكرار متوقع يقل عن 5 مشاهدات في جدول التقاطع.

عند استخدام المتغير الفئوي كمتغير مستقل مفسر لمتغير تابع كمي متصل (مثل درجات الاكتئاب بعد العلاج)، يتم توظيفه مباشرة في تحليل التباين أحادي الاتجاه (One-Way ANOVA) باستخدام دالة aov() أو نموذج الانحدار الخطي lm():

model <- lm(Depression_Post ~ Treatment_Group, data = df)

تقوم لغة R برمجياً بتحويل مستويات Treatment_Group إلى مصفوفة من المتغيرات الوهمية (Dummy Variables)، وتُظهر نتائج summary(model) التأثير النسبي لكل مستوى معالج مقارنة بالفئة المرجعية الأساسية المعينة، متضمنة قيمة معامل الانحدار ($\beta$)، والخطأ المعياري، وقيمة اختبار ت ومستوى الدلالة المقابل ($p$-value).

إذا رغب الباحث في تطبيق تباينات تجريبية مخصصة وموجهة نظرياً (Planned Orthogonal Contrasts) بدلاً من المقارنات الافتراضية، تتيح لغة R ضبط مصفوفة التباين للمتغير الفئوي عبر إسناد مصفوفة معاملات مخصصة باستخدام دالة contrasts()، مثل contrasts(df$Group) <- contr.helmert(3). يمنح ذلك الباحثين السيطرة الإحصائية الصارمة لاختبار الفرضيات النظرية المعقدة بما يتوافق مع أدق المعايير المنهجية المتبعة في بحوث القياس والتقويم النفسي والتربوي والتحليل الإحصائي الحيوي المتقدم.

الخلاصة والآفاق التطبيقية

يمثل التمكن من إنشاء المتغيرات الفئوية وضبط بنيتها الرياضية والبرمجية في لغة R حجر الزاوية في بناء التحليلات الإحصائية الدقيقة والموثوقة. لقد استعرض هذا الدليل المرجعي الأسس النظرية والتطبيقية لهيكل العامل (Factor)، بدءاً من البناء الأولي باستخدام دالة factor() ودوال التحويل الشرطي الثنائي والمتعدد عبر ifelse() و cut()، وصولاً إلى الأدوات الحديثة فائقة المرونة في منظومة tidyverse ممثلة في حزمتي forcats و dplyr.

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

References

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

looti, M. (2026, أغسطس 28). كيفية إنشاء متغيرات فئوية في R (مع أمثلة). عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-create-categorical-variables-in-r-with-examples/
looti, Mohammed. “كيفية إنشاء متغيرات فئوية في R (مع أمثلة).” عرب سايكلوجي, 28 أغسطس 2026, https://arabpsychology.com/statistics/how-to-create-categorical-variables-in-r-with-examples/.
looti, Mohammed. “كيفية إنشاء متغيرات فئوية في R (مع أمثلة).” عرب سايكلوجي. أغسطس 28, 2026. https://arabpsychology.com/statistics/how-to-create-categorical-variables-in-r-with-examples/.