0Pricing
R Academy · บทเรียน

การสุ่มตัวอย่างแบบบูตสแตรปใน R

สร้างช่วงความเชื่อมั่นแบบบูตสแตรปโดยใช้ sample() แบบสุ่มคืนที่

การสุ่มตัวอย่างแบบบูตสแตรปใน R เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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() ด้วยสถิติที่สนใจในลูปการทำซ้ำ

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 (Bias-Corrected and Accelerated) มีความแม่นยำมากกว่าช่วงความเชื่อมั่นแบบเปอร์เซ็นไทล์ โดยเฉพาะเมื่อสถิติมีความเบ้หรือมีอคติ วิธีนี้ปรับแก้อคติและความเบ้ในการแจกแจง 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, ...) เพื่อสร้างสถิติ bootstrap จำนวน B ค่า sd(boot_stats) ให้ค่า SE ของ 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], ']')

คำถามที่พบบ่อย

บทเรียน “การสุ่มตัวอย่างแบบบูตสแตรปใน R” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การสุ่มตัวอย่างแบบบูตสแตรปใน R” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การสุ่มตัวอย่างแบบบูตสแตรปใน R”

สร้างช่วงความเชื่อมั่นแบบบูตสแตรปโดยใช้ sample() แบบสุ่มคืนที่ คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การสุ่มตัวอย่างแบบบูตสแตรปใน R” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม

ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. set.seed() และการทำซ้ำผลลัพธ์ได้
  2. การสร้างการแจกแจงแบบสุ่ม
  3. พื้นฐานการจำลองแบบมอนติคาร์โล
  4. การสุ่มตัวอย่างแบบบูตสแตรปใน R
← กลับไปที่ R Academy