0Pricing
R Academy · درس

إعادة أخذ العينات بطريقة Bootstrap في R

نفّذ فواصل ثقة بطريقة Bootstrap باستخدام sample() مع الاستبدال

إعادة أخذ العينات بطريقة Bootstrap في R درس مجاني في R Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.

ما هو Bootstrap؟

إن bootstrap أسلوب لإعادة أخذ العينات يقدّر توزيع المعاينة لإحصاء ما، وذلك بإعادة أخذ العينات مع الإرجاع من البيانات المرصودة. ولا يتطلب افتراضات توزيعية؛ فالبيانات نفسها تمثل التوزيع.

set.seed(42)
# Original sample of 20 observations
original_data <- c(14, 18, 11, 13, 6, 8, 2, 17,
                   20, 10, 15, 12, 9, 16, 7, 3,
                   19, 5, 4, 1)
n <- length(original_data)

# One bootstrap resample: sample WITH replacement
bootstrap_sample1 <- sample(original_data, n, replace = TRUE)
print(bootstrap_sample1)
# Contains repeats! Some original values are missing.

mean(original_data)    # original mean
mean(bootstrap_sample1)  # bootstrap mean (different)

توزيع Bootstrap للمتوسط

ولّد العديد من عينات Bootstrap، واحسب الإحصاء على كل منها، ثم اجمع النتائج. يقرّب توزيع Bootstrap توزيع المعاينة للإحصاء.

set.seed(42)
x <- c(14, 18, 11, 13, 6, 8, 2, 17, 20, 10,
        15, 12, 9, 16, 7, 3, 19, 5, 4, 1)
n <- length(x)
B <- 5000  # number of bootstrap replicates

# Bootstrap distribution of the mean
boot_means <- replicate(B, {
  x_star <- sample(x, n, replace = TRUE)
  mean(x_star)
})

cat('Original mean:', mean(x), '\n')
cat('Bootstrap mean:', mean(boot_means), '\n')
cat('Bootstrap SE:', sd(boot_means), '\n')
cat('Theoretical SE:', sd(x)/sqrt(n))

Bootstrap لأي إحصاء

يعمل Bootstrap مع أي إحصاء، مثل الوسيط والارتباط ومعاملات الانحدار والمتوسط المقتطع. ما عليك سوى استبدال mean() بالإحصاء الذي يهمك داخل حلقة replicate.

set.seed(42)
x <- c(2, 4, 6, 8, 10, 12, 100, 1, 3, 5)
# Notice the outlier 100 - makes the mean unreliable
B <- 5000; n <- length(x)

# Bootstrap distribution of the median
boot_medians <- replicate(B, {
  median(sample(x, n, replace = TRUE))
})

# Bootstrap distribution of the trimmed mean (10%)
boot_tmeans <- replicate(B, {
  mean(sample(x, n, replace = TRUE), trim = 0.1)
})

cat('Sample median:', median(x), '\n')
cat('Bootstrap SE of median:', sd(boot_medians), '\n')
cat('Bootstrap SE of trimmed mean:', sd(boot_tmeans))

فترات الثقة بطريقة Bootstrap: طريقة المئينات

أبسط فترة ثقة بطريقة Bootstrap هي أخذ الكمّيات من توزيع Bootstrap. تستخدم فترة الثقة 95% المئينين 2.5 و97.5. وهي سريعة وبديهية، لكنها قد تواجه مشكلات في التغطية مع الإحصاءات المنحرفة.

set.seed(42)
x <- rnorm(30, mean = 5, sd = 2)
B <- 5000; n <- length(x)

# Bootstrap CI for the mean
boot_means <- replicate(B, mean(sample(x, n, replace = TRUE)))

# Percentile CI
ci_percentile <- quantile(boot_means, c(0.025, 0.975))
cat('Percentile CI:', round(ci_percentile, 3), '\n')

# For comparison: t-interval (parametric)
t_ci <- mean(x) + qt(c(0.025, 0.975), df = n-1) * sd(x)/sqrt(n)
cat('t-interval CI:', round(t_ci, 3), '\n')

cat('True mean: 5')

الخطأ المعياري بطريقة Bootstrap

الخطأ المعياري بطريقة Bootstrap هو ببساطة sd(boot_statistics). وهو يقدّر مقدار تغير الإحصاء عبر العينات المتكررة من المجتمع، من دون افتراضات توزيعية.

set.seed(42)
# Bootstrap SE for the ratio of two means
group_a <- rnorm(20, mean = 10, sd = 2)
group_b <- rnorm(20, mean = 8, sd = 2)
all_data <- data.frame(
  value = c(group_a, group_b),
  group = rep(c('A', 'B'), each = 20)
)

