Pengantar Bootstrapping dalam R

Dalam statistik, kita sering ingin melakukan resampling untuk menguji keakuratan estimasi sampel kita. Ini disebut bootstrapping—sebuah tes yang didasarkan pada pengambilan sampel acak berulang denganpengembalian (replacement). Dalam pembelajaran kali ini, kita akan:

  1. menghasilkan 1000 sampel acak baru dari sebuah vektor (dengan pengembalian),

  2. menghitung estimasi tertentu (misalnya, mean, median, dll.) untuk setiap sampel tersebut, dan

  3. menghitung standar deviasi dari distribusi estimasi tersebut.

Dataset

Kita akan membuat sebuah vektor berisi angka yang terdistribusi secara normal dengan nama myData.

Membuat Distribusi Normal Acak Menggunakan rnorm()

Fungsi rnorm() memungkinkan kita untuk menghasilkan urutan angka acak dari distribusi normal hipotetisdengan rata-rata (mean) 20 dan standar deviasi 4.5. Di sini, kita memilih untuk menghasilkan 2000 observasi.

set.seed(300) # Setting the seed for replication purposes
myData <- rnorm(2000,20,4.5) # Creating a random normal distribution (n=300, mean=20, sd=4.5)

Penjelasan:

Melakukan Pemeriksaan Awal (Sanity Checks) pada myDataMenggunakan length(), mean(), dan sd()

Untuk memastikan bahwa vektor myData telah dibuat dengan benar, kita memverifikasi bahwa:

  1. Terdapat 2000 observasi (menggunakan length()),

  2. Nilai rata-rata (mean) mendekati 20 (menggunakan mean()), dan

  3. Standar deviasi mendekati 4.5 (menggunakan sd()).

Catatan: Kita tidak seharusnya mengharapkan mean dan standar deviasi memiliki nilai yang persis samadengan yang kita masukkan ke dalam rnorm(), karena ada unsur acak yang terlibat saat menggunakan fungsiini (rnorm menghasilkan distribusi normal acak di sekitar mean dan standar deviasi yang diberikan).

length(myData) # How many observations?
## [1] 2000

length(myData) menghitung jumlah observasi dalam vektor myData. Harusnya menghasilkan 2000 karena kitamembuat 2000 observasi.

mean(myData) # What is the mean?
## [1] 20.25773

mean(myData) menghitung rata-rata dari vektor myData. Harusnya mendekati 20 karena kita menetapkanmean = 20 saat membuat data.

sd(myData) # What is the standard deviation?
## [1] 4.590852

sd(myData) menghitung standar deviasi dari vektor myData. Harusnya mendekati 4.5 karena kita menetapkanstandar deviasi = 4.5 saat membuat data.

Membuat Grafik untuk myData

Untuk tujuan visual, berikut adalah grafik dari vektor myData. Garis putus-putus merah menunjukkan nilai mean (20.25773) dari distribusi ini.

# Membuat histogram dari myData
hist(myData, breaks = 30, col = "lightblue", main = "Distribusi myData", xlab = "Nilai", ylab = "Frekuensi")
# Menambahkan garis vertikal untuk mean
abline(v = mean(myData), col = "red", lwd = 2, lty = 2)
# Menambahkan legenda
legend("topright", legend = paste("Mean =", round(mean(myData), 5)), col = "red", lty = 2, lwd = 2)

Penjelasan:

2. Bootstrapping Menggunakan Fungsi Dasar R

Apa itu bootstrapping? Bootstrapping adalah metode untuk memperhitungkan ketidakpastian saat kitamengukur estimasi sampel. Dengan menggunakan pengambilan sampel acak dengan pengembalian (randomsampling with replacement), kita menghitung estimasi kita untuk berbagai sampel acak yang diambil dari distribusi asli kita.

Analogi dengan “Mean of Means” pada Dadu Perhatikan kejadian saat menghitung “rata-rata dari rata-rata”(mean of means) untuk lemparan dadu, kita memperkirakan seberapa besar kemungkinan kita akanmengamati estimasi sampel tertentu (misalnya, mean, standar deviasi). Jika kita mengambil sampel ulangsecara acak dari distribusi dasar ini dengan penggantian sejumlah besar kali. Alasan kita mengambil sampelulang dengan penggantian adalah untuk memungkinkan angka-angka tertentu dipilih beberapa kali, yangmenciptakan varians yang lebih besar dalam distribusi yang dihasilkan.

