Menu
flag Ar iconالعربيةdown icon

الأعداد العشوائية في R: ‏rnorm وrunif وsample وset.seed

ولّد بيانات عشوائية بدوال rnorm() وrunif() وrbinom() وsample()، واجعلها قابلة للتكرار بدالة set.seed()، وفك شفرة نظام التسمية d/p/q/r للتوزيعات في R.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

‏set.seed() تأتي أولًا

السحوبات العشوائية التي تتغير في كل تشغيل عديمة الفائدة للتعليم والتصحيح والتنقيح والعلم، فإذا قالت محاكاتك 0.146 اليوم و0.153 غدًا فأي رقم يدخل التقرير؟ وتثبّت set.seed() نقطة انطلاق المولّد، فيصبح تيار "العشوائية" التالي كله قابلًا للتكرار تمامًا:

البذرة نفسها تعني سحوبات متطابقة في كل مرة وعلى كل جهاز. والأرقام شبه عشوائية: متتالية حتمية مصممة لاجتياز كل اختبار إحصائي للعشوائية، وتختار البذرة موضع بدايتك في المتتالية. وقيمة البذرة نفسها لا تحمل معنى، سواء كانت 42 أو 7 أو 20260807، فاختر ما شئت لكن دوّنه. والعادة التي ينبغي بناؤها: set.seed() واحدة في أعلى أي سكربت يستخدم العشوائية. (ولاحظ أن استهلاك السحوبات يقدّم الحالة، فترتيب الاستدعاءات يهم هو أيضًا لقابلية التكرار.)

نظام d/p/q/r: جدول واحد يفك شفرة المكتبة كلها

يسمّي R كل دالة توزيع بصيغة بادئة + عائلة، وحين ترى الشبكة تستطيع قراءة مكتبة الإحصاء كاملة:

البادئةالسؤال الذي تجيب عنهمثال على التوزيع الطبيعي
rأعطني سحوبات عشوائيةrnorm(5)
dالكثافة: كم يبلغ ارتفاع المنحنى عند x؟dnorm(0)
pالاحتمال: ما قيمة P(X ≤ x)؟pnorm(1.96)
qالمئين: أي x يقع عند هذا المئين؟qnorm(0.975)

وp وq متعاكستان، وهما الزوج الذي قابلته في فترات الثقة بصيغة qt(0.975, df):

بدّل اسم العائلة وينتقل كل شيء معه: ‏runif/dunif/punif/qunif وrbinom/... وrpois/... وrt/... وrexp/.... فتعلّم أربع بادئات تحصل على عشرات التوزيعات.

‏rnorm(): سحوبات طبيعية

تسحب rnorm(n, mean, sd) من منحنى جرسي، وهي حصان العمل لمحاكاة بيانات شبيهة بالقياسات:

يقع متوسط العينة وانحرافها المعياري قرب 100 و15 لا عندهما بالضبط، وتلك الفجوة هي ضوضاء المعاينة، وتتقلص مع نمو n. والسطر الأخير حيلة تستحق السرقة: فـ mean() لمتجه منطقي هي نسبة قيم TRUE، وتخرج النسبة بعد 130 قريبة من القيمة النظرية 1 - pnorm(130, 100, 15) ≈ 2.3%. والقيم الافتراضية هي mean = 0, sd = 1 (التوزيع الطبيعي المعياري). ويُظهر مدرج تكراري لـ iq الجرس المألوف.

‏runif() وrbinom() وrpois()

ثلاث عائلات أخرى تغطي معظم احتياجات المحاكاة:

تنشر runif() السحوبات بالتساوي عبر مدى ("uniform" أي منتظم، لا "run if"، فالجميع يسيء قراءتها مرة واحدة). وتحاكي rbinom(n, size, prob) عدد n من التجارب، لكل منها size محاولة، وتُرجع عدد نجاحات كل تجربة، فتكون كل قيمة أعلاه عدد مرات ظهور الوجه من 10 رميات. وتولّد rpois(n, lambda) أعداد أحداث تقع باستقلال بمعدل متوسط معلوم: كتذاكر الدعم في الساعة، أو الأخطاء المطبعية في الصفحة.

‏sample(): المعاينة والخلط

حيث تخترع دوال r* قيمًا من توزيع، تسحب sample() من قيم تملكها أصلًا:

والوسيط replace هو القصة كلها: فالقيمة FALSE (الافتراضية) توزّع أوراق اللعب، إذ تظهر كل قيمة مرة واحدة، وطلب أكثر مما تملك خطأ. أما TRUE فترمي النرد، إذ يُعاد الضبط في كل سحبة. والمعاينة مع الإرجاع من بياناتك هي محرك التمهيد الإحصائي. وحين تُستدعى بمتجه فقط، تُرجع sample(x) تبديلًا عشوائيًا، وهي صيغة الخلط.

وتستخدم معاينة صفوف إطار بيانات الدالة sample() داخل فهرسة الصفوف:

تختار sample(nrow(mtcars), 5) خمسة أرقام صفوف عشوائية، وتسحب الفهرسة تلك الصفوف. وهذه هي الحركة المعيارية لفحص مجموعة بيانات كبيرة على عجل أو لتقسيم بيانات التدريب والاختبار.