B <- 4000; n <- nrow(all_data)
boot_ratio <- replicate(B, {
  idx <- sample(1:n, n, replace = TRUE)
  d <- all_data[idx, ]
  mean(d$value[d$group == 'A']) /
    mean(d$value[d$group == 'B'])
})

cat('Observed ratio:', mean(group_a)/mean(group_b), '\n')
cat('Bootstrap SE:', round(sd(boot_ratio), 4), '\n')
cat('95% CI:', round(quantile(boot_ratio, c(.025,.975)), 3))

فترة الثقة BCa

تُعد فترة الثقة BCa (المصححة للانحياز والمُعجّلة) أدق من فترة الثقة بطريقة المئينات، خصوصًا للإحصاءات المنحرفة أو المتحيزة. فهي تصحح الانحياز والالتواء في توزيع Bootstrap.

# BCa CI implementation
bca_ci <- function(data, stat_fn, B = 2000, alpha = 0.05) {
  n <- length(data)
  theta_hat <- stat_fn(data)
  # Bootstrap replicates
  boot_vals <- replicate(B, stat_fn(sample(data, n, replace = TRUE)))
  # Bias correction z0
  z0 <- qnorm(mean(boot_vals < theta_hat))
  # Acceleration a (jackknife)
  jk <- sapply(seq_len(n), function(i) stat_fn(data[-i]))
  num <- sum((mean(jk) - jk)^3)
  den <- 6 * (sum((mean(jk) - jk)^2))^(3/2)
  a <- num / den
  # Adjusted quantiles
  z_alpha <- qnorm(c(alpha/2, 1 - alpha/2))
  p_adj <- pnorm(z0 + (z0 + z_alpha) / (1 - a * (z0 + z_alpha)))
  quantile(boot_vals, p_adj)
}

set.seed(42)
x <- rexp(25, rate = 0.5)  # skewed distribution
bca_ci(x, median)

Bootstrap للانحدار

أنشئ فترات ثقة Bootstrap للانحدار بإعادة أخذ صفوف إطار البيانات. ويتعامل ذلك مع الأخطاء غير الطبيعية، ويعطي استدلالًا صالحًا من دون افتراض التوزيع الطبيعي.

set.seed(42)
n <- 40
x <- runif(n, 0, 10)
y <- 2 + 1.5 * x + rnorm(n, sd = 2)
df <- data.frame(x = x, y = y)
B <- 3000

# Bootstrap the slope coefficient
boot_slopes <- replicate(B, {
  idx <- sample(1:n, n, replace = TRUE)
  d_boot <- df[idx, ]
  coef(lm(y ~ x, data = d_boot))[2]
})

cat('OLS slope:', round(coef(lm(y~x, data=df))[2], 3), '\n')
cat('Bootstrap SE of slope:', round(sd(boot_slopes), 4), '\n')
cat('Bootstrap 95% CI:', round(quantile(boot_slopes, c(.025,.975)), 3))

عدد تكرارات Bootstrap

كم تكرار Bootstrap تحتاج إليه B؟ للأخطاء المعيارية: B=200-500. لفترات الثقة بطريقة المئينات: B=1000-2000. لفترات الثقة BCa: B=2000-5000. الزيادة أفضل دائمًا، لكن عوائدها تتناقص بعد 10,000.

set.seed(42)
x <- rnorm(50, mean = 3, sd = 1)
B_values <- c(100, 500, 1000, 2000, 5000, 10000)

# See how CI width varies with B
results <- sapply(B_values, function(B) {
  boot_m <- replicate(B, mean(sample(x, length(x), replace = TRUE)))
  q <- quantile(boot_m, c(0.025, 0.975))
  q[2] - q[1]  # CI width
})

result_df <- data.frame(B = B_values, ci_width = round(results, 4))
print(result_df)
# CI width stabilizes as B increases

Bootstrap المزدوج

في مسائل العينتين، أعد أخذ أزواج (x, y) معًا، لا x وy بشكل مستقل. يحافظ ذلك على بنية الاعتماد داخل الزوج، ويعطي فترات ثقة صالحة للارتباط والفروق المزدوجة.

set.seed(42)
# Paired data: before/after treatment
before <- c(10, 12, 8, 15, 11, 9, 14, 13)
after  <- c(12, 14, 9, 16, 11, 10, 15, 12)
n <- length(before)
B <- 4000

# Bootstrap paired mean difference
boot_diff <- replicate(B, {
  idx <- sample(1:n, n, replace = TRUE)
  mean(after[idx] - before[idx])
})

observed_diff <- mean(after - before)
cat('Observed mean diff:', observed_diff, '\n')
cat('Bootstrap SE:', round(sd(boot_diff), 4), '\n')
cat('95% CI:', round(quantile(boot_diff, c(0.025, 0.975)), 3))

اختبار الفرضيات بطريقة Bootstrap

يمكن استخدام Bootstrap أيضًا لاختبار الفرضيات. لاختبار H₀: θ=θ₀، ولّد توزيع الفرضية الصفرية بإزاحة عينات Bootstrap أو إعادة تمركزها، ثم احسب قيمة p بوصفها نسبة القيم التي تتجاوز الإحصاء المرصود.

set.seed(42)
# Test H0: mean = 0 vs H1: mean != 0
x <- rnorm(30, mean = 0.5, sd = 2)
theta0 <- 0  # null hypothesis
observed_t <- (mean(x) - theta0) / (sd(x) / sqrt(length(x)))

B <- 5000; n <- length(x)
# Shift x to have mean = theta0 under H0
x_centered <- x - mean(x) + theta0

boot_t <- replicate(B, {
  x_star <- sample(x_centered, n, replace = TRUE)
  (mean(x_star) - theta0) / (sd(x_star) / sqrt(n))
})

p_value <- mean(abs(boot_t) >= abs(observed_t))
cat('Observed t:', round(observed_t, 3), '\n')
cat('Bootstrap p-value:', round(p_value, 4))

نظرة عامة على حزمة Boot

توفر الحزمة boot الدالة boot(data, statistic, R) مع ميزات متقدمة، مثل فترات الثقة BCa عبر boot.ci()، والحوسبة المتوازية، وأخذ العينات الطبقية. وتتلقى دالة statistic البيانات ومتجه فهارس.

# library(boot)  # uncomment to use

# The boot() statistic function signature:
# statistic(data, indices) -> scalar or vector

# Example (conceptual - requires boot package):
# mean_stat <- function(data, indices) {
#   mean(data[indices])
# }
# results <- boot(data = x, statistic = mean_stat, R = 5000)
# boot.ci(results, type = c('perc', 'bca'))  # CIs
# plot(results)  # histogram of bootstrap distribution

# Manual equivalent:
set.seed(42)
x <- rnorm(30, mean = 5)
B <- 2000
boot_vals <- replicate(B, mean(sample(x, length(x), replace = TRUE)))
quantile(boot_vals, c(0.025, 0.975))

تحقق سريع

اختبر مدى فهمك لإعادة أخذ عينات Bootstrap في R.

مراجعة: إعادة أخذ عينات Bootstrap

أهم النقاط: تعيد Bootstrap أخذ عينات البيانات مع الإرجاع باستخدام sample(x, n, replace=TRUE). استخدم replicate(B, ...) لتوليد B من إحصاءات Bootstrap. يعطي sd(boot_stats) الخطأ المعياري لـ Bootstrap. وفترة الثقة بطريقة المئينات هي: quantile(boot_stats, c(0.025, 0.975)). استخدم B≥2000 لفترات الثقة. وتضيف الحزمة boot فترات الثقة BCa والحوسبة المتوازية. تعمل Bootstrap مع أي إحصاء من دون افتراضات توزيعية.

set.seed(42)
x <- c(3, 5, 7, 2, 9, 4, 6, 8, 1, 10)
n <- length(x); B <- 3000

# Generic bootstrap template:
boot_stat <- replicate(B, {
  x_star <- sample(x, n, replace = TRUE)
  median(x_star)  # replace with any statistic
})

# Summary
cat('Original median:', median(x), '\n')
cat('Bootstrap SE:', round(sd(boot_stat), 3), '\n')
ci <- quantile(boot_stat, c(0.025, 0.975))
cat('95% Percentile CI: [', ci[1], ',', ci[2], ']')

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

هل درس «إعادة أخذ العينات بطريقة Bootstrap في R» مجاني؟

نعم — نص درس «إعادة أخذ العينات بطريقة Bootstrap في R» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.

ماذا ستتعلم في «إعادة أخذ العينات بطريقة Bootstrap في R»؟

نفّذ فواصل ثقة بطريقة Bootstrap باستخدام sample() مع الاستبدال تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟

لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «إعادة أخذ العينات بطريقة Bootstrap في R»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟

نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. set.seed() وقابلية إعادة الإنتاج
  2. توليد التوزيعات العشوائية
  3. أساسيات محاكاة مونت كارلو
  4. إعادة أخذ العينات بطريقة Bootstrap في R
← العودة إلى R Academy