Mengapa Menggunakan Pengembalian (Replacement)? Alasan kita menggunakan pengembalian adalahuntuk memungkinkan angka tertentu dipilih lebih dari satu kali, yang menciptakan variasi yang lebih besardalam distribusi yang dihasilkan.

Langkah-langkah Bootstrapping:

1. Ambil sampel acak dengan pengembalian dari distribusi asli. 2. Hitung estimasi (misalnya, mean, median, standar deviasi) untuk sampel tersebut. 3. Ulangi proses ini berkali-kali (misalnya, 1000 kali) untuk menghasilkan distribusi estimasi. 4. Analisis distribusi estimasi ini untuk memahami variabilitas dan ketidakpastian dari estimasi sampel.

Resampling dari myData Sebanyak 1000 Kali Menggunakan for(i in x) Secara sederhana, yang kita lakukan di sini adalah menghitung mean dari 1000 sampel yang masing-masingterdiri dari 2000 observasi dari myData menggunakan perulangan for(i in x). Mean dari setiap sampel inidisimpan dalam sebuah vektor (bootstrap.results).

Tujuan: Kita tertarik untuk mengukur ketidakpastian dalam distribusi estimasi kita (dalam hal ini, mean). Untukmelakukannya, kita menghitung standar deviasi dari setiap mean yang dihitung menggunakan pengambilansampel acak dengan pengembalian (random sampling with replacement).

set.seed(200) # Setting the seed for replication purposes
sample.size <- 2000 # Sample size
n.samples <- 1000 # Number of bootstrap samples
bootstrap.results <- c()  # Creating an empty vector to hold the results

for (i in 1:n.samples) {
  obs <- sample(1:sample.size, replace=TRUE)
  bootstrap.results[i] <- mean(myData[obs])
}

Penjelasan:

length(bootstrap.results) # Sanity check: this should contain the mean of 1000 different samples
## [1] 1000

length(bootstrap.results) memeriksa panjang vektor bootstrap.results. Harusnya 1000 karena kita mengambil 1000 sampel.

summary(bootstrap.results) # Sanity check
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   19.92   20.19   20.26   20.26   20.33   20.57

summary(bootstrap.results) memberikan ringkasan statistik dari vektor bootstrap.results, termasuk min, max,mean, dan kuartil.

sd(bootstrap.results) # Checking the standard deviation of the distribution of means (this is what we are interested in!)
## [1] 0.1021229

sd(bootstrap.results) menghitung standar deviasi dari distribusi mean yang dihasilkan oleh bootstrapping.

par(mfrow=c(2,1), pin=c(5.8,0.98)) # Combining plots (2 rows, 1 column) and setting the plots size
hist(bootstrap.results, # Creating an histogram
 col="#d83737", # Changing the color
 xlab="Mean", # Giving a label to the x axis
 main=paste("Means of 1000 bootstrap samples from myData")) # Giving a title to the graph
hist(myData, # Creating an histogram
 col="#37aad8", # Changing the color
 xlab="Value", # Giving a label to the x axis
 main=paste("Distribution of myData")) # Giving a title to the graph

Penjelasan:

Pengambilan sampel ulang sebanyak 1000 kali dari prosespembuatan data aktual menggunakan for(i in x) Demikian pula, kita juga dapat mengambil 1000 sampel acak dari proses pembuatan data asli.

set.seed(200) # Setting the seed for replication purposes
sample.size <- 2000 # Sample size
n.samples <- 1000 # Number of bootstrap samples
bootstrap.results <- c() # Creating an empty vector to hold the results
for (i in 1:n.samples)
{
 bootstrap.results[i] <- mean(rnorm(2000,20,4.5)) # Mean of the bootstrap sample
 }

Penjelasan:

length(bootstrap.results) # Sanity check: this should contain the mean of 1000 different samples
## [1] 1000

length(bootstrap.results) memeriksa panjang vektor bootstrap.results. Harusnya menghasilkan 1000 karenakita mengambil 1000 sampel bootstrap.

summary(bootstrap.results) # Sanity check
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   19.64   19.93   20.00   20.00   20.07   20.32

summary(bootstrap.results) memberikan ringkasan statistik dari vektor bootstrap.results, termasuk nilai minimum, kuartil pertama (Q1), median (Q2), mean, kuartil ketiga (Q3), dan nilai maksimum. Ini membantu kitamemahami distribusi dari mean yang dihasilkan oleh bootstrapping.

sd(bootstrap.results) # Checking the standard deviation of the distribution of means (this is what we are interested in!)
## [1] 0.1041927

sd(bootstrap.results) menghitung standar deviasi dari distribusi mean yang dihasilkan oleh bootstrapping.Standar deviasi ini mengukur variabilitas atau ketidakpastian dari estimasi mean yang kita peroleh melalui bootstrapping.

par(mfrow=c(2,1), pin=c(5.8,0.98)) # Combining plots (2 rows, 1 column) and setting the plots size
hist(bootstrap.results, # Creating an histogram
 col="#d83737", # Changing the color
 xlab="Mean", # Giving a label to the x axis
 main=paste("Means of 1000 bootstrap samples from the DGP")) # Giving a title to the graph
hist(myData, # Creating an histogram
 col="#37aad8", # Changing the color
 xlab="Value", # Giving a label to the x axis
 main=paste("Distribution of myData")) # Giving a title to the graph

Penjelasan:

Exercises

Latihan 1 Tetapkan benih Anda pada angka 150. Hasilkan distribusi normal acak dari 1000 observasi, dengan rata-rata30 dan simpangan baku 2,5. Hitung rata-rata dari 50 sampel dari 1000 observasi dari kumpulan data tersebut.Simpan hasil Anda dalam vektor.

Fungsi yang relevan: set.seed(), rnorm(), for(i in x), sample().

Latihan 2 Hasilkan dua histogram untuk menampilkan secara grafis distribusi rata-rata yang diperoleh dalam Latihan 1 serta nilai dari 1000 observasi dalam kumpulan data asli Anda. Gabungkan histogram ini menjadi satu grafik

keseluruhan.

Fungsi yang relevan: par(), hist().

Answer:

Latihan 1

# Tetapkan seed untuk memastikan hasil konsisten
set.seed(150)

# Buat distribusi normal acak dari 1000 observasi
data <- rnorm(1000, mean = 30, sd = 2.5)

# Membuat vektor kosong untuk menyimpan hasil mean dari setiap sampel
sample_means <- c()

# Mengambil 50 sampel dan menghitung rata-rata setiap sampel
for (i in 1:50) {
  sample_means[i] <- mean(sample(data, size = 1000, replace = TRUE))
}

# Menampilkan hasil
sample_means
##  [1] 29.91217 29.95111 29.88946 29.83869 29.83717 29.96443 29.87997 29.98104
##  [9] 29.88365 29.88761 29.92220 29.88761 29.92020 29.88494 29.90298 29.91531
## [17] 29.87105 29.87878 30.02194 29.94590 29.95923 29.74643 29.92373 29.94112
## [25] 29.83525 30.01097 29.99350 30.06145 29.97009 29.92336 29.84687 29.92258
## [33] 29.91140 29.99878 29.96903 29.90596 29.86557 29.97388 29.96784 29.97746
## [41] 29.87797 30.01480 30.10231 29.91795 29.89808 29.99120 29.93832 29.85962
## [49] 29.90181 29.95929

Latihan 2

# Gabungkan dua histogram dalam satu plot (2 baris, 1 kolom)
par(mfrow = c(2, 1))

# Histogram dari distribusi mean hasil bootstrapping
hist(sample_means, 
     col = "#d83737", 
     main = "Distribusi Rata-rata dari 50 Sampel", 
     xlab = "Mean", 
     breaks = 15)

# Histogram dari data asli
hist(data, 
     col = "#37aad8", 
     main = "Distribusi Data Asli", 
     xlab = "Nilai", 
     breaks = 30)