محاكاة مونت كارلو مصغّرة

وهنا ثمرة صندوق الأدوات كله. السؤال: عملية تنتج قياسات موزعة وفق N(100, 15)، وأنت تحسب متوسط عشرة منها، فـ ما احتمال أن يتجاوز ذلك المتوسط 105؟ وبدل اشتقاق الجواب، حاكِه: أجرِ التجربة 10,000 مرة وعُدّ:

تقع المحاكاة ضمن بضعة أجزاء من الألف من القيمة المضبوطة (نحو 0.146). وتلك هي مونت كارلو في جملة واحدة: اكتب تجربة واحدة على هيئة دالة، وكرّرها آلاف المرات بـ replicate()، ثم خذ mean() للنجاحات. وقد وُجد الجواب المضبوط هنا لأن الإعداد بسيط بساطة الكتب المدرسية، لكن في اللحظة التي يتعقد فيها السؤال (توزيعات غريبة، أو القيمة العظمى لسحوبات مترابطة، أو لعبة قائمة على قواعد) ينغلق الطريق التحليلي وتظل وصفة المحاكاة تعمل دون تغيير. ولاحظ 15 / sqrt(10) في المقارنة: فالمتوسطات تتذبذب أقل من السحوبات المفردة، وهو قانون الجذر التربيعي نفسه الذي يحكم اتساع فترات الثقة.

صالح للمحاكاة لا للأسرار

حدّ واحد يستحق الاحترام: فمولّد R الافتراضي (Mersenne Twister) مبني للجودة الإحصائية والسرعة لا للسرية. فمخرجاته حتمية بمعلومية البذرة، ويمكن إعادة بناء حالته الداخلية من مخرجات مرصودة، وهذه عيوب قاتلة لكلمات المرور والرموز وأي شيء ذي صلة بالأمن. أما للمحاكاة والتمهيد الإحصائي والتعليم فهو ممتاز، وأما للتعمية فاستخدم مكتبة مصممة لذلك (كحزمة openssl) ولا تستخدم sample() أو runif() أبدًا.

الخلاصة

  • استدعاء set.seed() مرة واحدة في الأعلى يجعل كل نتيجة "عشوائية" قابلة للتكرار: البذرة نفسها تعطي السحوبات نفسها.
  • تفك البادئات d/p/q/r شفرة مكتبة التوزيعات كلها: سحبة عشوائية، وكثافة، واحتمال تراكمي، ومئين.
  • تغطي rnorm(n, mean, sd) وrunif(n, min, max) وrbinom(n, size, prob) وrpois(n, lambda) معظم احتياجات المحاكاة.
  • تسحب sample() من قيمك أنت: ‏replace = TRUE للنرد، والافتراضي لأوراق اللعب، وبلا size للخلط، وتعاين df[sample(nrow(df), k), ] الصفوف.
  • مونت كارلو = دالة تجربة واحدة + replicate() + mean()، وهي الوصفة التي تجيب عن أسئلة الاحتمال التي يصعب على الرياضيات بلوغها بسهولة.
  • مولّد R للمحاكاة لا للتعمية.

في المستند التالي: التنقيح، أي ما تعنيه رسائل خطأ R فعلًا وكيف تقرأ تتبع الاستدعاءات.

الأسئلة الشائعة

ماذا تفعل set.seed() في R؟

تثبّت نقطة انطلاق مولّد الأعداد العشوائية في R، فتخرج السحوبات "العشوائية" التالية متطابقة في كل تشغيل. استدعِها مرة واحدة في أعلى أي سكربت يستخدم العشوائية، مثل set.seed(42)، فتصبح محاكاتك قابلة للتكرار: إذ يرى الزملاء والمصححون وأنت في المستقبل الأرقام نفسها.

كيف تولّد أعدادًا عشوائية في R؟

اختر التوزيع: ‏rnorm(n, mean, sd) للسحوبات الطبيعية، وrunif(n, min, max) للمنتظمة، وrbinom(n, size, prob) لأعداد النجاحات، وrpois(n, lambda) لأعداد الأحداث. وللمعاينة من قيم موجودة استخدم sample(x, size).

ما الفرق بين rnorm وdnorm وpnorm وqnorm؟

توزيع واحد وأربع بادئات: تسحب r قيمًا عشوائية، وتعطي d ارتفاع منحنى الكثافة، وتعطي p الاحتمال التراكمي P(X ≤ x)، وq هي معكوسها، أي القيمة عند مئين معين. وتعمل البادئات الأربع نفسها مع كل توزيع يعرفه R: ‏runif/dunif/punif/qunif، وrbinom/dbinom/pbinom/qbinom، وهكذا.

كيف تأخذ عينة عشوائية من صفوف data frame في R؟

افهرس الصفوف بـ sample(): تختار df[sample(nrow(df), 5), ] خمسة صفوف دون إرجاع. وأضف replace = TRUE للمعاينة مع الإرجاع، وهي الحركة الكامنة خلف التمهيد الإحصائي.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن